文件上传漏洞
0x00 Base
linux
- 大小写严格区分
windows
- 以
.
/[空格]
结尾的文件,windows默认会去除.
/[空格]
::$DATA
后的数据会当作文件流处理
extension | MIME | header |
---|---|---|
jpg | image/jpeg | FFD8FF |
png | image/png | 89504E47 |
gif | image/gif | 47494638 |
copy a.jpg/b(binary) + b.txt/a(ascii) demo.jpg //合成图片马
<html> //一个简单的上传网页
<head><meta charset="utf-8">
<title>上传测试</title></head>
<body>
<form action="" method="post" enctype="multipart/form-data">
<label for="file">文件名:</label>
<input type="file" name="file"><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>
<?php
$tmp_path=$_FILES['file']['tmp_name'];
$name=$_FILES['file']['name'];
if(!$_FILES['file']['error']){
$upload=move_uploaded_file($tmp_path,"upload/$name");
if($upload){
echo '上传成功';
}
}
0x01 00截断
00截断中的00是指ascii(0)这个字符,编码为%00和0x00
- php version<=5.3.4
- magic_quotes_gpc=off(转义特殊字符)
0x02 extension
language | extension |
---|---|
asp | asp,aspx,asa,asax,ascx,ashx,asmx,cer,aSp,aSpx,aSa,aSax,aScx,aShx,aSmx,cEr |
php | php,php5,php4,php3,php2,pHp,pHp5,pHp4,pHp3,pHp2,html,htm,phtml,pht,Html,Htm,pHtml |
jsp | jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp,jSpx,jSpa,jSw,jSv,jSpf,jHtml |
0x03 Image check function
getimagesize(local|url)
:通过文件头检测文件的格式和大小
exif_imagetype(local|url)
{php_exif}:检测格式
- jpg:不知道
- png:前八位字节(
8950 4E47 0D0A 1A0A
) - gif:前四位字节(GIFa)
load image{php_GD}
需声明图片文件 header("content-type:image/jpeg")
- imagecreatefromjpeg(local|url)/imagejpeg($resource,)
- imagecreatefrompng(local|url)/imagepng( $resource,filename)
- imagecreatefromgif(local|url)/imagegif( $resource,filename)
0x04 Webserver
1.IIS 6.0解析漏洞:
.asp
结尾的文件夹,里面任意文件当作asp执行;
截断后面字符
2.IIS 7.0畸形解析漏洞:同nginx
2.Apache
- apache自右向左解析文件,不支持解析的会直接跳过寻找下一个支持的
- %0a(CVE-2017-15715)
- .htaccess:apache的配置文件
SetHandler application/x-httpd-php //将所有文件都当作php执行
3.Nginx
- 畸形解析漏洞:文件后加'/.
', 1.jpg/.php
=1.php
- 未经编码的空格和截至符(/0)—(CVE-2013-4547)