本文来自掌控安全学员-
无参数RCE就类似与在我们经常使用的一句话木马前面,加上了对参数的过滤,过滤的正则一般类似于一道ctf题目给的这种。
我在理解这个正则的时候碰到了一些问题,下面是我的理解和测试的一些结果: 1.首先,这个正则是怎么匹配的呢,顺序是怎么样的 比如a(b(c()))这个格式的函数匹配的顺序如下:
整个正则可以分为三部分
一 [a-z,_]+\( 直到递归前面可以看作一个匹配整体
二 (?R)? 递归部分看作一个匹配整体
三 \) 递归后面的看作一个匹配整体
开始匹配,下面是匹配的顺序
a( //匹配上面第一个匹配整体,然后进入第一次递归
b( //匹配上面第一个匹配整体,进入第二次递归
c( //匹配上面第一个匹配整体,进入第三次递归
//没有匹配第一个匹配整体,递归停止
) //匹配第二次递归剩下的表达式,即第三个匹配的整体\),
) //匹配第一次递归剩下的表达式,即\),
) //匹配原表达式剩下的表达式,即\),
2.(?R),(?R)?,(?R)*,(?R)+的区别 首先(?R) , (?R)+ 这两个表达式是匹配不到东西的,因为每次匹配的时候都会至少运行一次递归,无法终止,所以匹配不到任何东西。 (?R)?,递归0次或1次,非贪婪,只能匹配a(b())这种一层套一个函数的。
利用正则表达式递归过滤 参考: 利用诸多php函数嵌套实现RCE 参考:下面这些函数有一部分是我从上面大佬的博客整理来的,方便进行整理和翻阅,再进行构造无参数函数RCE的时候可以相互组合使用。
将整个文件读入一个字符串
读取文件并写入到输出缓冲。
列出指定路径中的文件和目录
给出一个包含有指向一个文件的全路径的字符串,本函数返回去掉文件名后的目录名。
此函数返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。
返回一包含本地数字及货币格式信息的数组,第一个值一直是.
获取/设置当前会话 ID
启动新会话或者重用现有会话
还有一些可以用到的函数,
- chr():返回指定的字符
- rand():产生一个随机整数
- hex2bin():转换十六进制字符串为二进制字符串
- ord:返回字符串的第一个字符的 ASCII 码值。
打开网站,只有一句话,其它什么也没有,直接用字典扫dir,发现有.git,使用githacker进行提取。拿到index.php源码。
发现有三层正则匹配,第一层过滤了一些伪协议,第二层就是无参数化了,第三层过滤了一些敏感函数(get,phpinfo,hex2bin,dirname……)。完全绕过后就可以执行代码了。
也可以用它执行部分命令
参考 这个也是我博客的一篇文章
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。