我正在解决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()
?尽管在谷歌搜索,我仍无法找到它。
答案 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