基于错误的SQL注入

最前面的话

  • 预备知识
    • SQL基础知识,包括数据库增、删、改、查等SQL基础语句以及聚合函数、子查询等一些高级语法。
    • 编程知识,包括使用编程语言提供的操纵数据库接口,如PHP中的mysql系列函数。
  • 文章以sqli-labs作为学习环境,大家可以在本地下载安装
  • 文章会努力从如何攻击、剖析原因、防范横向叙述,从读取数据、提权纵向延伸。
  • 文章会定期更新,也是对自己学习的监督。
  • 文中不当之处,敬请指出,望不吝赐教。

第一篇文章先介绍基于错误的SQL注入,简言之,输入畸形数据后,我们可以回显的错误信息,我们根据错误信息帮助我们进行注入。本文结构如下:

概要

  • 联合查询 Union Select
    • 字符型 String
    • 整型 Intiger
    • 手工注入攻击
  • 子查询或双查询 Double

联合查询 Union Select

字符型 String

攻击测试

sqli-labs中less-1 Error Based-String,我们输入?id=1,正常显示用户名和密码。输入畸形数据?id=1’,报错如下:

1
2
You have an error in your SQL syntax; check the manual that corresponds to your MySQL
server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1

错误中提示,我们在SQL语法错误,在第一行的’’1’’ LIMIT 0,1’附近。其中,‘1’的两边有单引号,由于我们刚才在1的后面加的单引号,导致解析异常。通过错误我们发现,在SQL语句中,参数1是作为字符串进行查询的,故我们把这种类型的SQL注入称之为基于错误的字符型注入。注:可以是单引号、双引号

源代码分析

SQL语句:

1
SELECT * FROM users WHERE id='$id' LIMIT 0,1;

输入正常是SQL语句:

1
SELECT * FROM users WHERE id='1' LIMIT 0,1;

畸形数据时SQL语句:

1
SELECT * FROM users WHERE id='1'' LIMIT 0,1;

通过上述两条SQL语句,是把id作为字符形式进行查询,故可以理解为基于错误的字符型注入。
那么错误是怎么显示出来的?在源代码有一下语句:

1
2
3
4
5
6
7
8
9
10
11
12
13
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
#var_dump($row);
if($row)
{
...
}
else
{
echo '<font color= "#FFFF00">';
print_r(mysql_error());
echo "</font>";
}

print_r(mysql_error())语句在异常时,输出错误信息。
通过上面简单的源代码分析,可以理解基于错误的字符型注入

整型 Intiger

基于错误的整型注入和上面类似。简要叙述。

攻击测试

sqli-labs中less-2 Error Based-Intiger,我们输入?id=1,正常显示用户名和密码。输入畸形数据?id=1’,报错如下:

1
2
You have an error in your SQL syntax; check the manual that corresponds to your MySQL
server version for the right syntax to use near '' LIMIT 0,1' at line 1

注意!上述报错信息与上一条有区别。对比如下:
第一条 ‘1’’ LIMIT 0,1
第二条 ‘ LIMIT 0,1
第一条中1,第二条中没有。说明第二条中,我们输入的单引号没有打乱原本的单引号闭合策略。详细看源代码分析。

源代码分析

SQL语句:

1
SELECT * FROM users WHERE id=$id LIMIT 0,1;

正常试:

1
SELECT * FROM users WHERE id=1 LIMIT 0,1;

异常时:

1
SELECT * FROM users WHERE id=1' LIMIT 0,1;

这里id以整型带入SQL语句查询。故理解为基于错误的整型注入

手工注入攻击

子查询 Double