SQL注入笔记(二)——实战

1.判断是否注入成功

编写了以下测试代码:

<!DOCTYPE html>
<html>
<head>

</head>
<body>
<?PHP
$id = $_GET['id'];
$conn=@mysqli_connect("localhost",'chen','密码') or die("数据库连接失败!");
mysqli_select_db($conn,"test") or die("您要选择的数据库不存在");
$sql="select * from examp where id=$id";
echo $id;echo '<br>';
echo $sql;echo '<br>';
$query=mysqli_query($conn,$sql);
$arr=mysqli_fetch_array($query);

echo 'ID: '.$arr[0];echo '<br>';
echo 'Name: '.$arr[1];echo '<br>';
echo 'Age: '.$arr[2];echo '<br>';
echo 'Gender: '.$arr[3];

?>
</body>
</html>

在浏览器输入地址可以得到查询结果:
在这里插入图片描述
假设我们并不知道后台具体代码,先判断是否存在SQL注入漏洞:

  1. 加 ‘
    无法得到查询结果
    无法得到查询结果!
  2. 加 and 1=1
    正常返回查询结果
    正常返回查询结果!
  3. 加 and 1=2
    无法获得查询结果
    无法得到查询结果!

至此,可以确定存在SQL注入漏洞。
ps:若后台查询语句为:

select * from examp where id=‘$id’

即多一个引号,此时应该用 ‘ and 1=’1 和 ‘ and 1=’2去测试。但是一般我们并不知道后台具体语句,所以在测试是否存在SQL注入漏洞时,应该两种方法都使用后再下结论!

判断的核心在于:添加的语句有没有被SQL执行,所以当url中并没有显示的输入信息时,也可以利用一些函数,比如sleep(3)来对比返回页面的效果差异,从而判断是否注入成功

2.常见注入方式及敏感信息

2.1. 利用union查看数据库信息
在这里插入图片描述
还可以查询到一些数据库元信息,例如:
在这里插入图片描述

2.2. 构造函数用来判断数据内容
例如增加以下SQL语句:

and ascii(substring((select concat(gender) from examp where id=1 limit 1),1,1))=109

就可以根据是否返回结果判断该人员是男性还是女性(m的ascii码为109)
在这里插入图片描述
1号为男性
在这里插入图片描述

2号不返回结果,说明2号为女性。
(有点画蛇添足,只为说明可以利用ascii码猜测数据库内容)
该实践可以判断第一gender列的第一个字母,同样的如果进行多次尝试,一步步缩小ASCII码的范围,即可判断password的每一个字符,从而威胁到密码安全!

2.3 利用系统允许的错误

MySQL默认情况下,对于插入数据必须满足列属性才能插入,否则返回error。但当设置sql_mode为非严格模式时,只会返回warning,能正常插入,只是会进行“长字符截断”。
在这里插入图片描述
如图,设置的user列属性为vachar(10),当插入数据‘chen a’超过10字符时,仍然成功插入,并返回一个warning。通过查看插入字符的长度,可以发现,插入新数据从10长度处被截断。

如果在验证用户时有以下逻辑代码:

select * from userpassword where user='chen';

插入的非法用户也满足查询条件:
在这里插入图片描述
从而可能进一步获得权限。

另外,同一用户名,在利用不同密码时都可以登录,登录逻辑代码如下:

<html>
<head>
<title>登录验证</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
<?php
$conn=@mysqli_connect("localhost",'chen','密码') or die("数据库连接失败!");;
mysqli_select_db($conn,"test") or die("您要选择的数据库不存在");
$name=$_POST['username'];
$pwd=$_POST['password'];
$sql="select * from userpassword where user='$name' and password='$pwd' ";
$query=mysqli_query($conn,$sql);
$arr=mysqli_fetch_array($query);
if(is_array($arr)){
echo 'welcome';
}else{
echo '您的用户名或密码输入有误';
}
?>
</body>
</html>

当用户名输入“chen”,密码输入我们刚刚插入的非法数据“11”时,同样成功登录!
在这里插入图片描述
在这里插入图片描述

发布了6 篇原创文章 · 获赞 1 · 访问量 199

猜你喜欢

转载自blog.csdn.net/qq_43161674/article/details/104487959
今日推荐