安鸾之文件上传系列
涂寐 Lv5

声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!
本文首发于涂寐’s Blogs:https://0xtlu.github.io,转载请注明出处!

0x00 Nginx解析漏洞

0o00 题目提示

1
2
3
4
5
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确实比较大。
  • 和其他师傅沟通了下,这站点似乎就是不给你看图片的,但直接给图片码进行解析漏洞就好了……但一毛一样的一句话,我咋就不行呢,直接用师傅的又可以,是我合成的方法有问题吗……大佬说,玄学……
  • 好了,建国之后不准成精。看下吧,我的图片码和师傅的有啥不同:

image

  • 对的,师傅的 jpg 图里是 png图片的内容,所以……找张小尺寸的 png 图重新生成图片码。
  • 蚁剑:http://106.15.50.112:8020/uploadfiles/xxx.jpg/.php
  • 网站根目录拿 flag :flag{96447a6a5d809890} //-- 2022.1.20

image

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,指定可解析文件类型。

0x00 文件上传01

0o00 题目提示

1
2
3
4
5
文件上传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}

image

0x00 文件上传02

0o00 题目提示

1
2
3
4
5
文件上传02

题目URL:http://106.15.50.112:8025/

提示:flag在服务器根目录

0o01 上传流程

  • 看着首页……总想着是被黑了吗?扫一波目录先(bb,其实可以直接在 URL 上加 ~~`/upload.php` 测试,算了还是得多用下目录扫描)~~。

  • 废话太多了,上链接:http://106.15.50.112:8025/upload.php

  • 禁 js ,传 php ,没反应。

  • 正常点,传个图片,正常显示,拿到图片路径,且图片重命名。

  • 测试其他后缀,不行,盲猜白名单,再分析下请求包:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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}

image

 评论