报错注入
报错注入就是利用率数据库的某些机制,人为的制造错误条件,使得查询结果能够出现在错误的信息中
Updatexml()
函数用法:updatexml(XML_document,XPath_string,new_value);
XML_document 是String格式,为XML文档对象的名称,中文名为Doc
XPath_string XPath格式的字符串
new_value String格式,替换查找到的符合条件的数据
我们通常在第二个xpath参数填写我们要查询的内容。
Updatexml 是由于参数的格式不正确而产生的错误,同样也会返回会参数的信息。
Payload:updatexml(1,concat(0x7e(select user()),0x7e),1); 0x7e表示“~”
前后添加~使其不符合xpath的格式从而报错
Extractvalue()
函数用法:Extractvalue(XML_document,XPath_string);
原理与Updatexml()函数相同
Payload:Extractvalue(1,concat(0x7e(select user()),0x7e))
SQL盲注
分类:
布尔盲注--回显不同
时间盲注--响应时间不同
布尔状态例如:
1、回显不同(内容、长度)
2、HTTP响应状态码不同(200、500)
3、HTTP响应头变化(无条件重定向、设置cookie)
4、基于报错的布尔盲注(MySQL 是否报错)
认识盲注
Select*from users where id=’1’ and 1=1
Select*from users where id=’1’ and 1=2
上面的式子用来判断真假,则可以将1=1或者1=2进行替换,例子如下所示
Select*from users where id=’1’ and substr((select database()),1,1)=’a’
这句语句意思为查询数据库的第一个首字母再取一个字母的长度是否为a,以此类推猜测数据库首字母是哪一个字母。
然后在以此类推推出数据库的名称。
字符串的截取
Substr()、substring():
Substr(str,pos)
截取从第几个位置开始后的所有str字符串
Substr(str,pos,len)
截取某个位置的某个长度的str 字符串
如果过滤了逗号则用FROM 和FOR
例如substr(string,1,1)等同于substr(string FROM 1 FOR 1)
比较
1、Like
2、正则表达式regexp rlike
Regexp 是不区分大小写的,需要大小写敏感需要加上binary关键字
3、between
Sqlmap 工具注入
官网:sqlmap: automatic SQL injection and database takeover tool
下面将用一个靶场来演示如何用sqlmap 注入
靶场:CTFHub 环境实例 | 提示信息
打开sqlmap 输入下图的指令来探测有哪些数据库
探测出有如下数据库
接下来探测sqli 数据库里有哪些表,输入如下指令
探测有如下表
接下来探测flag 表中有哪些字段,输入如下指令
探测出有如下字段
接下来探测出字段里有哪些信息,输入如下指令
探测出信息如下
即可得到flag