您现在的位置是:首页 > 学无止境 > 杂七杂八 网站首页学无止境

PHP 各种绕过(小结)

一:strcmp()漏洞

int strcmp ( string $str1 , string $str2 )

strcmp()是用于比较字符串的函数,参数 str1第一个字符串。str2第二个字符串。如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0;

可知,传入的期望类型是字符串类型的数据,但是如果我们传入非字符串类型的数据的时候,这个函数将发生错误,但是在5.3之前的php中,显示了报错的警告信息后,将return 0!也就是说,虽然函数报错了,但最终结果却是判断相等了!因此我们只需要传入一个数组结构的参数就可以成功绕过验证。如:shiyan[]=1


二:sha1() 和md5()绕过

sha1()和md5()处理数组是不会报错,而是直接返回false,因此我们在面对类似于

<?php 
highlight_file('flag.php'); 
$_GET['id'] = urldecode($_GET['id']); 
$flag = 'flag{xxxxxxxxxxxxxxxxxx}'; 
if (isset($_GET['uname']) and isset($_POST['passwd'])) { 
    if ($_GET['uname'] == $_POST['passwd'])

        print 'passwd can not be uname.'; 

    else if (sha1($_GET['uname']) === sha1($_POST['passwd'])&($_GET['id']=='margin')) 

        die('Flag: '.$flag); 

    else 

        print 'sorry!'; 

} 
?>

绕过sha1()验证时可以通过构造数组来绕过,如 ?uname[]=1&id=margin 然后post提交 passwd[]=1 来绕过

同理,遇见类似这样的md5()验证也可以按此方法绕过


三:ereg() %0截断和strpos()数组绕过

<?php
$flag = "flag";

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有两个漏洞:

    ①%00截断及遇到%00则默认为字符串的结束

    ②当$_GET['password']为数组时它的返回值不是FALSE,而是null,三个等号的时候不会进行类型转换。所以null不等于false。

strpos的参数同样不能够是数组,所以返回的依旧是null,null不等于false也是正确。

 

文章评论

Top