CTF中常见的一些PHP漏洞总结

	平常也遇到不少这样的题目,记性不好很容易忘,于是好好总结一下加深记忆!!!

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

下面举几个经md5处理后开头为0e的例子;
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
下面我们做个实验试试:
在这里插入图片描述
结果。。。如我们期望的一样

在这里插入图片描述

因此,当md5加密的字符串是可控(即可以控制输入),就可能造成漏洞!!!

当然,更有趣的是,md5,是不能处理数组的。下面也是实验:

在这里插入图片描述
我们传入两个不同的数组:

在这里插入图片描述

会发现虽然有警告,但是仍能绕过,(不想有警告在前面加@符号即可):
在这里插入图片描述
但是,不知道不知道处理数组会返回什么,因此试验一下:
在这里插入图片描述

var_dump()一下:

在这里插入图片描述

为空!!!说明处理数组的时候,会返回NULL值。

对于 md5(str)==0 有很多绕过方法;总结一下:

  1. 开头为0或0e绕过
  2. 数组
  3. 只要经md5函数处理后开头没有数字都都可以,比如"c9f0f895fb98ab9159f51fd0297e236d"==0成立!!!,用到了字符串转换成整数!!!,如果开头没有数字的话,就只能转换成0了!!
    4.sha1()函数和md5()函数一样。都不能处理数组,会返回NULL

二.strcmp()函数漏洞,
strcmp()函数用于比较两个字符串,
strcmp( string$ str1, string$ str2) ;
参数str1第一个字符串.str2第二个字符串。如果str1小于str2返回<0;如果str1大于str2返回> 0;如果
两者相等
,返回0.(注意相等返回0这个特性)

但是如果此函数参数中有一个不合法的参数(对象,数组等),就会报错并返回0!!!(在php 5.2版本之前,利用strcmp函数将数组与字符串进行比较会返回-1,但是从5.3开始,会返回0)
下面以BUGKU代码审计一道题实例:
在这里插入图片描述
如图,根据strcmp漏洞,传入一个数组试试:
在这里插入图片描述

传入数组,导致strcmp错误,返回,于是就绕过了!!!
还有另一个函数strcasecmp(),与strcmp()相同,strcmp()区分大小写,而strcasecmp()不区分,都可用同样方法绕过

**三.**文件包含函数漏洞,这个不知道怎么总结,等总结好了再令写一篇试试,可看这篇(总结的很好

分享一下这篇文章。讲的很不错!添加链接描述


ereg()函数漏洞:%00截断

在这里插入图片描述

如以上程序,是验证的是输入的参数中有没有"c";我们随意构造一个包含c的字符串:

在这里插入图片描述

加上%00试试:

在这里插入图片描述

说明ereg函数,不检查%00后面的内容,因此可造成绕过;
发现POST传输也可以;另一个相近的函数ergei()也存在这个漏洞

变量覆盖函数extract();

在这里插入图片描述

如图,假设不知道$key的值,我们怎么才可以绕过呢?(为了防止弱类型,所以用了===(全等号))

答案是变量覆盖:
看一下对于extract()的解释:
在这里插入图片描述

举例:

比如数组:$test = array('a' =>'Hello' ,'b'=>'World' );经过extract($test);之后,就会把里面的东西提取出来当成变量(个人理解),变为:$a='Hello';$b='World';

注意:如果提取后有相同的变量会导致覆盖掉以前的变量;

因此构造:
在这里插入图片描述

成功绕过,注意$_GET是一个数组包含了url中的参数,我们var_dump()一下
在这里插入图片描述
在这里插入图片描述

同理;$_POST也可以:
在这里插入图片描述

在这里插入图片描述

当然$_REQUEST也是一样;不同之处在于包含范围更多(GET和POST和sesson什么啦),tips:当GET和POST传输同一参数时,会选择POST传输的)

与其类似的还有 parse_str() mb_parse_str()等

is_numeric()函数,用来判断是否是数字字符串及数字,下面是参考别人的截图:

在这里插入图片描述
以后会持续更新:
参考:添加链接描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值