PHP弱类型解题姿势

error_reporting(0);

error_reporting — 设置应该报告何种 PHP 错误

error_reporting(0); // 关闭所有PHP错误报告

这句的意思就是关闭所有PHP错误报告


String.fromCharCode()函数用于从一些Unicode字符值中返回一个字符串。
 

---------------sha1---------------

例如这个代码:$_GET[‘name‘] != $_GET[‘password‘]  &&  sha1($_GET[‘name‘]) === sha1($_GET[‘password‘])

可通过构造     ?name[]&paaword[]=123123来绕过

---------------MD5---------------

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

常见的payload有
部分md5函数0e开头的值:

QNKCDZO

0e830400451993494058024219903391

240610708

0e462097431906509019562988736854

s878926199a

0e545993274517709034328855841020

s155964671a

0e342768416822451524974117254469

s214587387a

0e848240448830537924465865611904

s214587387a

0e848240448830537924465865611904

s878926199a

0e545993274517709034328855841020

s1091221200a

0e940624217856561557816327384675

s1885207154a

0e509367213418206700842008763514

s1502113478a

0e861580163291561247404381396064

s1885207154a

0e509367213418206700842008763514

s1836677006a

0e481036490867661113260034900752

s155964671a

0e342768416822451524974117254469

s1184209335a

0e072485820392773389523109082030

s1665632922a

0e731198061491163073197128363787

s1502113478a

0e861580163291561247404381396064

s1836677006a

0e481036490867661113260034900752

s1091221200a

0e940624217856561557816327384675

s155964671a

0e342768416822451524974117254469

s1502113478a

0e861580163291561247404381396064

s155964671a

0e342768416822451524974117254469

s1665632922a

0e731198061491163073197128363787

s155964671a

0e342768416822451524974117254469

s1091221200a

0e940624217856561557816327384675

s1836677006a

0e481036490867661113260034900752

s1885207154a

0e509367213418206700842008763514

s532378020a

0e220463095855511507588041205815

s878926199a

0e545993274517709034328855841020

s1091221200a

0e940624217856561557816327384675

s214587387a

0e848240448830537924465865611904

s1502113478a

0e861580163291561247404381396064

s1091221200a

0e940624217856561557816327384675

s1665632922a

0e731198061491163073197128363787

s1885207154a

0e509367213418206700842008763514

s1836677006a

0e481036490867661113260034900752

s1665632922a

0e731198061491163073197128363787

s878926199a

0e545993274517709034328855841020

         sha1(str)
        sha1('aaroZmOk')  
        sha1('aaK1STfY')
        sha1('aaO8zKZF')
        sha1('aa3OFF9m')

同时MD5不能处理数组,若有以下判断则可用数组绕过

    if(@md5($_GET['a']) == @md5($_GET['b']))
    {
        echo "yes";
    }
————————————————

1、ereg()用途

ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。

可选的输入参数规则包含一个数组的所有匹配表达式,他们被正则表达式的括号分组。
2、题中ereg()正则限制了password的形式,只能是一个或者多个数字、大小写字母
3、strpos() 函数查找字符串在另一字符串中第一次出现的位置(区分大小写)
4、ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配
5、ereg()只能处理字符串的,遇到数组做参数返回NULL,判断用的是 === ,要求类型也相同,而NULL跟FALSE类型是不同的,strpos()的参数同样不能为数组,否则返回NULL,而判断用的是 !== ,所以这里的条件成立,也能得到flag

preg_match 函数用于执行一个正则表达式匹配。

语法:int preg_match ( string $pattern , string $subject )

pattern: 要搜索的模式,字符串形式。 subject: 输入字符串。

返回 pattern 的匹配次数。 它的值将是 0 次(不匹配)或 1 次,因为 preg_match() 在第一次匹配后 将会停止搜索。

preg_match:执行一个正则表达式匹配,匹配到则返回1,匹配不到则返回0。

preg_match_all:执行一个全局正则表达式匹配,返回成功模式匹配的次数,并将匹配结果存储到一个数组中。

两个函数的区别是preg match第一次匹配成功后就停止匹配,而preg match all是匹配到字符串结束为止。
 

if (md5($_GET['a']) === md5($_GET['b'])) die('Flag: '.$flag);

这句话的意思是传参a的值和b的值都先经过md5加密的值要求严格相等。

md5是不能处理数组的,md5(数组)会返回null,所以md5(a[])==null,md5(b[])==null,md5(a[])===md5(b[]) --> null === null 返回true,这样就得到flag了。

 

因此向GET传参两个名为a、b的不相等的数组,从而导致md5()均返回空,于是得到flag
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值