这几天刷了一下GXYCTF,其中有一道套娃题,考点是我不熟悉的无参数RCE,多亏了sky师傅的blog才做出来,然后看了y1ng师傅的wp又学到了另一些TF,其中有一道套娃题,考点是我不熟悉的无参数RCE,多亏了sky师傅的blog才做出来,然后看了y1ng师傅的wp又学到了另一些奇技淫巧,感觉有必要总结一下,要不很容易忘(师傅们tql,下面总结的都来自两位师傅的blog,具体的原理还是去师傅的blog看吧,我就不班门弄斧了,我也会再找一些方法,尽量补充的全一些,这样就不怕忘记了)

复现的具体过程可以看一下写的刷题记录,导致无法输入参数进行RCE是因为

preg_replace(‘/[a-z,_]+\((?R)?\)/’, NULL, $_GET[‘exp’])

(?R)表示引用当前表达式 ?递归调用。

所以exp(‘a’);这中传参的格式是不允许的

exp(a());这种形式允许。

Bypass

session_id()

获取当前会话id,可以获取PHPSESSID的值。这样我们可以考虑自己传个PHPSESSID的值,这样就可以bypass (使用hex2bin是因为PHPSESSID只允许字母和数字)

eval(hex2bin(session_id(session_start())))

getenv()

用爆破的方式获取数组中任意位置需要的值,获取指定位置的恶意参数

getenv()获取当前环境变量

array_rand()从数组中取出一个或多个单元,再利用array_flip()将键值调位

如果想利用的恶意参数在数组的末端可以用end()调用,但是在中间的话呢?

y1ng师傅给出了解答,利用array_reverse() 以相反的元素顺序返回数组

然后再利用next()将内部指针指向数组中的下一个元素并输出

还有一种差不多的利用姿势利用的姿势就是可以先scandir()查一下目录,然后再找需要的恶意参数位置,例如此题为flag.php,然后就大同小异了

‘ . ‘ 可以用chr(rand()) chr(time()) chr(current(localtime(time()))) current(localeconv())来代替 {更多姿势可以在y1ng师傅blog找到}

再记录一小点:pos() current() 返回数组中的当前单元, 默认取第一个值

以及一些数组的操作函数:

getallheaders()

取出恶意指令的套路跟上面也是大同小异

get_defined_vars()

利用全局变量(但是这个函数只针对Apache)

dirname() & chdir()

也可以直接读文件

也可以利用 getcwd()+scandir()+dirname()+chdir()可以打组合拳

dirname()返回上一级目录 chdir()改变当前目录

——-待补全,睡了睡了……..今天可真是一条懒狗。

补个小点:读文件 :

file_get_contents() readfile() highlight_file() show_source()


1 条评论

知识点总结part3-RCE – M0n1ca's blog · 2020年7月26日 下午11:27

[…] 之前总结过传送门 […]

发表评论

电子邮件地址不会被公开。 必填项已用*标注