[百度杯-二月場](Misc-Web)爆破-1

weixin_34236869發表於2017-02-19

簡介 :

分值:10分 型別:Misc Web已解答

題目:
flag就在某六位變數中。

<?php
include "flag.php";
$a = @$_REQUEST['hello'];
if(!preg_match('/^\w*$/',$a )){
  die('ERROR');
}
eval("var_dump($$a);");
show_source(__FILE__);
?>

分析 :

$$

php中 $ 是可以疊加使用的 , 例如 : 
$a = "b";
$b = "Hello world!";
echo $$a;
就可以列印出 b 的值
可以這樣來看 $$a
${${a}} = ${b} = "Hello world!"
這也是 php 的一個比較奇特的性質

超全域性變數 :

[PHP超全域性變數](http://www.w3school.com.cn/php/php_superglobals.asp)
[PHP超全域性變數](http://www.php.net/manual/zh/language.variables.superglobals.php)
[PHP超級全域性變數、魔術變數和魔術函式](http://www.cnblogs.com/wangxin-king/p/5669336.html)
我們可以通過傳送一個這樣的get請求來列印超全域性變數 : $GLOBALS
http://xxxxxx.ctf.game/?hello=GLOBALS
那麼在執行這一句 : eval("var_dump($$a);"); 的時候
其實就是在執行 : 
eval("var_dump(${${a}});");
eval("var_dump(${GLOBALS});");
這樣就會列印出當前定義的所有變數 , 也包括 include 的檔案中的變數 , flag 也存在在這些變數中

相關文章