通过上一章,学习了MySQL注入的步骤,这一章进行练习。
PHP代码:与上一章不同,不同之处请看代码注释
<?php
header('content-type:text/html;charset=utf-8');
@$id=$_GET['id']; //传参
if(!isset($id)){
die('请传入GET方法id参数值');
}
$mysqli=new mysqli();
$mysqli->connect('localhost','root','root');
if($mysqli->connect_errno){
die('连接数据库失败:'.$mysqli->connect_error);
}
$mysqli->select_db('user');
if($mysqli->errno){
die('打开数据库失败:'.$mysqli->error);
}
$mysqli->set_charset('utf8');
$sql="SELECT username,passwd FROM users WHERE id={$id} limit 0,1"; //添加了limit语句
$result=$mysqli->query($sql);
if(!$result){
die('执行SQL语句失败:'.$mysqli->error);
}else if($result->num_rows==0){
die('查询结果为空');
}else {
$array1=$result->fetch_all(MYSQLI_ASSOC);
//无论有多少条记录,只显示第一行记录
echo '用户名:'.$array1[0]['username'].'<br />'.'密码:'.$array1[0]['passwd'].'<br />';
}
判断注入点
进行了运算操作,%23是mysql注释符#的编码,因为在实际测试中,你并不知道SQL语句后面还写了什么,为了方便判断,直接注释后面的语句。
进行了逻辑运算
进行了数学函数运算
猜字段长度
可得知,当前查询语句为2个字段
进行联合查询
这里要注意一点,因为代码设置了只能显示一行记录,为了显示union后面的记录,故要把前面的查询记录设置为空,所以这里ID=-1
注意:因为只能显示一条记录,故这里用limit语句控制记录行数。
闭合SQL语句
在其它情况中,关键是如何拼接SQL语句的,在SQL注入中就要闭合相关语句,可通过报错信息查看拼接信息。如果不显示报错信息,则只有FUZZ了。
$sql="SELECT username,passwd FROM users WHERE id={$id} limit 0,1";
$sql="SELECT username,passwd FROM users WHERE id='{$id}' limit 0,1";
$sql="SELECT username,passwd FROM users WHERE id=({$id}) limit 0,1";
$sql="SELECT username,passwd FROM users WHERE id='({$id})' limit 0,1";
......