GHCTF2025-WEB新手向详解-UP UP UP!(内含详细的文件上传漏洞利用逻辑和流程+getimagesize和exif_imagetype绕过)_ghctf 2025
GHCTF-WEB-UP UP UP!
题目地址:NSSCTF | 在线CTF平台
题面:
目录
GHCTF-WEB-UP UP UP!
解题思路:
文件上传漏洞的waf与绕过主要存在以下手段:
首先是前端JS检测与content-type字段检测验证:
其次是黑名单、白名单、文件幻术检测
确定是白名单后的结合图片文件幻术头绕过尝试:
利用.xbm和.wbmp文件幻术头为.htaccess的注释符的检测绕过(一般情况下的getimagesize和exif_imagetype绕过):
写在解题前的话:
如果你完全不知道文件上传漏洞及其绕过方式,请参考:
《Web安全渗透测试:文件上传漏洞21种绕过手法全解(附靶场源码+防御方案)CSDN热门技术深度剖析》 - 知乎
如果你需要下载基础的文件上传漏洞靶场UPLOADS-LAB,请参考:
upload-labs安装及攻略_uploadlabs-CSDN博客
打穿UPLOADS-LAB,文件上传漏洞基本上就是悟了。
解题思路:
本题给出一个文件上传的界面,那明显就是考察文件上传漏洞。没有给出源码,那就只能自行进行文件上传漏洞的测试。测试之前首先要大概知道文件上传漏洞的种类与对应的绕过方式:
文件上传漏洞的waf与绕过主要存在以下手段:
①前端检测Content-Type字段的值或者MIME类型,通过抓成功的包修改内容和后缀绕过
②黑名单检测(即不允许文件名包含特定字符后缀或者特定字符的文件上传),可以通过双写、大小写、空格绕过:(.php )、点绕过:(.php.)、$DATA绕过、Apache解析漏洞(利用apache从右往左解析后缀的特性)、.htaccess解析绕过
③白名单检测(即只允许文件名包含特定字符后缀或者特定字符的文件上传),可以使用00截断(%00截断与0x00截断)
④文件幻术检测、文件内容检测、APACHE解析漏洞等
那么按照通常情况下的waf手段,来简单进行一下测试流程逻辑的梳理:
首先是前端JS检测与content-type字段检测验证:
上传一个正常的.jpg文件和不正常的后缀(.abc这种非常规后缀),观察响应:
验证了正常的.jpg文件是合法文件,但是非常规后缀.abc非法,空文件会文件大小报错。
接着将.abc的请求包重放 修改.abc的content-type字段为image/png,再次发包:
仍然显示为非法文件。
综上,有响应包说明不是前端JS检测(前端JS检测的特征是非合法的文件上传时因为前端的拦截导致没有请求);修改content-type字段后再次发包仍然报错,说明目标并不是content-type字段检测。接着考虑检验目标是黑名单还是白名单检测。
其次是黑名单、白名单、文件幻术检测
利用上传漏洞专属的test+后缀字典,修改一个有内容的文件的文件名(主要是更改后缀),用bp的爆破模块爆破,观察回显的情况:
字典请参考:文件上传后缀名规则-CSDN博客,但是缺少一些必要后缀的检测(比如.htaccess,根据需求自行添加,这里我的字典是这样的:
Ubuntu Pastebin
爆破,content type为image/png时,回显结果如下:
根据爆破结果分析,content type为image/png时,长度分1194/1195,1197/1198两类,其中1194/1195的response是非法文件,1197/1198的response是文件不允许。
因此我们可以对waf的过滤方式进行猜测,因为本题是php环境的,而爆破结果中带php字符的文件都是文件不允许,可以推测有一个文件名检测函数,检测到含php的文件名(不只是在后缀)会删除文件并显示文件不允许。而回复非法文件的请求中我们注意到.jpg等图片类型的文件,结合之前正常的.jpg图片能成功上传,可以猜测服务器检验了图片类型文件的文件幻术头。尝试使用通用图片文件幻术头GIF89a:
成功上传。那么在有文件幻术头的基础上再爆破一次文件名:
包含php和phtml的响应都是一样的文件不允许(响应长度1197/1198),而.jpg .png .gif 甚至.htaccess也能成功上传了(响应长度133x,受源文件名长度影响)。
再具体分析一下能成功上传文件的response,发现了一些事情:
包含/ ;等特殊字符的文件名都会被编码 失去我们所想要达到的绕过效果。
确定是白名单后的结合图片文件幻术头绕过尝试:
由此我们确定目标存在图片类型的文件幻术检测,且确定是白名单类型(由于之前.abc后缀被拦截为非法文件得知 因为没人会闲的没事黑名单设置.abc对吧~),对于白名单内但是非图片文件头的文件会回显非法文件; 对于文件名包含php和phtml的会回显文件不允许;而且确定.htaccess可以上传。
对于白名单绕过,我们往往使用00截断的方式。此题中,00的空字符会并不会被自动替换(有的函数会这样操作)
但是00截断的核心是截断后把原来截断前当作目录的部分截断后当作文件名,而之前的爆破测试中试过了,代表目录的/会被编码替代,因此本题虽然可以00截断但是无法生效。
因此我们的目标确定了,就是如何在检测图片类型文件幻术的基础上成功上传.htaccess文件,使得包含了一句话木马且具有文件幻术头的图片后缀类型文件能够成功的被服务器解析。但是实际做题的时候,如果.htaccess文件以GIF89A开头,此处会引发服务器的解析报错,从而导致访问该网页下所有的文件全部报错(如下图)。
接着有想过在.htaccess中注释,但是似乎并没有在文件末尾注释一整行的符号。逻辑对了,但是绕过不了,陷入了知识盲区。
利用.xbm和.wbmp文件幻术头为.htaccess的注释符的检测绕过(一般情况下的getimagesize和exif_imagetype绕过):
官方payload贴出来后尝试搜索,在其它CTF中看到了这样的方法:
php 文件上传.htaccess getimagesize和exif_imagetype绕过_getimagesize图片类型绕过-CSDN博客
其核心就是.htaccess中的注释符有: \\x00 和 #,而有两种不常见的图片类型文件.xbm和.wbmp,其文件幻术头正是以这些注释符作为开头。其中:
.xbm图片的文件幻术头为:
#define width 1337
#define height 1337
.wbmp图片的文件幻术头为:\\x00\\x00\\x85\\x85 或者 \\x00\\x00\\x8a\\x39\\x8a\\x39
尝试以这两种幻术头作为.htaccess文件的开头传入,.xbm的头上传成功,.wbmp的失败:
再次访问/iamges/test.jpg 并没有报错:
完整的.htaccess如下:
#define width 1337#define height 1337SetHandler application/x-httpd-php
上传DIF89A开头的upload.jpg,内含一句话木马:
GIF89A
访问/iamges/upload.jpg:
显示出了类似于php的命令执行语句和报错,说明服务器解析upload.jpg为php成功,尝试使用蚁剑进行连接:
成功getshell,flag在/flag中:
既然知道了.xbm和.wbmp两种图片格式,别忘了加进自己的文件上传字典里哦~