发现
某天做题,发现了一个没看懂的 正则表达式
[^\W]+\((?R)?\)
???什么东西
尝试在线正则匹配也没弄明白,直接搜表达式吧…
收获新名词
无参数 RCE
当时直接用了现成的 payload,现在总结一下 抄网上的东西,方便断网比赛用
新知识
为什么无参数
https://www.php.net/manual/zh/regexp.reference.recursive.php
把(?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()
- getallheaders()
但是只能在 apache2 的环境
我们可以在 header 中加入恶意命令
var_dump(pos(getallheaders()));
- getenv()
可以获取当前的环境变量,配合 array_rand(array_flip()) 爆破
- get_defined_vars()
局限性小于 getallheaders(),可以获取 $_GET $_POST $_COOKIE $_FILE
但一般网站喜欢对 $_GET $_POST $_COOKIE 进行过滤,可以操作 $_FILE
python2
1 | import requests |
- session_id()
修改 COOKIE 中 PHPSESSION 的值,(测试的时候用不了
session_start(): Cannot start session when headers already sent in
python2
1 | import requests |
- 直接读取文件
getcwd() - 获取当前目录
scandir() - 目录遍历
dirname() - 获取上层目录的名字(类似向上级目录移动
chdir() - 修改当前目录位置
配合随机弹出值
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !