一个网络安全学习爱好者在学习过程中记录下的笔记,希望在CSDN能和大家一起成长,学习,分享,进步,下面分享的是代码审计中文件上传、目录遍历、文件包含、任意文件读取、删除的案例,希望对入门网安的朋友们有所帮助,大神有兴趣看看即可,勿喷感谢,同时也欢迎各位师傅私聊交流学习。文章有所参考,也感谢教授我网安知识的师父们,感谢出生在这个互联网时代,知识触手可及。
文件上传
原理:攻击者上传的脚本文件被web应用解析并执行,通常是一个webshell,文件上传本身没问题,主要在于服务器怎么去处理。
文件上传的控制点:
Content-Length:上传内容大小
MAX_FILE_SIZE:上传内容最大长度
filename:文件名
Content-Type:文件类型
上传路径等
挖掘思路:
全局搜索上传函数,寻找上传点
案例:
upload.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" name="upload" value="点击上传">
</form>
</body>
</html>
upload.php
<?php
header("Content-type:text/html;charset=utf-8");
$upload_dir = "D:\phpStudy\PHPTutorial\WWW\upload";
if(isset($_FILES['file'])) {
$upload_name = $upload_dir."\\".$_FILES['file']['name'];
move_uploaded_file($_FILES['file']['tmp_name'],$upload_name);
echo "Name:".$_FILES['file']['name']."<br >";
echo "Type:".$_FILES['file']['type']."<br >";
echo "Size:".($_FILES['file']['size']/1024)."<br >";
}else{
echo "fail";
}
目录遍历
原理:攻击者能够在web应用所在目录以外文件夹上任意存取文件夹、执行命令或查找数据。
案例:
file文件夹下有1.txt,上一级有2.txt
案例:
<?php
header("Content-type:text/html;charset=utf-8");
if(isset($_GET['file'])){
readfile("file/".$_GET['file']);
}
绕过方式:
1、进行URL编码
.->%2e
->%2f
/->%5c
2、二次URL编码
.->%252e
->%252f
/->%255c
3、16位Unicode编码
.->%u002e
->%u2215
/->%u2216
文件包含
原理:在引入文件时参数名可控导致文件泄露甚至代码注入
相关函数:
include、include_once、require、require_once
本地包含
利用方式:
1、%00截断
2、错误日志文件
案例:
<?php
$file = $_GET['file'];
if(isset($file)){
include ($file);
}
远程包含
allow_url_include = On
包含的文件不能为.php
利用方式:
%00截断
路径长度截断
?伪截断
php://输入输出流:php://filter/read=convert.base64-encode/resource=1.txt
任意文件读取、任意文件删除
任意文件读取
原理:通过提交精心设计的恶意数据可以访问任意文件或者写入任意内容。
挖掘思路:
allow_url_fopen = On
可回溯
相关函数:
fopen、file_get_contents、fread、fgets、fgetss、file、fpassthru、parse_ini_file、readfile
案例:
if(isset($_GET['file'])){
$file = $_GET['file'];//readfile
echo readfile($file);
$fp = fopen($file,"r") or die("fail");//fopen
$data = fread($fp,filesize($file));
fclose($fp);
echo $data;
echo file_get_contents($file);//file_get_contents
}
任意文件删除
案例:
$file = $_GET['file'];
if(file_exists($file)){
unlink($file);
}