sql注入漏洞

原理:由于开发者在编写操作数据库代码时,直接将外部可控参数拼接到sql 语句中,没有经过任何过滤就直接放入到数据库引擎中执行了。

攻击方式:

(1) 权限较大时,直接写入webshell 或者直接执行系统命令

(2) 权限较小时,通过注入获得管理员密码信息,或者修改数据库内容进行钓鱼等

常出现的地方:

登录页面、获取HTTP头(user-agent、client-ip等)、订单处理等,HTTP头里面client-ip 和 x-forward-for 常出现漏洞,在涉及购物车的地方,常发生二次注入;

1、 普通注入

指未做任何处理的,直接通过注入union 查询就可以注入的漏洞。在普通注入测试时,通过查找关键字定向挖掘,数据库操作:select from 、mysql_connect 、mysql_query 、mysql_fetch_row 等,数据库查询方式:update、insert、delete等

2、 编码注入

程序在进行一些操作之前,经常会进行一些编码处理,而做编码的函数也是存在问题的,通过输入转码函数不兼容的特殊字符,可以导致输出的字符变成有害的数据。常见的编码注入有mysql 宽字节以及urldecode/rawurldecode 函数导致的。

(1) 宽字节注入

在进行php 连接mysql 时,当设置”ser character_set_client=gbk” 时会导致一个编码转换的注入问题,也就是熟悉的宽字节注入,当存在宽字节注入时,%df%27 可把程序中过滤的\ (%5c)吃掉。例如:/1.php?id=1存在宽字节注入时,则: /1.php?id=-1’and 1=1%23 单引号会被转义成 \’但是提交:/1.php?id=-1%df’and 1=1%23 时,%df和\ 反斜杠(%5c) 组合 %df%5c 编码后是一个汉字,这时候单引号依然存在,则会闭合成功,形成注入漏洞。

形成原因:由于设置Mysql 服务器客户端数据编码是GBK ,set character_set_client=gbk执行语句时进行GBK 转码时形成攻击,通常都设置方法是: SET NAMES ‘gbk’,等同于:

SET

character_set_connection=’gbk’,

character_set_results=’gbk’,

character_set_client=’gbk’

此编码设计也存在漏洞,建议使用官方给的mysql_set_charset方式来设置编码,在调用SET NAMES 之后还记录了当前的编码,留着给后边mysql_real_escape_string处理字符时使用,后边合理的使用mysql_real_escape_string还是可以防御此漏洞的。

防御方法:

①在执行查询之前先执行SET NAMES ‘gbk’,character_set_client=binary 设置character_set_client 为 binary

② 使用mysql_set_charset(‘gbk’) 设置编码,然后使用mysql_real_escape_string() 函数被参数过滤

③使用pdo方式,在Php 5.3.6及以下版本中需要设置setAttribute(PDO:ATTR_EMULATE_PREPARES,false); 来禁用preparcd statements 的仿真效果。

宽字节注入测试示例:

Gbk编码格式输入结果:

宽字节注入成功,%df\’被过滤后成为%dr\’,经过编码后成为%df%5c,即就是汉字“運”。因此,可以绕过,形成注入。

(2) 二次urldecode 注入

现在通常Web应用程序大多都会进行参数过滤,来防止注入。如果某处使用了urldecode或者 rawurldecode 函数,则会导致二次解码生成单引号二引发注入,即二次注入。

Web应用程序通常使用addslashes() 、mysql_real_escape_string()、mysql_escape_string()函数或者开启GPC来防止注入,也就是给单引号(‘’)、双引号(“”)、反斜杠(\)和NULL加上反斜杠转义。

二次注入测试代码:

执行结果:

原理:由于我们提交id参数到webserver时,webserver会自动解码一次,假设目标程序开启了GPC,我们提交参数id=1%2527 ,经过第一次解码后,%25解码结果为%,则参数为id=1%27,第二次程序使用了urldecode 或者 rawurldecode 函数来解码id参数,则解码后结果为id=1’ ,这时单引号成功出现引发注入。

3、 sql注入漏洞防范

这里提供三种防御方法:预编译方式、过滤函数和类、魔术引号。

(1)、预编译方式:在.NET语言中使用SqlParameter进行预编译方式处理数据库查询,在java中语言使用prepareStatement进行预编译处理数据库查询,在PHP中使用pdo 的prepare 进行预编译处理数据库查询;

(2)、过滤函数和类:两种共使用场景。一种是程序入口统一过滤,像框架程序这种方式比较多,另一种是在程序进行SQL语句运行之前使用。PHP常使用的函数有addslashes()、mysql_escape_string()、msyql_real_string()、intval()函数等;

