这个PHP代码中的漏洞在哪里?

时间:2016-09-30 14:16:44

标签: php security

我正在解决codeshell.kr

的问题
  <?php 
    include("./config.php"); 

    $foo = $_GET['______foo_adm1nkyj______']; 
    $check = urldecode($_SERVER['QUERY_STRING']); 

    if(preg_match("/_| /i", $check)) 
    { 
        die("no hack ~_~"); 
    } 
    if($foo == "adm1nkyj") 
    { 
        echo $flag; 
    } 

    echo "<br/>"; 
    highlight_file(__FILE__); 
  ?>

我应该怎样做才能获得$flag?  那些代码的漏洞是什么?它在$_GET吗?还是preg_match()?尽管在谷歌搜索,我仍无法找到它。

2 个答案:

答案 0 :(得分:4)

解决方案是:

http://123.111.158.161/codeshell/prob2/?......foo.adm1nkyj......=adm1nkyj

它的工作原理是因为PHP在请求数据数组的键($_GET$_POST$_REQUEST$_COOKIE)中用下划线替换了点和空格。

来自PHP docs

  

注意:变量名称中的点和空格将转换为下划线。例如,<input name="a.b" />变为$_REQUEST["a_b"]

这可能是寄存器全局变量仍然存在的时候的遗物。

答案 1 :(得分:2)

当你知道一件事时,问题实际上非常简单:php用下划线替换GET变量名中的点。

脚本检查GET变量中是否有下划线,如果有,则死掉。因此它无法达到检查GET变量值的程度。但如果你用点替换下划线,它就会通过。

只需拨打此网址:

123.111.158.161/codeshell/prob2/?......foo.adm1nkyj......=adm1nkyj