【php代码审计】SQL注入

环境代码:

<?php
$host = "127.0.0.1";
$user = "root";
$pass = "root";
$db = "mysql";
$conn = mysqli_connect($host,$user,$pass,$db);
echo $id=mysqli_real_escape_string($conn,$_GET['id']);
$sql = "select * from all_user where user=$id";
if($row=mysqli_query($conn,$sql)) {
    $rows=mysqli_fetch_array($row);
    var_dump($rows);
}
?>
 

防止被注入

开启gpc或者使用mysqli_real_escape_string()或者addslashes()[可以被绕过]

绕过addslashes()

环境代码

<!DOCTYPE html>
<HTML>
<head>
<title>过滤函数和类---addslashes()函数</title>

</head>
<body>
<p>addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。预定义字符是单引号(')双引号(")反斜杠(\)NULL</p><br/>
<form action="" method="POST">
Username : <input type="test" name = "username"><br/>
Password : <input type="Password" name = "password"><br/>
<input type="submit" value="Nest"><br/>
</from>
<?php
function deep_addslashes($str)
{
    if(is_array($str))
    {
        foreach($str as $key=>$val)
        {
            $str[$key] = deep_addslashes($val);
        }
    }
    else
    {
        $str = addslashes($str);
    }
    return $str;
}
$username = $_POST["username"];
$password = $_POST["password"];
if (empty("$username") or empty("$password"))
{
    die("输入字符不能为空");
}
echo '$_POST接收后的username值:';
echo "$username";
echo "<br/>";
//echo $password;
$connect_sql = mysqli_connect("127.0.0.1",'root','root','mysql');
if (mysqli_connect_errno($connect_sql))
{
    echo "连接数据库失败".mysqli_connect_errno;
}
mysqli_query($connect_sql,"SET NAMES 'GBK'");
$user = deep_addslashes("$username");
$user = urldecode($user);
$password = md5($password);
$sql = "select pass from all_user where user = '$user'";
echo "查询语句:";
echo "select pass from all_user where user = '$user'";
echo "<br/>";
$result = mysqli_query($connect_sql,$sql);
echo "登陆输出结果:";
if (mysqli_fetch_row($result))
{
    echo "成功登陆";
}else
{
    echo "账号或密码错误";
}
mysqli_close($connect_sql);
?>
</body>
</HTML>

当后台登录框同时使用了addslashes()和urldecode的时候(其他类型的解密也可以),因为addslashes没有过滤%所以可以恶意代码url转码

还有一个方法就是宽字节注入,当数据库使用GBK编码,\和%df会被结合为一个字符

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值