您现在的位置是:网站首页 > 心得笔记

sql注入

盛悦2019-03-05750人围观
简介什么是sql注入?sql注入是如何产生的?如何寻找sql注入漏洞?如何进行sql注入攻击?

什么是sql注入?

sql注入定义:sql注入是一种将sql代码添加到输入参数中,传递到sql服务器解析并执行的一种攻击手法。用大白话来讲呢?就是sql参数未经过滤,直接拼接到sql语句中解析执行,达到预想之外的一种行为。

例1:

46.png

通过传入id=1,查询数据库select *from article where id=1的数据。


例2:若没有对传入参数过滤,直接拼接上参数id=-1 or 1=1 因为id=-1是不可能的 1=1总是真 false or true=true会查询出所有数据

47.png

sql注入是如何产生的?

1、web开发人员无法保证所有的输入都已经过滤

2、攻击者利用发送给sql服务器的输入数据构造可执行的sql代码

3、数据库未做相应的安全配置

针对于1、2 所有的输入包括get请求 Post请求 cookie信息 以及access头信息

针对于第3点,我们需要对web应用,添加特定的账号 而不能使用root和管理员账号 这是一种非常微信的行为

如何寻找sql注入漏洞?

步骤一、识别web应用中所有输入点 输入主要包含 get数据、post数据、 http包含的头部信息



步骤二、了解哪些类型的请求会触发异常(异常肯定会导致正常的sql语句无法执行的一些字符)

我这里通过给输入参数加引号



步骤三、检测服务器响应中的异常(通过sql异常信息判断,如果debug关闭后,sql语法错误 一般会出现500错误)

例子如上,案例一输入特殊字符单引号触发sql异常,打印出sql执行的错误 通过这种异常显示,可以看出存在sql注入漏洞


如何进行sql注入攻击?

1、数字注入方式:数字注入就是在整个sql查询中,在where条件中包含数字的部分 构造sql代码 达到注入的目的

47.png

这就是我们利用相应的数字查询条件  构造相应的sql代码 达到数字攻击的目的!

2、字符串注入:基本原理同数字注入(在整个php 中或者说是sql解析中 要利用好sql语句中注释的特性 mysql中两种注释方式:#和-- 的注释方式)

字符串注入主要是利用sql语句中的两种注释特性#和-- (横杠横杠空格)

例子1:用户正常登录的场景



例子2:用户通过注释方式#登录的场景

57.png



例子3:用户通过注释方式-- 登录的场景

可见,通过利用mysql中的注释 使得where条件只根据user_name值登录!从而绕过密码的检测

如何预防sql注入?

1、严格检查输入变量的类型和格式

1.1、整形参数(id)

以上面的案例说明:文章的id除了判空外 还要整形转换

if (empty(id) || !is_numeric(id)) {

echo 'article id is not valid';

}

这样加了整形转换后,再去执行?id=-1 or 1=1,执行结果如下:

61.png

1.2、字符串参数(用户名)

if (empty(name) || empty(password) || !preg_match("/^[a-zA-Z0-9]{6,}$/",name)) {

echo 'you input passport or name not valid';

}

这样加了正则表达式后,再去执行结果如下:

62.png

2、过滤和转移特殊字符(单引号 双引号 斜杠等)

addslashes($name) ----返回在预定义字符前面添加反斜杠的字符串

预定义字符主要包括:

  • 单引号(')

  • 双引号(")

  • 反斜杠(\)

  • NULL

mysql_real_escape_string($name)----返回被转义的字符串

下列字符受影响:

  • \x00

  • \n

  • \r

  • \

  • '

  • "

  • \x1a

3、利用mysql的预编译机制(采用?占位符的形式构造sql模板 预编译机制把sql模板发送给mysql服务器  mysql服务器对sql语句的模板进行编译 编译之后根据语句的优化分析对相应的索引进行优化   在最终绑定参数时,把参数传送给mysql服务器 这个时候直接执行 节省了sql的查询时间  可以达到一次编译多次执行的效果 )