ToB企服应用市场:ToB评测及商务社交产业平台

标题: Web安全基础 - Upload Labs [打印本页]

作者: 鼠扑    时间: 2022-11-25 10:59
标题: Web安全基础 - Upload Labs
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命令如下:
  1. docker pull c0ny1/upload-labs
  2. docker images
  3. docker run -dt --name UploadLabs -p 11208:80  c0ny1/upload-labs
  4. docker ps
复制代码
不要在http://127.0.0.1:11208/进行实验,不然BS默认抓不了本地包。在命令行中使用ipconfig指令查看虚拟网卡进行实验。

Pass 1 js前端验证

刚开始上传文件会提示要创建../upload文件夹
在docker中创建
  1. docker exec -it UploadLabs(自己的容器名) /bin/bash
  2. mkdir ./upload
  3. 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等文件内容统一。
  1. [/code][img]https://img2022.cnblogs.com/blog/2860856/202211/2860856-20221124095014359-1940499895.png[/img]
  2. [size=5]Pass 2 MIME检测[/size]
  3. [indent]MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。
  4. [/indent]其实对应的就是请求包中的Content-Type字段:
  5. BurpSuite抓包将Content-Type: application/octet-stream 改成 image/jpeg 就好。
  6. 其他操作相同不再赘述。
  7. [size=5]Pass 3 黑名单-php别名[/size]
  8. 提示写到:本pass禁止上传.asp|.aspx|.php|.jsp后缀文件!
  9. 因为这次检测不在客户端实现,所以只能另找方法绕过。
  10. [indent][list=1]
  11. [*]通过使用可被执行但不常见的后缀名,比如 php5,shtml等等
  12. [*]上传恶意的配置文件(Apache .htaccess) 欺骗服务器将任意自定义文件扩展名映射到可知执行的MIME类型
  13. [*]利用后端解析差异[list=1]
  14. [*]添加尾随字符,一些组件会去除或忽略尾随空格、点等:exploit.php. /exploit.php+空格
  15. [*]对点,斜杠 使用URL 编码, 如果验证文件扩展名时没有解码,在服务端被解码,绕过黑名单限制, exploit%2Ephp
  16. [*]在文件扩展名前添加分号或 URL 编码的空字节字符。如果验证是用 PHP 或 Java 等高级语言编写的,但服务器使用 C/C++ 中的低级函数处理文件,例如,这可能会导致文件名结尾出现差异:exploit.asp;.jpg或exploit.asp%00.jpg
  17. [/list]
  18. [/list][/indent]首先尝试上传eval.php5木马(内容同前),发现连接失败,查看源码的这一行
  19. [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
  1. 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
  1. auto_prepend_file=eval.jpg
复制代码
再上传eval.jpg
然后连接/upload/readme.php文件,会首先包含eval.jpg,得到shell
Pass 6-10 黑名单-Windows其他常见绕过

Pass 6 大小写绕过
  1. $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
  1. 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()绕过,最后是白名单检测
数组检测绕过基于下列代码
  1. doughnuts > connect http://192.168.123.196/UploadLabs/include.php/?file=upload/1020221124175834.jpg POST cmd
复制代码
如果save_name不为空,会取得save_name参数,而下列代码会根据数组的内容进行检测和保存
  1. $info = getimagesize($filename);
  2. $ext = image_type_to_extension($info[2]);
复制代码
设置save_name数组如下$file[count($file) - 1]就是save_name[1],为空。
因为windows平台的特性,自动保存为eval.php


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4