继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

PHP弱类型引发的漏洞实例

热心李市民丶
关注TA
已关注
手记 10
粉丝 18
获赞 29

【非原创】
我们知道PHP 是一门弱类型语言,不必向 PHP 声明该变量的数据类型,PHP 会根据变量的值,自动把变量的值转换为正确的数据类型,但在这个转换过程中就有可能引发一些安全问题。

类型转换

  1. 会先进行类型转换,再进行对比
  2. 会先比较类型,如果类型不同直接返回false,参考如下

图片描述

注意:

  1. 当一个字符串被当作一个数值来取值,其结果和类型如下:如果该字符串没有包含’.',’e',’E'并且其数值值在整形的范围之内,该字符串被当作int来取值。其他所有情况下都被作为float来取值,该字符串的 开始部分 决定了它的值,如果该字符串以合法的数值开始,则使用该数值, 否则其值为0 。
    图片描述

  2. 在进行比较运算时,如果遇到了 0e 这类字符串,PHP会将它解析为 科学计数法
    图片描述

  3. 在进行比较运算时,如果遇到了 0x 这类字符串,PHP会将它解析为 十六进制 。
    图片描述

实例: DedeCMS(20180109)任意用户密码重置
博客: http://blog.nsfocus.net/dedecms-20180109/

函数松散性
switch()
如果switch是数字类型的case的判断时,switch会将其中的参数转换为int类型。
图片描述

实例:HDwikiSQL注入
图片描述

实际执行的语句:
$type = 'hot';

in_array()
in_array(search,array,type): 如果给定的值 search 存在于数组 array 中则返回 true( 类似于==)。如果第三个参数设置为 true,函数只有在元素存在于数组中且数据类型与给定值相同时才返回 true( 类似于=== )。如果没有在数组中找到参数,函数返回 false。
图片描述

实例:免费开源相册Piwigo SQL注入

is_number()
is_numeric在做判断时候,如果攻击者把payload改成十六进制0x…,is_numeric会先对十六进制做类型判断,十六进制被判断为数字型为真,就进入了条件语句,如果再把这个代入进入sql语句进入mysql数据库,mysql数据库会对hex进行解析成字符串存入到数据库中,如果这个字段再被取出来二次利用,就可能造成二次注入漏洞。
图片描述

strcmp()
strcmp(string1,string2):比较括号内的两个字符串string1和string2,当他们两个相等时,返回0;string1的大于string2时,返回>0;小于时返回<0。在5.3及以后的php版本中,当strcmp()括号内是一个数组与字符串比较时,也会返回0。
图片描述

md5()
string md5 ( string $str [, bool $raw_output = false ] )

md5()需要是一个string类型的参数。但是当你传递一个array时,md5()不会报错,只是会无法正确地求出array的md5值,返回null,这样就会导致任意2个array的md5值都会相等。
图片描述

以上就是常见的利用PHP弱类型产生的一些安全问题,在CTF、PHP代码审计中也会遇到这种利用弱类型来绕过逻辑判断,进而引发更大问题的漏洞。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP

热门评论

嘿嘿嘿给自己点赞ᔐ?ᔑ

查看全部评论