https://www.hetianlab.com/expc.do?ec=ECID3ec0-232d-4e11-8cb0-52a8620c51ee&pk_campaign=toutiao-wemedia#stu
详细理解PHP中变量覆盖漏洞干系的知识。复制上方链接,进入实操靶场!
变量覆盖是指可以用自己的传参值代替程序原有的变量值。

例如下面的函数或者语法利用不当时就会涌现漏洞。
$$extract()parse_str()import_request_variables()mb_parse_strregister_globals漏洞解析这里先剖析函数,再剖析漏洞。
extract()事理extract()函数从数组中将变量导入到当前的符号表。
例如
<?php$a="eeknight";$my_array=array("a"=>"C","b"=>"T","c"=>"F");extract($my_array);echo"\$a=$a;\$b=$b;\$c=$c";?>输出:$a=C;$b=T;$c=F
攻击手段
这里先举个例子
<?php$a="echo'eeknight';";echo$a;echo"\n";eval($a);?>输出:echo'eeknight';eeknight
在上面双引号包裹了单引号,然后通过eval去利用他,就可以直接输出单引号里的东西了。
为什么要说这个东西,由于当你单引号里的东西可以被利用,是不是就可以写什么实行什么了。
怎么利用呢,这时候刚才先容的extract就发挥浸染了。
把上面的例子大略改一下
<?php$a="echo'eeknight';";extract($_GET);eval($a);?>
$$产生的漏洞紧张是由于foreach遍历数组的值,然后将获取的数组键名作为变量,数组中的值作为变量的值。
在这先大略先容一下foreach和$$。
foreach循环只适用于数组,并用于遍历数组中的每个键/值对。
<?php$colors=array("red","green","blue","yellow");foreach($colorsas$value){echo"$value\n";}?>输出:redgreenblueyellow
$$这里举个例子
在PHP中,$var表示一个名为var的普通变量,它存储字符串、整数、浮点等任何值。而$$var是一个引用变量,用于存储$var的值。
在我看来便是套娃。
<?php$var="ee";$$var="eeknight";echo$var;echo"\n";echo$$var;echo"\n";echo"$ee";?>输出:eeeeknighteeknight
parse_str()
parse_str()把查询字符串解析到变量中。
parse_str(string,array)string 必需。规定要解析的字符串。array 可选。规定存储变量的数组的名称。该参数指示变量将被存储到数组中。
<?phpparse_str("name=eeknight&age=20");echo$name."\n";echo$age;?>输出:eeknight20
攻击办法
通过上面的例子,可以想到,如果parse_str()括号是GET,PSOT等之类的,我们是不是就可以直接实行我们要的函数。
mb_parse_strmb_parse_str— 解析 GET/POST/COOKIE 数据并设置全局变量
详细的用法和上面的parse_str()一样。
这里就不多解释了。
import_request_variables()import_request_variables()函数将 GET/POST/Cookie 变量导入到全局浸染域中。
<?phpimport_request_variables("gP","ee_");echo$ee_knight;?>
只要利用了这个函数,就可以直接对里面的变量进行赋值。
register_globalsregister_globals的意思便是注册为全局变量
当php.ini中register_globals=On时,通报过来的值会被直接注册为全局变量,当为off时,须要到特定的数组中去得到
例子
<?phpecho"Register_globals:".(int)ini_get("register_globals")."<br/>";if($auth){echo"hello!";}?>
ON
这里ON-->OFF的转换时记得重启一下apache。
一些附加解释为什么echo "\$a = $a; \$b = $b; \$c = $c";这里要加上\呢解:这些斜杠的的意思便是,让后面的变量失落去意义。那么写的是什么便是什么。parse_str()php.ini文件中的magic_quotes_gpc设置影响该函数的输出。如果已启用,那么在parse_str()解析之前,变量会被 addslashes() 转换。import_request_variables()该函数在最新版本的 PHP 中已经不支持。支持的版本:PHP 4 >= 4.1.0, PHP 5 < 5.4.0。register_globalsregister_globals从php5.3.0起废弃,并从php5.4.0时移除。漏洞防御addslashes()addslashes()在每个双引号(")前添加反斜杠。利用原始变量,不进行变量注册;验证变量存在,如果一定要进行变量注册,可以在注册变量前先判断变量是否存在。