有人说php是世界上最好的语言,这可能是对开发人员来说,确实有这方面的特点,因为它开发起来不像其他语言那样麻烦,就比如:弱类型,它不需要像java等语言那样明确定义数据类型。这给开发带来了很大的便利,所有的数据类型都可以用$xx来定义,而不需要int i,string a,fload b等这样去定义它。这样很方便,因为php帮助判断数据类型,比如整形int ,只要$a=1;那这个1就是整形,$a=’abc’中abc就会被php判断为字符串类型。尽管弱类型,但是带来的安全问题也是巨大的,很多的php安全漏洞都是因为它带来的。 本文我们主要介绍如何通过利用弱类型来做php代码审计的漏洞挖掘。漏洞挖掘关键点肯定在变量上,因为变量可以承接外来参数和内部数据的交互工作,这是漏洞的起因,也是必要条件。如果外来参数是恶意代码,同时再因为使用了弱类型的函数或者比较运算符导致了恶意参数的数据进入了程序里,比如数据库,就可能引发想象不到的破坏力。这里我们介绍三种可以导致恶意数据进入判断体里的函数和比较运算符,它们有共同的特点,就是和数据比较,再把外来变量做自动类型转换,如果外来变量是恶意变量,利用一定的方法就可以绕过某些地方比如判断if条件,让恶意变量进入到条件体内,恶意变量如果在判断体内被代入到了数据库的增删改查操作中就可以引发sql注入等漏洞问题。
第一个要介绍的是 is_numeric,它的功能是,判断参数是否为数字或者数字字符串,如果是则返回true,假返回false,它的弱类型问题是他支持十六进制0x格式,如何引发的安全问题让我们继续观看。
安全问题描述:is_numeric在做判断时候,如果攻击者把payload改成二进制0x..,is_numeric会先对十六进制做类型判断,十六进制被判断为数字型,为真,就进入了条件语句,如果再把这个代入进入sql语句进入mysql数据库,mysql数据库会对hex进行解析成字符串存入到数据库中,如果这个字段再被取出来二次利用,就可能因为二次注入漏洞.比如这样:
//假设这个插入进了mysql数据库,mysql数据库就会把十六进制转换成了字符串,这里为了方便用 Hex2String 函数代替
可以看到,数据库存入的是 9999999999999 union all (select ‘Hello!!’) ,如果被取出来再输出没做过滤就会引发二次注入
防御方法:用intval函数获取变量整数值,对从数据库取出变量做过滤
上面的不理解,可以看一个案例分析:
这里有个例子:
问题出现在if (!isset($_POST['id'], $_POST['vote']) || !is_numeric($_POST['id'])) 如果能绕过is_numeric,就可以执行mysql_query(“INSERT INTO vote VALUES ({$id}, {$vote}, ‘{$login}’)”); 注入sql语句。
999999999999 union all \(select ‘Hello!!’\) 转成 hex=0x39393939393939393939393920756e696f6e20616c6c202873656c656374202748656c6c6f21212729
我们提交的参数:
vote=1 |