SQL注入–报错型
靶场:sqli-labs-master
下载链接:
靶场下载连接
第一关源码
<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
// take the variables
if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
// connectivity
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
echo $sql; //自己添加的,方便观察原理
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo "<font size='5' color= '#99FF00'>";
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo 'Your Password:' .$row['password'];
echo "</font>";
}
else
{
echo '<font color= "#FFFF00">';
print_r(mysql_error());
echo "</font>";
}
}
else { echo "Please input the ID as parameter with numeric value";}
?>
使用get方式传参,首先在url栏中直接构造get请求
会把相应id的信息查询出来
然后观察sql语句,我们可以尝试单引号进行闭合
出现报错
也就是说此时执行的是:
SELECT * FROM users WHERE id=''' LIMIT 0,1
也就是说前两个单引号已经被闭合,但是第三个单引号没有闭合所以出现报错,通过这种报错,我们就可以确定我们的查询请求被带到了sql语句中,所以可以确定这里是存在sql注入的
此时先使用order by猜字段数
语句为:?id=’ order by 5 %23(%23指#,代表将后面的sql语句注释掉,由于是在url栏中输入,故采用url编码后的%23,也可以使用–+,+代表空格,编码为%20)
出错提示第5列并不存在,说明字段数不是5个
经过猜解(?id=1’ order by 3 %23),字段数为3个
然后开始猜测回显点
使用联合查询:?id=’ union select 1,2,3 %23
可以知道回显点为字段2和3 ,第一个字段无法得知
故可以在第2个和第3个字段上进行查询
例如查询数据库和版本信息
?id=’ union select 1,database(),version() %23
知识补充:
information_schema库,mysql数据库自带,用来保存所有信息,它包含所有数据库的信息,在sql注入时,常被用来辅助查询所需要的信息,比如,information_schema中的tables保存了所有数据库中的表的信息
查询此数据库中所有的表和用户
?id=’ union select 1,group_concat(table_name),user() from information_schema.tables where table_schema=database() %23
(group_concat函数用于把要查询的字段全部输出到一起,默认用逗号分隔)
这样就通过information_shema查询出来当前数据库中的所有表的名称
获取到表名后,就可以就表中的数据进行诈取
同样通过information_schema进行获取,information_schema中有一个columns表,保存了所有表的字段信息,可以通过其中的COLUMN_NAME对上面已经获取到的表的字段进行查询
例如查询emails表中的字段信息:?id=’ union select 1,group_concat(column_name),user() from information_schema.columns where table_name=‘emails’ %23
得到emails表中有2个字段,为id 和 email_id
得到字段名后,就可以直接使用联合查询对相应的数据表进行数据查询
?id=’ union select 1,id,email_id from emails limit 0,1 %23
总结:报错注入可以使用’ ,”, )’ 等进行尝试,目的就是要确定该是否存在注入可能,从报错信息中获取一些可以利用的信息从而进行注入。