Upload Labs
实验来自于https://github.com/c0ny1/upload-labs
环境搭建
phpstudy 推荐
https://blog.csdn.net/A1956936030/article/details/109455651
推荐使用phpstudy来搭建环境,因为很多实验都基于了windows平台的特性,并且dockerhub上的实验版本有点老,只有20关。
docker 不推荐
Docker Desktop的安装不再赘述。
使用的docker命令如下:- docker pull c0ny1/upload-labs
- docker images
- docker run -dt --name UploadLabs -p 11208:80 c0ny1/upload-labs
- docker ps
复制代码 不要在http://127.0.0.1:11208/进行实验,不然BS默认抓不了本地包。在命令行中使用ipconfig指令查看虚拟网卡进行实验。
Pass 1 js前端验证
刚开始上传文件会提示要创建../upload文件夹
在docker中创建- docker exec -it UploadLabs(自己的容器名) /bin/bash
- mkdir ./upload
- chown www-data:www-data upload/ //文件夹所属组默认为root
复制代码在Chrome中配置Proxy SwitchyOmega插件可以很方便地进行BS抓包
F12查看源代码可以发现checkFIle在前端进行文件名检验
动态修改
根据Js的特性我们打开控制台,利用monkey patch的思路修改该前端验证函数
这下就没有验证限制了
停用Js
在开发者工具下Ctrl + Shitf + P
也可以取消验证限制
BurpSuite 抓包
因为是前端验证,我们先修改一句话木马的后缀名过掉验证,再抓包修改修改后缀名也可以过掉验证。
这里使用doughnuts作为webshell管理器
https://doughnuts3.gitbook.io/doughnuts/ru-men
一句话木马如下,如果无特殊说明eval.php,eval.PHP,eval.jpg等文件内容统一。- [/code][img]https://img2022.cnblogs.com/blog/2860856/202211/2860856-20221124095014359-1940499895.png[/img]
- [size=5]Pass 2 MIME检测[/size]
- [indent]MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。
- [/indent]其实对应的就是请求包中的Content-Type字段:
- BurpSuite抓包将Content-Type: application/octet-stream 改成 image/jpeg 就好。
- 其他操作相同不再赘述。
- [size=5]Pass 3 黑名单-php别名[/size]
- 提示写到:本pass禁止上传.asp|.aspx|.php|.jsp后缀文件!
- 因为这次检测不在客户端实现,所以只能另找方法绕过。
- [indent][list=1]
- [*]通过使用可被执行但不常见的后缀名,比如 php5,shtml等等
- [*]上传恶意的配置文件(Apache .htaccess) 欺骗服务器将任意自定义文件扩展名映射到可知执行的MIME类型
- [*]利用后端解析差异[list=1]
- [*]添加尾随字符,一些组件会去除或忽略尾随空格、点等:exploit.php. /exploit.php+空格
- [*]对点,斜杠 使用URL 编码, 如果验证文件扩展名时没有解码,在服务端被解码,绕过黑名单限制, exploit%2Ephp
- [*]在文件扩展名前添加分号或 URL 编码的空字节字符。如果验证是用 PHP 或 Java 等高级语言编写的,但服务器使用 C/C++ 中的低级函数处理文件,例如,这可能会导致文件名结尾出现差异:exploit.asp;.jpg或exploit.asp%00.jpg
- [/list]
- [/list][/indent]首先尝试上传eval.php5木马(内容同前),发现连接失败,查看源码的这一行
- [code]$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
复制代码 发现存储位置发生了变化,虽然是随机的文件名,但是存在前端回显,右键选择在新标签页打开可以看到文件路径。
再次连接,文件没有被解析,连接失败,说明apache没有设置对php5别名的解析。
更换思路,上传.htaccess文件更改MIME映射,但是.htaccess同样会生成随机数前缀
看其他人的感觉也没有其他思路了,最后还是要修改apache配置?
Pass 4 黑名单-.htaccess
提示写到:本pass禁止上传.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.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后缀文件!
可以发现黑名单里面没有.htaccess
我们上传自己的.htaccess- SetHandler application/x-httpd-php
复制代码 这个文件会使服务器将所有文件都以php类型的MIME解释
然后上传eval.jpg,连接
Pass 5 黑名单-.user.ini
提示写到:上传目录存在php文件(readme.php)
这里必须要Windows环境了(前几个都是用的docker,从这里改phpstudy了,要记得关闭windows defender),要用到.user.ini
.user.ini
自 PHP 5.3.0 起,PHP 支持基于每个目录的 .htaccess 风格的 INI 文件。此类文件仅被 CGI/FastCGI SAPI 处理(正常情况下apache不运行在此模块)。此功能使得 PECL 的 htscanner 扩展作废。如果使用 Apache,则用 .htaccess 文件有同样效果。
.user.ini的配置有auto_prepend_file和auto_append_file等。
利用.user.ini的前提是服务器开启了CGI或者FastCGI,并且上传文件的存储路径下有index.php可执行文件,因为auto_perpend_file的作用相当于在index.php开头添加require(xxx)。使用这个的同时也利用了文件包含漏洞。
先切换Ngnix,上传.user.ini- auto_prepend_file=eval.jpg
复制代码 再上传eval.jpg
然后连接/upload/readme.php文件,会首先包含eval.jpg,得到shell
Pass 6-10 黑名单-Windows其他常见绕过
Pass 6 大小写绕过
- $file_ext = strtolower($file_ext); //转换为小写
复制代码 相比Pass 5 来说第6关js代码少了这一行。因为windows的文件系统对大小写不敏感,因此可以使用PHP,PHp等来绕过。
上传eval.PHP
Pass 7-8 点/空格后缀绕过
上传eval.php抓包后修改为eval.php_(空格)或者eval.php.等。在windows存储到文件系统的时候会自动去掉我们加上的后缀。
Pass 7 上传eval.php_
Pass 8 上传eval.php.
<blockquote>
补充一个查资料时看到的方法
利用PHP和Windows环境的叠加特性,以下符号在正则匹配时的相等性,此方法需要上传两次
双引号" = 点号.
大于符号> = 问号?
小于符号< = 星号*
1. 先抓包上传一个名为eval.php:.jpg的文件,上传成功后会生成eval.php的空文件
2. 然后将木马文件名改为eval. connect http://192.168.123.196/UploadLabs/include.php/?file=upload/1020221124175834.jpg POST cmd[/code]成功连接
Pass 15 文件头检测-2
- copy a.jpg/b+eval.php eval.jpg
复制代码 区别在于利用库函数还是自己实现文件头的检测,不过Pass 14只检测文件头没有检测拓展名,Pass 15就必须要文件头和格式对应了。
Pass 16 文件头检测-3
exif_imagetype读取一个图像的第一个字节并检查其签名,如果发现恰当的签名返回一个对应的常量,否则返回false。返回值和getimagesize()返回值的数组中的索引2的值是一样的,效率比getimagesize更快,返回信息更少。
因此和前面的做法相同。
Pass 17 二次渲染
二次渲染也就是后端在存储文件之前对文件进行了修改,因此如果我们的一句话木马在被修改区域的话就会失效。
使用010editor的文件比较功能,在原文件中找到能够存放一句话木马的不变区域即可。
文件太小可能不是很容易找不变区域。不过在图片中间插入多半就不能正常显示了(
这里上传jpg可能不太好找(也有可能是我的文件的问题),可以试试上传gif
Pass 18-19 条件竞争
Pass 18 条件竞争-1
这关的特点是先存储了文件再进行文件验证,因此只要卡在文件存储和验证之间进行访问,就可以绕过检测。
条件竞争属于并发产生的逻辑漏洞。
这里使用BurpSuite,先抓包再转发到Intruder,清除payload标记,设置payload类型为Null Payloads,选择Continue indefinitely选项
在Resouce Pool设置线程数为100,开始攻击。
慢慢卡是能卡出来的(
Pass 19 条件竞争-2
和上一关类似,不过这关的引导不是很好,要上传图片马利用文件包含,而且路径设置不太对。
Pass 20-21 保存
Pass 20 保存-黑名单
思路其实和之前的黑名单一样
利用._后缀绕过,PHP和windows混合环境或者%00(注意版本)进行截断
额外的一种思路是对于move_uploaded_file(),这个函数保存文件时会忽略末尾的/.
上传文件:eval.php
保存文件名:eval.php/.(访问时访问eval.php即可)
Pass 21 保存-白名单&数组
先检测MIME,再进行数组检测,move_uploaded_file()绕过,最后是白名单检测
数组检测绕过基于下列代码- doughnuts > connect http://192.168.123.196/UploadLabs/include.php/?file=upload/1020221124175834.jpg POST cmd
复制代码 如果save_name不为空,会取得save_name参数,而下列代码会根据数组的内容进行检测和保存- $info = getimagesize($filename);
- $ext = image_type_to_extension($info[2]);
复制代码 设置save_name数组如下$file[count($file) - 1]就是save_name[1],为空。
因为windows平台的特性,自动保存为eval.php
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |