测试过程
1、创建一个php文件
2、内容为
:::info
攻击语句:
:::
3、上传对应php文件,访问对应文件所在路径
4、使用中国蚁剑进行链接
upload-labs总结
https://www.freebuf.com/articles/web/385709.html
upload-labs通关攻略(全) - 清茶先生 - 博客园
https://blog.csdn.net/weixin_47598409/article/details/115050869
前端校验
对文件后缀进行校验
1、先上传png后缀,用burp抓包改成php后缀,访问图片路径
2、禁用前端javascript
MIME校验
两种方法:第一种是上传php文件,改Content-Type,第二种是上传合法后缀文件,改文件后缀。
法一:
改Content-Type:改为图片格式,image/png image/jpeg
法二:更改文件后缀
上传png文件,用burp改成图片后缀,png,jpg等
黑名单
apache http配置改成
黑名单策略---在服务器上不允许特定后缀的文件上传(PHP, asp, jsp)
php环境可以尝试的后缀php1,php2,php3,php4.php5,phtmI, pht
修改Apache http配置,添加
:::info
AddType application/x-httpd-php .php3 .php4 .phtml .phps .php5 .pht
:::
访问,链接
特殊字符::$DATA绕过
在url把::$DATA去掉
.htaccess
这一关我们可以看到禁止上传文件可太多了,几乎完全屏蔽
源码黑名单
:::info
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".ini");
:::
1.但是.htaccess还是没有过滤,可以重写文件解析规则绕过,上传一个.htaccess,这个文件内容的意思是告诉apache当遇到qianxun.jpg文件时,按照php去解析,文件内容如下:
<FilesMatch "xxx.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
我们再创建一个php测试文件xxx.php
分别将.htaccess文件和xxx.jpg文件上传
AddType application/x-httpd-php .jpg
用浏览器访问xxx.jpg:
如图所示,xxx.jpg被成功解析
删除末尾的点
这一关的思路是它没有循环验证,也就是说这些收尾去空,删除末尾的点,在数据包中把后缀名改为.php. .
大小写
改成全大写,或个别大小写 Php PhP
空格绕过
文件后缀后面加空格
文件后缀加点
php.
双写
.ppphp
白名单
get%00截断
apache版本调至5.2.17
magic_quotes_gpc=off (php.ini)
前提url路径可控,你可以修改上传路径,
上传s1.php文件,将路径改成s1.php%00,
filename改成s1.png
把后面截断的去掉
post%00截断
apache版本调至5.2.17
magic_quotes_gpc=off (php.ini)
前提请求体路径可控,你可以修改上传路径,
这一关白名单,文件上传路径拼接生成,而且使用了post发送的数据进行拼接,我们可以控制post数据进行0x00截断绕过白名单
补充知识:POST不会对里面的数据自动解码,需要在Hex中修改。
在<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">../upload/</font>
路径下加上<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">s1.php+</font>
<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">+号</font>
是为了方便后面修改<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">Hex</font>
切换hex,寻找<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">+号</font>
的Hex是<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">2b</font>
,这里我们要把它改为<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">00</font>
放出请求,删除后面截断的内容
图片马
1、前提要结合文件包含才能用图片马
这一关会读取判断上传文件的前两个字节,判断上传文件类型,并且后端会根据判断得到的文件类型重命名上传文件
1.Png图片文件包括8字节:89 50 4E 47 0D 0A 1A 0A。即为 .PNG。
2.Jpg图片文件包括2字节:FF D8。
3.Gif图片文件包括6字节:47 49 46 38 39|37 61 。即为 GIF89(7)a。
4.Bmp图片文件包括2字节:42 4D。即为 BM。
<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">cmd</font>
使用<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">copy 77.png/b + s1.php pass14.png</font>
制作<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">图片马</font>
,上传图片马
或者
在文件头部添加图片格式:
GIF的文件头为GIF89a,png的文件头为PNG。
改成png格式或gif,上传
用文件包含漏洞
:::info
http://127.0.0.1/upload-labs/include.php?file=upload/2320250109221923.gif
:::
2、使用010edit比较上传后两个文件的不同,把攻击语句粘贴到不会删除的位置
比较文件点击match,插入
结合文件包含,include.php?file=upload/1099891432.gif
条件竞争
由于文件上传到后端才判断文件后缀是否符合条件后缀,符合就通过,不符合就删除。
使用move_uploaded_file()函数,将上传的文件保存到服务器,再进行判断是否是jpg、png、gif中的一种类型,如果在数组中就保存重命名,如果不在根据unlink()就直接删除
代码他是先将图片上传上去,才开始进行判断后缀名、二次渲染。如果在上传上去的一瞬间访问这个文件,那他就不能对这个文件删除、二次渲染。这就相当于我们打开了一个文件,然后再去删除这个文件,就会提示这个文件在另一程序中打开无法删除。
解决方式:
使用burp一直发请求上传php文件,然后去浏览器访问图片,让它反应不过来
上传php文件
php文件内容为
fputs(fopen('Tony.php','w'),'');?>
发给intruder,不断上传
使用python写一段脚本不断访问创建的文件
http://127.0.0.1/upload-labs/upload/cjTom.php
import requests
url = "http://127.0.0.1/upload-labs/upload/cjTom.php"
while True:
html = requests.get(url)
if html.status_code == 200:
print("OK")
break
再去访问创建的文件
http://127.0.0.1/upload-labs/upload/Tony.php,使用蚁剑链接
上传图片马
上传图片马
');?>
使用python捕捉
import requests
url = "http://127.0.0.1/upload-labs/include.php?file=upload/221.gif"
while True:
html = requests.get(url)
if html.status_code == 200:
print("OK")
break
当出现<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">OK</font>
说明访问到了该文件,那么<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">Tony.php</font>
应该也创建成功了,用蚁剑连一下试试。
这里注意一下蚁剑连接的<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">URL</font>
为<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">http://xxx.xxx.xxx.xxx/upload-labs/Tony.php</font>
对文件名做判断
没有对上传的文件做判断,只对用户输入的文件名做判断
后缀名黑名单
上传的文件名用户可控
黑名单用于用户输入的文件后缀名进行判断
move_uploaded_file()还有这么一个特性,会忽略掉文件末尾的<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">/.</font>
先准备PHP一句话木马,并把后缀名改为PNG再上传
访问图片