那些年咱们学过的PHP黑魔法

那些年咱们学过的PHP黑魔法序
这儿有必要得说一下==和===这俩货的重要性。==是比较运算,它不会去查看条件式的表达式的类型===是恒等,它会查看查表达式的值与类型是否持平NULL,0,”0″,array()运用==和


这儿有必要得说一下==和===这俩货的重要性。==是比较运算,它不会去查看条件式的表达式的类型===是恒等,它会查看查表达式的值与类型是否持平NULL,0,”0″,array()运用==和false比较时,都是会...


这儿有必要得说一下==和===这俩货的重要性。==是比较运算,它不会去查看条件式的表达式的类型===是恒等,它会查看查表达式的值与类型是否持平NULL,0,”0″,array()运用==和false比较时,都是会回来true的,而运用===却不会这个根底知识点咱们应该都知道,所以提一下,下面就不会再拿出来说了。
数组
0x01许多时分,PHP数组都发挥了至关重要的效果,先来看下BOSTEN KEYPARTY中的一道题:
Default
if (isset($_GET['password'])) {
    if ($_GET['password'])
        print 'Your password can not be your name.';
    else if (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
if (isset($_GET['password'], flag); 
    else 
        print 'Invalid password'; 

这儿,运用strcmp去比较password和flag,假如==0的话,就给出flag,可是strcmp比较,假如持平才会回来0,假如不持平的话,要么大于0,要么小于0,可是strcmp只会处理字符串参数,假如给个数组的话呢,就会回来NULL,而判别运用的是==,NULL==0是bool(true)的,所以,这道题仍是自始自终结构一个数组进去
0x03bosten keyparty上的又又一道题:
Default
if (isset ($_GET['password'])) { 
    if (ereg ("^[a-zA-Z0-9]+$_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(这也算是一个黑魔法吗?哈哈)
数字的比较
0x01wechall上的一道题:
Default
function noother_says_correct(one = ord('1');
        $nine = ord('9');
        // Check all the input characters!
        for (i < strlen(i++)
        {
                // Disallow all the digits!
                number{digit >= digit <= $nine) )
                {
                        // Aha, digit not allowed!
                        return false;
                }
        }
       return $number == "3735929054";
}
这儿,它不让输入1到9的数字,可是后边却让比较一串数字,往常的办法必定就不能行事了,咱们都知道计算机中的进制转化,当然也是能够拿来比较的,0x最初则表明16进制,将这串数字转化成16进制之后发现,是deadc0de,在最初加上0x,代表这个是16进制的数字,然后再和十进制的3735929054比较,答案当然是相同的,回来true拿到flag
0x02看安全宝约宝妹的一道题:
Default
_SERVER['REQUEST_METHOD'])
{
    _POST['password'];
    if (0 >= preg_match('/^[[:graph:]]{12,}password))
    {
        echo 'Wrong Format';
        exit;
    }
    while (TRUE)
    {
        $reg = '/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/';
        if (6 > preg_match_all(password, c = 0;
        $ps = array('punct', 'digit', 'upper', 'lower');
        foreach (pt)
        {

[1] [2]  黑客接单网

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/9534.html

(0)

相关推荐