sql注入总结(1)--------分类和基础思路方法以及防护

一,注入分类

(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 截断字符(提取)

盲注不回显,一般为判断长度,要用到截断字符和编码判断字符

sql阶段字符方法

三大法宝: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语句的一部分,数据库只按语句的语义跑。

发布了49 篇原创文章 · 获赞 33 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Z_Grant/article/details/100167818
今日推荐