精华内容
下载资源
问答
  • [CTF] 关于php代码审计MD5类的练习

    千次阅读 2021-12-03 19:27:09
    练习1 PHP代码: <?php error_reporting(0); highlight_file("pass-01.php"); if(isset($_GET["pass"])){ ...= hash("md4", $_GET["pass"])){ die('fail~~~'); }else{ echo "success!!!<br>";

    练习1

    PHP代码:

     <?php
        error_reporting(0);
        highlight_file("pass-01.php");
    
        if(isset($_GET["pass"])){
            if($_GET["pass"] != hash("md4", $_GET["pass"])){
                die('fail~~~');
            }else{
                echo "success!!!<br>";
                echo file_get_contents('flag.txt')."\n";
                echo "<a href='pass-02.php'>下一关</a>";
            }
        }else{
            echo "please input the pass";
        }
    ?> please input the pass
    

    函数解析:

    isset()   // 检测变量是否已声明且值不为NULL
    

    代码审计:

    pass传入的值和经过md4加密的值相等得到flag
    

    解题:

    MD4碰撞得:0e251288019
    
    ∴ pass=0e251288019
    

    练习2

    PHP代码:

     <?php
        error_reporting(0);
        highlight_file("pass-02.php");
    
        if(isset($_GET['user']) && isset($_GET['pass'])){
            $user = $_GET['user'];
            $pass = $_GET['pass'];
    
            if($user != $pass && md5($user) == md5($pass)){
                echo "success!<br>";
                echo file_get_contents('flag.txt')."\n";
                echo "<a href='pass-03.php'>下一关</a>";
            }else{
                echo "fail~~~";
            }
    
        }else{
            echo "please input the user and pass!"."\n";
        }
    ?> please input the user and pass!
    

    代码审计:

    通过get方式获得的user和pass值不相等且两者经过MD5加密后的值相等
    

    解题:

    传入数组,默认MD5(数组)返回NULL
    
    用数组绕过得:
    http://……/?user[]=1&pass[]=2
    

    练习3

    PHP代码:

     <?php
        error_reporting(0);
        highlight_file("pass-03.php");
    
        if(isset($_GET['user']) && isset($_GET['pass'])){
            $user = $_GET['user'];
            $pass = $_GET['pass'];
    
            if(!ctype_alpha($user) && !is_numeric($pass) && md5($user) == md5($pass)){
                echo "success!<br>";
                echo file_get_contents('flag.txt')."\n";
                echo "<a href='pass-04.php'>下一关</a>";
            }else{
                echo "fail~~~";
            }
    
        }else{
            echo "please input the user and pass!"."\n";
        }
    ?> please input the user and pass! 
    

    函数解析:

    ctype_alpha()   // 用于检测所给参数是不是字母
    is_numeric()   // 用于检测变量是否为数字或字符串
    

    代码审计:

    函数前加“ !”表示返回false
    user不是字母且pass不是数字和数字字符串
    且二者MD5加密后值相等
    
    同样用数组绕过得
    http://……/?user[]=0&pass[]=a
    

    练习4

    PHP代码:

     <?php
        error_reporting(0);
        highlight_file("pass-04.php");
    
        if(isset($_GET['user']) && isset($_GET['pass'])){
            $user = $_GET['user'];
            $pass = $_GET['pass'];
    
            if($user != $pass && md5($user) == md5(md5($pass))){
                echo "success!<br>";
                echo file_get_contents('flag.txt')."\n";
                echo "<a href='pass-05.php'>下一关</a>";
            }else{
                echo "fail~~~";
            }
    
        }else{
            echo "please input the user and pass!"."\n";
        }
    ?> please input the user and pass! 
    

    代码审计:
    该题使用了MD5二次加密,条件没有太多的限制,主要要解决的是

    md5($user) == md5(md5($pass))
    

    化简得:

    $user == md5($pass)
    

    可以写一串php代码:

    <?php
        echo md5(1);
        echo "<br>";
        echo md5(md5(1));
    ?>
    

    结果是:

    c4ca4238a0b923820dcc509a6f75849b
    28c8edde3d61a0411511d3b1866f0636
    

    最后答案为:

    http://……/?user=c4ca4238a0b923820dcc509a6f75849b&pass=1
    

    注意:观察下面两个地址

    http://192.168.1.1/pass-04/?user=c4ca4238a0b923820dcc509a6f75849b&pass=1
    http://192.168.1.1/pass-04/?user=c4ca4238a0b923820dcc509a6f75849b &pass=1
    

    这两个地址传入的user值是不一样的,第二个地址在“&pass=1”前多了个空格,这会导致user会多传一个空格进去,就和md5(md5(1))的的值不一样了

    练习5

    PHP代码:

     <?php
        error_reporting(0);
        highlight_file("pass-05.php");
    
        if(isset($_GET['user']) && isset($_GET['pass'])){
            $user = $_GET['user'];
            $pass = $_GET['pass'];
    
            if($user != $pass && md5($user) === md5(md5($pass))){
                echo "success!<br>";
                echo file_get_contents('flag.txt')."\n";
                echo "<a href='pass-06.php'>下一关</a>";
            }else{
                echo "fail~~~";
            }
    
        }else{
            echo "please input the user and pass!"."\n";
        }
    ?> please input the user and pass! 
    

    代码审计:
    主要难点是:

    md5($user) === md5(md5($pass))
    

    与第4题相似,来看一下几个等于号的区别

    ===比较两个变量的值和类型
    ==比较两个变量的值,不比较数据类型
    

    最后答案为:

    http://……/?user=c4ca4238a0b923820dcc509a6f75849b&pass=1
    

    练习6

    PHP代码:

     <?php
        error_reporting(0);
        highlight_file("pass-06.php");
    
        if(isset($_GET['user']) && isset($_GET['pass'])){
            $user = (string)$_GET['user'];
            $pass = (string)$_GET['pass'];
    
            if($user != $pass && md5($user) == md5(md5($pass))){
                echo "success!<br>";
                echo file_get_contents('flag.txt')."\n";
                echo "<a href='pass-07.php'>下一关</a>";
            }else{
                echo "fail~~~";
            }
    
        }else{
            echo "please input the user and pass!"."\n";
        }
    ?> please input the user and pass!
    

    不做过多解释
    最后答案为:

    http://……/?user=c4ca4238a0b923820dcc509a6f75849b&pass=1
    

    练习7

    PHP代码:

     <?php
        error_reporting(0);
        highlight_file("pass-07.php");
    
        if(isset($_GET['user']) && isset($_GET['pass'])){
            $user = $_GET['user'];
            $pass = $_GET['pass'];
    
            if($user !== $pass && md5($user) === md5($pass)){
                echo "success!<br>";
                echo file_get_contents('flag.txt')."\n";
                echo "<a href='pass-08.php'>下一关</a>";
            }else{
                echo "fail~~~";
            }
    
        }else{
            echo "please input the user and pass!"."\n";
        }
    ?> please input the user and pass! 
    

    不做过多解释直接数组绕过
    最后答案为:

    http://……/?user[]=0&pass[]=1
    

    练习8

    PHP代码:

     <?php
        error_reporting(0);
        highlight_file("pass-08.php");
    
        class auth{
            public $user;
            public $pass;
    
            public function __destruct(){
    
                $this->user = (string)$this->user;
                if(strlen($this->user) > 3 || strlen($this->pass) >3){
                    echo "level1 is fail~~~";
                }
                if($this->user !== $this->pass && $this->user != $this->pass && md5($this->user) === md5($this->pass)){
                    echo "success!<br>";    
                    echo file_get_contents("flag.txt");
                }else{
                    echo "level2 is fail~~~";
                }
            }
        }
        unserialize($_POST['auth']);
    ?> 
    

    函数解析:

    __destruct()   // 析构函数的作用和构造函数正好相反,析构函数只有在对象被垃圾收集器收集前(即对象从内存中删除之前)才会被自动调用。析构函数允许我们在销毁一个对象之前执行一些特定的操作,例如关闭文件、释放结果集等。
    strlen()   // 返回字符串长度
    unserialize()   // 函数用于将通过 serialize() 函数序列化后的对象或数组进行反序列化,并返回原始的对象结构
    

    解题:
    因为最后进行是POST输入后进行反序列化,所以我们要构造一个与本题代码相似的进行序列化

    <?php
    
        class auth
        {
            public $user;
            public $pass;
        }
    
        $a = new auth();
        $a->user = NAN;
        $a->pass = NAN;
        echo serialize($a);
    
    ?>
    

    输出结果为:

    O:4:"auth":2:{s:4:"user";d:NAN;s:4:"pass";d:NAN;}
    

    POST提交方式提交最后答案为:

    auth=O:4:"auth":2:{s:4:"user";d:NAN;s:4:"pass";d:NAN;}
    

    知识点:
    1、关于NAN和INF

    NAN 代表非合法数值
    INF 代表无穷大
    

    2、NAN

    NAN === (string)NAN   // 为假
    
    展开全文
  • 代码审计-md5()函数

    2019-10-02 01:01:56
    php error_reporting(0); $flag = 'flag{test}'; if (isset($_GET['username']) and isset($_GET['password'])) { if ($_GET['username'] == $_GET['password']) print 'Your password can not be ...
    <?php
    error_reporting(0);
    $flag = 'flag{test}';
    if (isset($_GET['username']) and isset($_GET['password'])) {
    if ($_GET['username'] == $_GET['password'])
    print 'Your password can not be your username.';
    else if (md5($_GET['username']) === md5($_GET['password']))
    die('Flag: '.$flag);
    else
    print 'Invalid password';
    }
    ?>

    username和password不能相同,但是md5又要一致

    md5函数存在漏洞,md5不识别数组,返回null,可以进行绕过

    同样sha1函数也存在这个漏洞

    payload

    http://123.206.87.240:9009/18.php?username[]=1&password[]=2

    得到

    Flag: flag{bugk1u-ad8-3dsa-2}

     

    转载于:https://www.cnblogs.com/gaonuoqi/p/11406954.html

    展开全文
  • =password && md5(username)===md5(password) md5() 函数计算字符串的 MD5 散列 松散比较:使用两个等号 == 比较,只比较值,不比较类型。 严格比较:用两个等号 === 比较,除了比较值,也比较类型。 构造 ...

    error_reporting(0);

    $flag = 'flag{test}';

    if (isset($_GET['username']) and isset($_GET['password'])) {

    if ($_GET['username'] == $_GET['password'])

    print 'Your password can not be your username.';

    else if (md5($_GET['username']) === md5($_GET['password']))

    die('Flag: '.$flag);

    else

    print 'Invalid password';

    }

    ?>

    读代码,本题的意思就是使username!=password    &&    md5(username)===md5(password)

    md5() 函数计算字符串的 MD5 散列

    松散比较:使用两个等号 == 比较,只比较值,不比较类型。

    严格比较:用两个等号 === 比较,除了比较值,也比较类型。

    构造

    http://123.206.87.240:9009/18.php?username[]=1&password[]=0

    2b58e4d4b09ca4ad984acceca59d14a0.png

    http://123.206.87.240:9009/18.php?username[]=a&password[]=b

    7d03a3afbc8aa89cbaece5b0f568a238.png

    展开全文
  • Bugku—PHP代码审计md5函数 <?php error_reporting(0); $flag = 'flag{test}'; if (isset($_GET['username']) and isset($_GET['password'])) { if ($_GET['username'] == $_GET['password']) print 'Your ...

    Bugku—PHP代码审计—md5函数

    <?php
    error_reporting(0);
    $flag = 'flag{test}';
    if (isset($_GET['username']) and isset($_GET['password'])) {
    if ($_GET['username'] == $_GET['password'])
    print 'Your password can not be your username.';
    else if (md5($_GET['username']) === md5($_GET['password']))
    die('Flag: '.$flag);
    else
    print 'Invalid password';
    }
    ?>
    

    三个等号直接数组绕过呗
    payload:?username[]=1&password[]=2

    等号后面不能一样

    展开全文
  • 一进来就是PHP代码审计。 <?php include"url.php"; highlight_file(__FILE__); $a[0] = 'wenhua3104'; $id = $_GET['id']; //传入ID参数 @parse_str($id); //将变量ID进行参数化。... md5($a[0]) == md5...
  • PHP 绕过md5()函数比较

    2019-10-31 21:39:04
    存在如下方法: 1、PHP在处理哈希字符串,存在一个缺陷, 它会把以“0e”...下面给出经过md5()函数哈希后以“0e”开头的字符串: String md5 s1885207154a 0e509367213418206700842008763514 s1836677006a...
  • bugku_PHP代码审计md5加密相等绕过 <?php $md51 = md5('QNKCDZO'); $a = @$_GET['a']; $md52 = @md5($a); if(isset($a)){ if ($a != 'QNKCDZO' && $md51 == $md52) { echo "flag{*}"; } else { echo ...
  • $md51 = md5('QNKCDZO'); $a = @$_GET['a']; $md52 = @md5($a); if(isset($a)){ if ($a != 'QNKCDZO' && $md51 == $md52) { echo "flag{*}"; } else { echo "false!!!"; }} else{...
  • 通过get得到三个值,v1,v2,v3。...先解决第一层,phpMD5函数漏洞: ①通过== 或者 !=比较两个哈希字符串的时候,如果哈希字符串都以0E开头,则会判断相等。 ②MD5不能比较数组,比如v1[]=1,v2[]=2,M...
  • 【CTF】关于md5总结

    2021-08-13 10:18:06
    > </body> 代码审计:输入v1,v2的值,使两者的md5值以0e开头,在PHP中0e会被当做科学计数法,最后以0做处理,使结果相等,成功绕过,而且v1为字符,v2为数字 输入/?v1=QNKCDZO&v2=240610708成功拿到flag 强类型比较...
  • 今天在做关于代码审计的问题遇到了一些问题,现在记录下来并分享,可能是我太笨了,有些问题一直没有明白==对比的时候会进行数据转换,0eXXXXXXXXXX 转成0了,如果比较一个数字和字符串或者比较涉及到数字内容的字符...
  • 代码审计_md5()函数

    2019-02-15 19:33:00
    题目链接:... 题解: 打开题目 其PHP代码如下: ...error_reporting() 函数:http://www.w3school.com.cn/php/func_error_reporting.asp ...比较运算符(== 和 ===):http://www.php.net/ma...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,408
精华内容 1,363
关键字:

md5php审计