php安全特性学习(一)

环境如图:
在这里插入图片描述

Is_numeric类型转换缺陷
PHP提供了is_numeric函数,用来变量判断是否为数字。PHP弱类型语言的一个特性,当一个整形和一个其他类型行比较的时候,会先把其他类型intval数字化再比。
来看看代码:
在这里插入图片描述
访问之
在这里插入图片描述
首先对GET方式提交的参数id的值进行检验。id通过is_numeric函数来判断是否为数字,如果为数字的话,则显示sorry。如果不是数字的话,再和2019进行比较,id的值大于2019的时候输出flag。
PHP弱类型语言有一个特性,当一个整形和一个其他类型行比较的时候,会先把其他类型intval数字化再比。利用这个特性就可以很好的绕过。
在这里插入图片描述

Hash比较缺陷
查看代码
在这里插入图片描述
访问之
在这里插入图片描述
由代码可知,输入a ,要使a等于字符串 QNKCDZO 经过md5加密后的数且不能等于该字符串,该字符串经过md5加密后加密后的md5值为0e830400451993494058024219903391 这里是0e开头的,在进行等于比较的时候,PHP把它当作科学计数法,0的无论多少次方都是零。 所以这里利用弱类型的比较的缺陷来进行解题:如果md5的值是以0e开头的,那么就与其他的0e开头的Md5值是相等的。
我们有:
在这里插入图片描述
所以用这个字符串就可以了
在这里插入图片描述
另:加密后0e开头的字符串还有
在这里插入图片描述

parse_str变量覆盖缺陷
parse_str函数的作用就是解析字符串并注册成变量,在注册变量之前不会验证当前变量是否存在,所以直接覆盖掉已有变量。
在这里插入图片描述
先来查看代码
在这里插入图片描述
访问之
在这里插入图片描述
代码中@parse_str( b ) ; 使 用 了 p a r s e s t r 函 数 来 传 递 b 的 变 量 值 i f ( b);使用了parse_str函数来传递b的变量值 if ( b);使parsestrbif(a[0] != ‘QNKCDZO’ && md5($a[0]) == md5(‘QNKCDZO’))
这里是前面是提到的md5()函数缺陷
由于代码中变量a的值已经固定,为了满足if的判断,利用变量覆盖函数的缺陷这里可以对a的变量进行重新赋值为我们可控的内容,后面的的if语句再利用前面提到的md5()比较缺陷进行绕过
在这里插入图片描述

switch绕过
代码
在这里插入图片描述
运行
在这里插入图片描述
如果switch是数字类型的case的判断时,switch会将其中的参数转换为int类型,又正则表达式进行匹配要求a中必须含有字母,利用”4aaa”==4便可绕过switch
在这里插入图片描述

extract()变量覆盖
代码
在这里插入图片描述
访问之
在这里插入图片描述
extract() 函数从数组中将变量导入到当前的符号表。该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。该函数返回成功设置的变量数目。为了拿到flag,需要auth值为1,此处我们利用extract()变量覆盖的缺陷,将auth覆盖为1

在这里插入图片描述

strcpy()比较字符串
代码
在这里插入图片描述
访问
在这里插入图片描述
int strcmp ( string $str1 , string $str2 )
参数 str1第一个字符串。str2第二个字符串。如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。
strcmp只会处理字符串参数,如果给个数组的话呢,就会返回NULL,而判断使用的是==,NULL==0是 bool(true),满足if判断的逻辑,就得到flag了
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值