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注入漏洞:
- 加 ‘
无法得到查询结果! - 加 and 1=1
正常返回查询结果! - 加 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”时,同样成功登录!