php代码审计特殊漏洞
一.变量覆盖漏洞
常见变量覆盖漏洞问题–>5个
1.$$
2.extract()变量覆盖
3.parse_str()与mb_parse_str()
原理:这两个函数会将查询到的值覆盖php的变量
<?php
parse_str("a=1");
echo $a."<br/>"; //$a=1
parse_str("b=1&c=2",$myArray);
print_r($myArray); //Array ( [b] => 1 [c] => 2 )
?>
4.import_request_variables()函数导致变量覆盖
原理:这个函数在 register_global = off 时,可以把 GET/POST/Cookie 变量导入全局作用域
中。
<?php
import_request_variables("g", "get_");
echo $get_id;
?>
//提交:?id=111
//结构:111
5.register_globals变量覆盖
产生原理:
当这个变量设置为On的时候,传递过来的值(传递方式:get、post、cookie)会被直接注册为全局变量而直接使用
当为OFF的时候,就需要到特定的数组中去得到它。
设置地方:在php.ini去学习
<?php
//?id=1
echo "Register_globals: ".(int)ini_get("register_globals")."<br/>";
echo '$_GET["id"] :'.$_GET['id']."<br/>";
echo '$id :'.$id;
?>
二.弱类型
php是弱比较语言导致的
常见的几个问题点
①== 弱比较(这个不需要类型也相同导致的漏洞)
②MD5弱比较
导致原理:是因为magic hash比较的时候如果遇到了 0e\d+ 这种
字符串,就会将这种字符串解析为科学计数法,进而认为两个字符串是相同的
"0e132456789"=="0e7124511451155" //true
"0e123456abc"=="0e1dddada" //false
"0e1abc"=="0" //true
③弱比较函数这些
is_numeric()
in_array() 这个如果拿来做比较的话 会出问题-->导致原因:在比较之前会自动类型转换
<?php
if (in_array($_GET['id'],array(1,2,3,4)))
{
$sql="select * from admin where id ='".$_GET['id']."'";
}
echo $sql;
?>
//提交:?id=1' union select 1,2,3,4%23
//结果:select * from admin where id ='1' union select 1,2,3,4#'
strcmp()或者switch()
绕过id[]=
三.字符串offset特性
即php中的字符串可以当作数组来操控导致的
如
<?php
ini_set("display_errors", "On");
error_reporting(0);
foreach (array('_COOKIE','_POST','_GET') as $_request)
{
foreach ($$_request as $_key=>$_value)
{
$$_key= $_value;
}
}
$userinfo["username"] = $username; //==> $userinfo[0]=a 赋值以后 $userinfo=a33333
$userinfo["password"] = $password; //==> $userinfo[0]=1 赋值以后 $userinfo=133333
$_SESSION["userinfo"] = $userinfo;
var_dump($_SESSION);
echo "<br/>";
$userinfo=$_SESSION["userinfo"]; //输出 array(1) { ["userinfo"]=> string(6) "133333" }
if($userinfo["id"] == 1) {
echo "flag{xxx}";
die();
}
?>
解题思路:
在cookie中添加一个userinfo[id]=1;就可以解决了
还没有评论,来说两句吧...