Menu

PHP函数漏洞总结

0 Comment

1.MD5()函数比较缺陷

PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同且为0

关于其详细介绍:http://www.freebuf.com/news/67007.html

Tips:百度0e会找到很多MD5后以”0e”开头的哈希值

同时 MD5()和SHA1()不能处理数组,md5(数组)会返回null,也可以相等绕过

实例:bugkuCTFhttp://118.89.219.210:49162/

2. strcmp() 漏洞

strcmp(str1,str2)

若str1==str2,则返回零;
若str1<str2,则返回负数;
若str1>str2,则返回正数;
在5.3的版本之后,当与数组进行比较时回直接返回0
在5.5 中如果参数不是string类型,直接return了
3.ereg()NULL截断漏洞
ereg读到%00的时候,就认为字符结束了
例题:http://ctf5.shiyanbar.com/web/more.php
ereg (“^[a-zA-Z0-9]+$”, $_GET[‘password’]) === FALSE
在这里如果 $_GET[‘password’]为数组,则返回值为NULL
4.变量覆盖
extract()变量覆盖,它的主要作用是将数组展开,键名作为变量名,元素值为变量值
<?php

$auth = '0';
extract($_GET);

if($auth==1){
echo "private!";
}else{
echo "public!";
}
?>

假设用户构造以下链接:http://www.a.com/test1.php?auth=1
界面上会打印出private!

全局变量覆盖:
当register_global=ON时变量来源可能是各个不同的地方,比如页面的表单,Cookie等。

<?php
echo "Register_globals: ".(int)ini_get("register_globals")."<br/>";

if ($auth){
   echo "private!";
}
?>

当register_globals=OFF时,这段代码不会出问题。
但是当register_globals=ON时,提交请求URL:http://www.a.com/test.php?auth=1,变量$auth将自动得到赋值。得到的结果为
Register_globals:1
private!

tips:如果上面的代码中,已经对变量$auth赋了初始值,比如$auth=0,那么即使在URL中有/test.php?auth=1,也不会将变量覆盖,也就是说不会打印出private!

通过$GLOBALS获取的变量,也可能导致变量覆盖

parse_str()变量覆盖

parse_str("name=Bill&age=60"); #    $name=Bill  $age=60
//var.php?var=new 
$var='init'; 
parse_str($_SERVER['QUERY_STRING']); 
print $var;

http://www.biuuu.com/index.php?p=222&q=biuuu

结果:
$_SERVER[“QUERY_STRING“] = “p=222&q=biuuu”
$_SERVER[“REQUEST_URI“] = “/index.php?p=222&q=biuuu”
$_SERVER[“SCRIPT_NAME“] = “/index.php”
$_SERVER[“PHP_SELF“]     = “/index.php”

5.is_numeric

is_numeric函数,用来变量判断是否为数字。但是函数的范围比较广泛,不仅仅是十进制的数字

echo is_numeric(0x233333); # 1

比如我们把‘1 or 1’ 转换为16进制 0x31206f722031 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注