PHP语言学习之PHP黑魔法
小标 2019-04-30 来源 : 阅读 2033 评论 0

摘要:本文主要向大家介绍了PHP语言学习之PHP黑魔法,通过具体的内容向大家展示,希望对大家学习php语言有所帮助。

本文主要向大家介绍了PHP语言学习之PHP黑魔法,通过具体的内容向大家展示,希望对大家学习php语言有所帮助。

PHP语言学习之PHP黑魔法

这里必须得说一下==和===这俩货的重要性。
==是比较运算,它不会去检查条件式的表达式的类型
===是恒等,它会检查查表达式的值与类型是否相等
NULL,0,”0″,array()使用==和false比较时,都是会返回true的,而使用===却不会
这个基础知识点大家应该都知道,所以提一下,下面就不会再拿出来说了。

数组

0x01
很多时候,PHP数组都发挥了至关重要的作用,先来看下BOSTEN KEYPARTY中的一道题:

 

Default

 

1

2

3

4

5

6

7

8

if (isset($_GET[‘name‘]) and isset($_GET[‘password‘])) {

    if ($_GET[‘name‘] == $_GET[‘password‘])

        print ‘Your password can not be your name.‘;

    else if (sha1($_GET[‘name‘]) === sha1($_GET[‘password‘]))

        die(‘Flag: ‘.$flag);

    else

        print ‘Invalid password‘;

}

这道题,我们首先要确保name和password的值不能相同,其次,sha1加密之后的name和password的值又必须完全相同 我们知道,这时的a[0] = 1;所以name[] = 1和password[]= 2相比较,可以跳过第一个判断,而如果使用sha1对一个数组进行加密,返回的将是NULL,NULL===NULL,这是成立的,所以构造两个数组,成功拿到flag

0x02
再看bosten keyparty上的另外一道题:

 

Default

 

1

2

3

4

5

6

if (isset($_GET[‘password‘])) {  

    if (strcmp($_GET[‘password‘], $flag) == 0)  

        die(‘Flag: ‘.$flag);  

    else  

        print ‘Invalid password‘;  

}

这里,使用strcmp去比较password和flag,如果==0的话,就给出flag,但是strcmp比较,如果相等才会返回0,如果不相等的话,要么大于0,要么小于0,但是strcmp只会处理字符串参数,如果给个数组的话呢,就会返回NULL,而判断使用的是==,NULL==0是bool(true)的,所以,这道题还是一如既往构造一个数组进去

0x03
bosten keyparty上的又又一道题:

 

Default

 

1

2

3

4

5

6

7

8

if (isset ($_GET[‘password‘])) {  

    if (ereg (""^[a-zA-Z0-9]+[        DISCUZ_CODE_2        ]quot;, $_GET[‘password‘]) === FALSE)  

        echo ‘You password must be alphanumeric‘;  

    else if (strpos ($_GET[‘password‘], ‘--‘) !== FALSE)  

        die(‘Flag: ‘ . $flag);  

    else  

        echo ‘Invalid password‘;  

}

这道题有两种做法,我们还是先说数组 ereg是处理字符串的,所以,按照原理,我们将password构造一个arr[],传入之后,ereg是返回NULL的,===判断NULL和FALSE,是不相等的,所以可以进入第二个判断,而strpos处理数组,也是返回NULL,注意这里的是!==,NULL!==FALSE,条件成立,拿到flag, 第二种做法,ereg读到%00的时候,就截止了,所以可以构造s%00–,也能拿到flag(这也算是一个黑魔法吗?哈哈)

数字的比较

0x01
wechall上的一道题:

 

Default

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

function noother_says_correct($number)

{

        $one = ord(‘1‘);

        $nine = ord(‘9‘);

        // Check all the input characters!

        for ($i = 0; $i < strlen($number); $i++)

        {

                // Disallow all the digits!

                $digit = ord($number{$i});

                if ( ($digit >= $one) && ($digit <= $nine) )

                {

                        // Aha, digit not allowed!

                        return false;

                }

        }

       return $number == ""3735929054"";

}

这里,它不让输入1到9的数字,但是后面却让比较一串数字,平常的方法肯定就不能行事了,大家都知道计算机中的进制转换,当然也是可以拿来比较的,0x开头则表示16进制,将这串数字转换成16进制之后发现,是deadc0de,在开头加上0x,代表这个是16进制的数字,然后再和十进制的3735929054比较,答案当然是相同的,返回true拿到flag

0x02
看安全宝约宝妹的一道题:

 

Default

 

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言PHP频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved