商用图片做公司网站可以吗,5人免费crm,微信公众号小程序开发教程,百度平台商家天融信阿尔法实验室 李喆有人说php是世界上最好的语言#xff0c;这可能是对开发人员来说#xff0c;确实有这方面的特点#xff0c;因为它开发起来不像其他语言那样麻烦#xff0c;就比如#xff1a;弱类型#xff0c;它不需要像java等语言那样明确定义数据类型。这给开…天融信阿尔法实验室 李喆有人说php是世界上最好的语言这可能是对开发人员来说确实有这方面的特点因为它开发起来不像其他语言那样麻烦就比如弱类型它不需要像java等语言那样明确定义数据类型。这给开发带来了很大的便利所有的数据类型都可以用$xx来定义而不需要int i,string a,fload b等等这样去定义它。这样确实很方便因为php帮助你判断了数据类型比如整形int ,你只要$a1;那这个1就是整形$a’abc’那这个abc就会被php判断为字符串类型。但是弱类型方便是方便但是带来的安全问题也是巨大的很多的php安全漏洞都是因为它带来的。本文是给做代码审计漏洞挖掘和渗透测试人员总结的一个思路有不对的地方请多多指出。这里主要是介绍如何通过利用弱类型来做php代码审计的漏洞挖掘。漏洞挖掘关键点肯定在变量上因为变量可以承接外来参数和内部数据的交互工作这是漏洞的起因也是必要条件。如果外来参数是恶意代码同时再因为使用了弱类型的函数或者比较运算符导致了恶意参数的数据进入了程序里比如数据库就可能引发想象不到的破坏力。这里我介绍了三种可以导致恶意数据进入判断体里的函数和比较运算符他们有共同的特点就是和数据比较然后把外来变量做自动类型转换如果外来变量是恶意变量利用一定的方法就可以绕过你想绕过的地方比如判断if条件让恶意变量进入到条件体内恶意变量如果在判断体内被代入到了数据库的增删改查操作中就可以引发sql注入等漏洞问题。01第一个要介绍的是 is_numeric它的功能是判断参数是否为数字或者数字字符串如果是则返回true假返回false它的弱类型问题是他支持十六进制0x格式如何引发的安全问题让我们继续观看。安全问题描述is_numeric在做判断时候如果攻击者把payload改成二进制0x..is_numeric会先对十六进制做类型判断十六进制被判断为数字型为真就进入了条件语句如果再把这个代入进入sql语句进入mysql数据库mysql数据库会对hex进行解析成字符串存入到数据库中如果这个字段再被取出来二次利用就可能因为二次注入漏洞.比如这样if(is_numeric($_GET[num])){echo $_GET[num];echo “”;//假设这个插入进了mysql数据库mysql数据库就会把十六进制转换成了字符串这里为了方便用 Hex2String 函数代替echo Hex2String($_GET[num]);//输入http://127.0.01/equal.php?num0x39393939393939393939393920756e696f6e20616c6c202873656c656374202748656c6c6f21212729// 输出0x39393939393939393939393920756e696f6e20616c6c202873656c656374202748656c6c6f2121272//输出9999999999999 union all (select ‘Hello!!’)}function Hex2String($hex){$string”;for ($i0; $i strlen($hex)-1; $i2){$string . chr(hexdec($hex[$i].$hex[$i1]));}return $string;}可以看到数据库存入的是 9999999999999 union all (select ‘Hello!!’) 如果被取出来再输出没做过滤就会引发二次注入防御方法用intval函数获取变量整数值对从数据库取出变量做过滤上面的不理解可以看一个案例分析这里有个例子图1.1问题出现在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!!’\)转成 hex0x39393939393939393939393920756e696f6e20616c6c202873656c656374202748656c6c6f21212729我们提交的参数vote1submitid0x39393939393939393939393920756e696f6e20616c6c202873656c656374202748656c6c6f21212729图1.2我们可以清楚的在图片里看到我们插入的Hello!在其他查询位置被显示了出来引发了二次注入漏洞问题。02 第二个介绍的是比较运算符的安全隐患比如 ,! 同时还会介绍他们和恒等式和 ,!的区别和安全问题函数功能和!是比较运算符号 不会检查条件式的表达式的类型安全问题描述php是弱类型在做匹配和比较时候会根据匹配的类型做类型转换如果后面是整形如$a1,因为后面的1是整形那前面gpc传进来就会转换成整形转换规则是前面的数字不变后面字母被当成字符型舍去也就是1a会变成1判断为真进入判断体如果这样$a”1″,那么后面的就是字符串1,如果gpc传进来1a会发现为假因为传进来的1a做类型转换成字符串后就是1a字符串1a和字符串1不想等所以为假这时候要改成1才能进入判断体内同样在进行加减乘除比较运算判断时候也会做自动类型转换如果跟整形比较1a会转换成1跟字符串比较a1就会转换成字符串a1其他类型也一样。如果你觉得这样很绕看不懂那就简单说如果和字符串做比较就会转换成字符串如果和整形做比较就会自动转换成整形只不过整形自动转换的时候php就是用的intval 函数导致1a为1。intval函数可以自查下大致如intval(“a”)0; intval(12.3223)12; intval(“12abc”)12;比如$a $_GET[a];if ($a1){echo ‘vul-’.$a;}同样!也会有这个问题换成2就可以进到判断体内$a $_GET[a];if ($a!1){echo ‘vul-’.$a;}防范方法用和!来做判断他们是恒等计算符 同时检查表达式的值与类型跟数字有关的运算都可能引起弱类型漏洞比如下面这个运算但是这样也不完全可以比如加减乘除运算符也会做类型转换假如这样$a $_GET[a];$b $_GET[b];if($a$b2){echo “vul-”.$a.””.$b;}所以最安全的防范是对gpc获取数字型的参数值进行intval强制类型转换或者过滤再做判断$a intval($_GET[a]);$b intval($_GET[b]);if($a$b2){echo “vul-”.$a.””.$b;}03 第三个要就介绍的是in_array()函数函数功能判断一个值是否在数组中存在安全问题描述:这个函数的弱类型问题是判断的值在比较之前会做类型转换同样是弱类型问题比如in_array($_GET[id],array(1,2,3,4,5)),如果我们传入 id1’ union select… ,判断就会为真因为id被转换成1这时候假如我们再把$_GET[id]拼接到数据库语句中就会引起sql注入漏 洞。if(in_array($_GET[id],array(1,2,3,4,5))){echo $_GET[id];//输入http://127.0.01/equal.php?id1′id//输出 1′id}防范方法外来变量要做过滤或者强制类型转换