(3)、魔术引号:通常数据污染的方式有两种:一种是应用被动接收参数,类似于GET、POST等;另一种是主动获取参数,类似与读取远程桌面页面或者文件内容等。在PHP中魔术引号配置方法,magic_quotes_gpc负责对GET、POST、COOKIE的值进行过滤,magic_quotes_runtime对数据库或者文件中获取的数据进行过滤。

注:本文属于作者自己原创,转载请注明出处,若有错误之处,还请指出,谢谢!

Sql 注入详解:宽字节注入+二次注入的更多相关文章

  1. 详解C#泛型(二) 获取C#中方法的执行时间及其代码注入 详解C#泛型(一) 详解C#委托和事件(二) 详解C#特性和反射(四) 记一次.net core调用SOAP接口遇到的问题 C# WebRequest.Create 锚点“#”字符问题 根据内容来产生一个二维码

    详解C#泛型(二)   一.自定义泛型方法(Generic Method),将类型参数用作参数列表或返回值的类型: void MyFunc<T>() //声明具有一个类型参数的泛型方法 { ...

  2. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

    原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...

  3. MySQL之SQL优化详解(二)

    目录 MySQL之SQL优化详解(二) 1. SQL的执行顺序 1.1 手写顺序 1.2 机读顺序 2. 七种join 3. 索引 3.1 索引初探 3.2 索引分类 3.3 建与不建 4. 性能分析 ...

  4. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  5. 【转】MySQL用户管理及SQL语句详解

    [转]MySQL用户管理及SQL语句详解 1.1 MySQL用户管理 1.1.1 用户的定义 用户名+主机域 mysql> select user,host,password from mysq ...

  6. ORACLE PL/SQL编程详解(转)

    原帖地址:http://blog.csdn.net/chenjinping123/article/details/8737604 ORACLE PL/SQL编程详解 SQL语言只是访问.操作数据库的语 ...

  7. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

  8. [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

    原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ...

  9. 【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航

    原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人 ...

随机推荐

  1. 解决Android Studio 3.x版本的安装时没有SDK,运行时出现SDK tools错误

    好久没更新了,最近手机上的闹钟APP没一个好用的,所以想自己写个. 那Android开发环境搭起来,注意先装好jdk. 1.安装Android Studio google的Android开发网站已经有 ...

  2. 精读JavaScript模式(四),数组,对象与函数的几种创建方式

    一.前言 放了个元旦,休息了三天,加上春运抢票一系列事情的冲击,我感觉我的心已经飞了.确实应该收收心,之前计划的学习任务也严重脱节了:我恨不得打死我自己. 在上篇博客中,笔记记录到了关于构造函数方面的 ...

  3. netty源码解解析(4.0)-8 ChannelPipeline的设计

    io.netty.channel.ChannelPipeline   设计原理 上图中,为了更直观地展示事件处理顺序, 故意有规律地放置两种handler的顺序,实际上ChannelInboundHa ...

  4. FFmpeg编解码处理4-音频编码

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10584948.html FFmpeg编解码处理系列笔记: [0]. FFmpeg时间戳详 ...

  5. FFmpeg封装格式处理2-解复用例程

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10506642.html FFmpeg封装格式处理相关内容分为如下几篇文章: [1]. F ...

  6. Sphinx coreseek 3.2

    功能 中文的拆词索引 MySQL中like模糊查询.   >1>5>%可以用索引 配置 用编辑器打开 path 配置 改绝对路径 https://blog.csdn.net/u013 ...

  7. ssh采用expect实现自动输入密码登录、拷贝

    1. 引言 最近做了一个项目,需要频繁与另一台主机进行文件的传输:中间想到了很多方式:FTP.samba.curl等,但是还是感觉scp最好用. SCP使用教程可参阅:http://www.jb51. ...

  8. base64编码的作用【转】

    转自:https://www.zhihu.com/question/36306744/answer/71626823 X.509公钥证书也好,电子邮件数据也好,经常要用到Base64编码,那么为什么要 ...

  9. Spark集群的任务提交执行流程

    本文转自:https://www.linuxidc.com/Linux/2018-02/150886.htm 一.Spark on Standalone 1.spark集群启动后,Worker向Mas ...

  10. 设计模式之备忘录模式(Memento )

    当我们在实际应用中需要提供撤销机制,当一个对象可能需要再后续操作中恢复其内部状态时,就需要使用备忘录模式.其本质就是对象的序列化和反序列化的过程,支持回滚操作. 作用 在不破坏封装性的前提下,捕获一个 ...