mysql注入

sql注入就是一种通过操作输入来修改后台操作语句,把sql命令插入到web表单递交或者输入域名或者页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,造成数据库信息泄露、损坏等后果。

我们都需要对用户输入的数据进行过滤处理。

有哪些类型?

 

 

(1)数字型注入点

  许多网页链接有类似的结构 http://www.example.com/12.php?id=1 基于此种形式的注入,一般被叫做数字型注入点,缘由是其注入点 id 类型为数字,在大多数的网页中,诸如 查看用户个人信息,查看文章等,大都会使用这种形式的结构传递id等信息,交给后端,查询出数据库中对应的信息,返回给前台。这一类的 SQL 语句原型大概为 select * from 表名 where id=1 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where id=1 and 1=1

  (2)字符型注入点

  网页链接有类似的结构 http://xwww.example.com/users.php?user=admin 这种形式,其注入点 user 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where user='admin' 值得注意的是这里相比于数字型注入类型的sql语句原型多了引号,可以是单引号或者是双引号。若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where user='admin' and 1=1 ' 我们需要将这些烦人的引号给处理掉。

  (3)搜索型注入点

  这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有 "keyword=关键字" 有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like '%关键字%' 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where 字段 like '%测试%' and '%1%'='%1%'

  sql注入有哪几种方式?所有的输入只要和数据库进行交互的,都有可能触发SQL注入,SQL注入按照数据提交的方式可分为:

  (1)GET 注入:提交数据的方式是 GET , 注入点的位置在 GET 参数部分。比如有这样的一个链接http://xxx.com/news.php?id=1 , id 是注入点。

  (2)POST 注入:使用 POST 方式提交数据,注入点位置在 POST 数据部分,常发生在表单中。

  (3)Cookie 注入:HTTP 请求的时候会带上客户端的 Cookie, 注入点存在 Cookie 当中的某个字段中。

  (4)HTTP 头部注入:注入点在 HTTP 请求头部的某个字段中。比如存在 User-Agent 字段中。严格讲的话,Cookie 其实应该也是算头部注入的一种形式。因为在 HTTP 请求的时候,Cookie 是头部的一个字段。

  根据提交方式分类后,你会发现SQL注入最长发生的位置在链接地址、数据参数、cookie信息以及HTTP请求头等位置。

  了解了可能存在SQL注入的位置,然后我们需要判断在这些位置上是否能够触发SQL注入,最简单的方式就是在相应位置输入and 1=1 (以及and 1=1 的变换形式)来判断。对于不同的注入点类型,比如字符型需要适当添加单引号,而对于数字型的注入点则不需要。

 

sql注入有哪几种方式?SQL注入的高级分类(按照执行效果分类)

  (1)基于布尔的盲注:即可以根据返回页面判断条件真假的注入。

  (2)基于时间的盲注:即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。

  (3)基于报错注入:即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。

  (4)联合查询注入:可以使用union的情况下的注入。

  (5)堆查询注入:可以同时执行多条语句的注入。

  (6)宽字节注入:利用gbk是多字节的编码,两个字节代表一个汉字

 

解决办法?

1、普通用户与系统管理员用户的权限要有严格的区分。

在权限设计中,对于终端用户,即应用软件的使用者,不提供数据库对象的建立、删除等权限。

2、强制使用参数化语句。

用户的输入的内容必须进行过滤,或者使用参数化的语句来传递用户输入的变量,而不是直接嵌入到SQL语句。

3、多使用SQL Server数据库自带的安全参数。

如在SQL Server数据库中提供了Parameters集合。这个集合提供了类型检查和长度验证的功能。如果管理员采用了Parameters这个集合的话,则用户输入的内容将被视为字符值而不是可执行代码。即使用户输入的内容中含有可执行代码,数据库也会过滤掉。因为此时数据库只把它当作普通的字符来处理。使用Parameters集合的另外一个优点是可以强制执行类型和长度检查,范围以外的值将触发异常,并报告给管理员。

4、加强对用户输入的验证。

总体来说,防治SQL注入式攻击可以采用两种方法,一是加强对用户输入内容的检查与验证;二是强迫使用参数化语句来传递用户输入的内容。

测试用户输入内容的大小和数据类型,强制执行适当的限制与转换。

如拒绝一些特殊的符号。如以上那个恶意代码中,只要存储过程把那个分号过滤掉。在不影响数据库应用的前提下,应该让数据库拒绝包含以下字符的输入。如分号分隔符,它是SQL注入式攻击的主要帮凶。如注释分隔符。

5、多层环境如何防治SQL注入式攻击?

 

posted @ 2022-11-09 16:06  sodium酱  阅读(1236)  评论(0编辑  收藏  举报