SQL注入——报错注入
SQL注入——报错注入
0.前言
报错注入作为可回显注入的另外一种,当联合注入无法使用时,我们可以考虑使用报错注入。它是通过特殊函数错误使用并使其输出错误结果来获取信息的。通俗地讲,是利用了相关函数改变输出错误结果的情况下输出数据库的相关信息。
通过上述的话,也就能够知道,报错注入的前提是页面需要出现登录错误的信息。二针对报错函数的不同,也就有这多种多样的注入方式,所以当我们使用某种函数进行报错注入的时候,我们就需要去了解这个函数的构造。话不多说,直接举个”栗子“
对于UpdateXML()、ExtractValue()函数而言,参数xpath_expr路径语法错误时,就会反馈错误,将xpath_expr中内容当作sql语句执行后结果和报错结果一同返回。
对于floor()函数而言,则需要count()、rand()、group by,三者缺一不可。floor(rand(0)2)每次执行结果是基本固定的011011…形式。所以在使用group by floor(rand(0)2)创建虚拟表的过程中,会向虚拟表中插入数据的同时,主键的计算产生相同的结果,插入报错。
(下面将以BUUCTF中的HardSQL1为例)
1.初始界面
可以看见,拥有用户名和密码两个输入口,我们可以在这两个注入点做文章。
2.尝试or的注入
1 |
|
看到反馈了,说明注入是失败了,这说明我们是没办法使用联合注入了。但是有回显,我们此时想到了报错注入
3.使用updatexml函数获取数据库名
首先了解updatexml函数的构造
1 |
|
第一个参数xml_document是xml文档对象的名称,第二个参数xpath_string是xpath格式的字符串,第三个参数new_value,是替换查找到符合条件的数据。这个函数的作用是改变文档中符合条件的结点的值。
在注入语句时,可以搭配concat()函数使用,由于concat函数是将结果连成一个字符串的形式,因此不会符合xpath_string的格式,从而出现格式错误,导致相关的数据被爆出。
1 |
|
注入完一看,是error的内容中出现了geek,有戏,成功的将数据库名输出了
4.获取数据库表名
1 |
|
成功将表名输出,可以看到表名卫H4rDsq1。
5.获取表中的列名
1 |
|
成功获取列名,接下来根据列名查找内容
6.获取列中的信息
1 |
|
查询列的内容,找到了flag,但显然,是不完全的,所以需要拼接操作。
7.显示信息拼接
这里使用left()函数和right()函数进行拼接操作
1 |
|
1 |
|
8.其他(mysql报错注入类型参考网站)
https://www.jianshu.com/p/bc35f8dd4f7c
https://www.cnblogs.com/wocalieshenmegui/p/5917967.html
——通过注入进行DNS请求,从而达到可以回显的目的