声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!
本文转发于涂寐’s Blogs:https://0xtlu.github.io
0×00 Nginx解析漏洞
0o00 题目提示
Nginx解析漏洞
题目URL:http://106.15.50.112:8020/
提示:flag在网站根目录下
0o01 上传流程
- 直接访问,提供一个上传点,错误上传:
Please ensure you are uploading an image.
;白名单??? - 直接传图片马,前端回显文件路径:
File uploaded successfully: /var/www/html/uploadfiles/xxx.jpg
。 - 重复上传,这……还是根据文件原名重命名的吗???
- 继续,
File uploaded exceeds maximum upload size.
,限大小,png确实比较大。 - 和其他师傅沟通了下,这站点似乎就是不给你看图片的,但直接给图片码进行解析漏洞就好了……但一毛一样的一句话,我咋就不行呢,直接用师傅的又可以,是我合成的方法有问题吗……大佬说,玄学……
- 好了,建国之后不准成精。看下吧,我的图片码和师傅的有啥不同:
- 对的,师傅的 jpg 图里是 png图片的内容,所以……找张小尺寸的 png 图重新生成图片码。
- 蚁剑:
http://106.15.50.112:8020/uploadfiles/xxx.jpg/.php
- 网站根目录拿 flag :
flag{96447a6a5d809890} //-- 2022.1.20
0o02 Nginx解析漏洞
- 漏洞原理:若访问路径为
.../test.png/test1.php
, 当fastcgi
在处理.php
文件时发现文件不存在, 则根据php.ini
配置文件中cgi.fix_pathinfo=1
的配置项选择是否修复路径,即当前路径不存在时则采用上层路径.../test.png
。故,此时交由fastcgi
处理的文件就变成.../test.png
,.../test.png
也将作为.../test.png/test1.php
进行解析,即当作 php 文件解析。 - 注:
php-fpm.conf
中的security.limit_extensions
配置项限制fastcgi
解析文件的类型,即指定某类型文件可作为代码解析。当此项设置为空时,允许fastcgi
将.png
等文件作为代码解析。 - 漏洞成因:php 和 nginx 间的配置问题。
- 漏洞修复:① 将
php.ini
文件中的cgi.fix_pathinfo
设置为0
,取消路径修复功能; ②php-fpm.conf
中的security.limit_extensions
设置为.php
,指定可解析文件类型。
0×00 文件上传01
0o00 题目提示
文件上传01
题目URL:http://106.15.50.112:8024/
提示:flag在网站根目录下
0o01 上传流程
- 找到上传点:
http://106.15.50.112:8024/admin.php
- 直接禁用 js,上传 php 文件,或bp改图片码后缀为 php 。
- 注意,网站根目录
/var
/www/html/
,不是服务器根目录:flag{6687ee3215bbd38a}
。
0×00 文件上传02
0o00 题目提示
文件上传02
题目URL:http://106.15.50.112:8025/
提示:flag在服务器根目录
0o01 上传流程
-
看着首页……总想着是被黑了吗?扫一波目录先(bb,其实可以直接在 URL 上加
~~/upload.php~~
测试,算了还是得多用下目录扫描)。 -
废话太多了,上链接:
http://106.15.50.112:8025/upload.php
。 -
禁 js ,传 php ,没反应。
-
正常点,传个图片,正常显示,拿到图片路径,且图片重命名。
-
测试其他后缀,不行,盲猜白名单,再分析下请求包:
Connection: close ------WebKitFormBoundaryAYlZtBqmFuaASUG6 Content-Disposition: form-data; name="file_path" images/ ------WebKitFormBoundaryAYlZtBqmFuaASUG6 Content-Disposition: form-data; name="upload_file"; filename="php.jpg" Content-Type: image/jpeg �PNG
-
file_path
???images/
???这路径,可以改改吧, -
想了下似乎很符合
%00
截断,回顾下笔记,php version < 5.3.4,而站点的是 5.3.3 -
修改路径:
images/test.php
;在路径后一个字符直接添加并 URL 编码%00
,或 Hex 中直接修改后一个字符的十六进制为00
。 -
通过
%00
截断,上传的图片将被命名为test.php
-
蚁剑连接:
http://106.15.50.112:8025/images/test.php
-
服务器根目录:
flag{c325cb3922a0e48c}