ctfshow web入门 命令执行58-71

刷题记录。

目录

web58

web59-65

web66

web67

web68

web69-web70

web71


web58

关键源码:

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');    #对文件进行语法高亮显示。

web59-65

和web58一样,多过滤了一些函数。

参考payload:

show_source('flag.php');

web66

当前目录的flag是假的!

print_r(scandir('/'));

发现flag在根目录。

这次show_source()也被ban了,发现highlight_file()还能用。

参考payload:

highlight_file('/flag.txt');

web67

print_r()需要换成var_dump()。

web68

highlight_file()被ban了,可以使用include()包含。

web69-web70

var_dump()被过滤了,使用var_export()

var_export——输出或返回一个变量的字符串表示

web71

题目给了源码附件,

关键源码:

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这个缓冲区清空操作,输出就能正常输出。

——————————————————————

如有错误,欢迎指正。

你可能感兴趣的:(CTF-web刷题记录,安全,网络安全,php)