背景:

  某一天准备上线,合完master之后准备发布了,忽然公司的代码安全监测提示了可能在代码中存在sql注入的风险,遂即检查,发现sql注入问题

既然碰到了这个问题,那就了简单了解下sql注入

基础知识:

SQL注入基本原理:

  所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

  注入攻击的本质,是把用户输入的数据当做代码执行。这里有两个关键条件,第一个是用户能够控制输入;第二个是原本程序要执行的代码,拼接了用户输入的数据。

SQL注入类型

按照注入点类型来分类

(1).数字型注入点(当输入的参数为整形时,如果存在注入漏洞,可以认为是数字型注入。)

sql原型:  select * from aaa where id = 1  ,有如下种可能:

  1). 加单引号,对应的sql: select * from aaa where id=3’   这时sql语句出错,程序无法正常从数据库中查询出数据,就会抛出异常;

  2).加or 1=1,对应的sql:   select*from aaa where id=3 or 1=1  这个时候能够查询到所有的结果

  3).加上 and 1=1 对应的sql:select * from aaa where id=3 and 1=1     不能查询到结果

(2).字符型注入点(当输入的参数为字符串时,称为字符型。字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的。)

sql原型: select * from aaa where name='admin'  ,有如下种可能:

  1).加单引号:

  1. select * from aaa where name ='admin' and 1=1 -- '

这种注入方式并不会影响查询结果

  2).加union:

  1. select name from aaa where name='1' union select database()#'

这种的结果就是把数据库信息泄露出去。

  3).加or

  1. select name from aaa where name='11' or '1234 '='1234'

这种就是导致查询的结果并不是期望的结果,导致数据泄露

(3).搜索型注入点(说明一下,搜索型注入也无他,前加%' 后加 and '%'='  对于MYSQL数据库,后面可以吧 and '%'='换成--)

这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有“keyword=关键字”,有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like '%关键字%'

按照数据提交的方式来分类

(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 是头部的一个字段。

按照执行效果来分类

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

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

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

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

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

基本原理了解了一些之后,再来一个案例吧

案例:

持久层框架:MyBatis

  1.      <dependency>
  2. <groupId>org.mybatis</groupId>
  3. <artifactId>mybatis</artifactId>
  4. <version>3.2.1</version>
  5. </dependency>

sql内容:

  1. <if test="query.orderBy != null">
  2. ORDER BY ${query.orderBy}
  3. </if>

背景:orderBy使用不规范也会引发sql注入吗?

例如:

  1. select * from aaa order by id and(updatexml(1,concat(0x7e,(select system_user())),0));

这里介绍下:UPDATEXML (XML_document, XPath_string, new_value);

第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc 
第二个参数:XPath_string (Xpath格式的字符串)   (XPATH格式:http://www.cnblogs.com/Loofah/archive/2012/05/10/2494036.html)

第三个参数:new_value,String格式,替换查找到的符合条件的数据 
作用:改变文档中符合条件的节点的值

执行上面的sql,通过报错内容获取当前连接数据库的用户名

  1. [SQL]select * from aaa order by id and(updatexml(1,concat(0x7e,(select system_user())),0));
  2. [Err] 1105 - XPATH syntax error: '~root@localhost'

在mybatis中如何避免?

在mybatis中,#{} 相当于 jdbc中的preparedstatement,就是说传递过来的参数会自动加上单引号,而${} 是直接输出变量的值。一般来说,使用#{}语法,MyBatis会产生PreparedStatement语句中,并且安全的设置PreparedStatement参数,这个过程中MyBatis会进行必要的安全检查和转义。比如这样:

  1. 执行SQLSelect * from aaa where name = #{name}
  2. 参数:aaa
  3. 解析后执行的SQLSelect * from aaa where name =

也就是说#{}更安全一些。但是order by 明显是不能使用这种方式的。order by 之后如果使用  #{} 使用时则变成了 order by '...' 那么sql就直接报错了

避免该种类型的sql注入的有效措施就是在程序中判断排序字段 以保证xml中只可能出现某些情况或者在xml中固定排序字段

Mybatis中其他易产生SQL注入的场景
  • 模糊查询 like 

    正常程序: select * from aaa where name like '%${likeColumn}%'  可能会存在sql注入问题

    修改后:

  1. select * from aaa where name like concat('%',#{likeColumn},'%')

    修改点:从 ${} 改为 #{},从sql拼接到 concat方式

  • in之后的参数

    正常程序: Select * from aaa where id in (${id})

    修改后:

  1. select * from aaa where id in
  2. <foreach collection="ids" item="item" open="("separator="," close=")">#{item} </foreach> 

ok,先简单对sql注入有个了解。

https://blog.csdn.net/m0_37438418/article/details/80260813  一道综合渗透题引发的updatexml()注入思考

https://www.cnblogs.com/moxiaotao/p/9330711.html  Java框架之MybatisSQL注入漏洞

https://www.cnblogs.com/xuthus/p/9450805.html SQL注入 (1) SQL注入类型介绍

https://blog.csdn.net/qq_30464257/article/details/84495884 如何判断是字符型注入还是整形注入

http://www.hackdig.com/?08/hack-5209.htm

https://msd.misuland.com/pd/3070888491219950886

https://www.open-open.com/lib/view/open1474963603800.html

从orderby引发的SQL注入问题的思考的更多相关文章

  1. Bugku SQL注入2的思考

    网络安全初学者,欢迎评论交流学习,若内容中有错误欢迎各位指正. 题目地址:http://123.206.87.240:8007/web2/ 题目提示:都过滤了绝望吗?,提示 !,!=,=,+,-,^, ...

  2. php防止SQL注入详解及防范

    SQL 注入是PHP应用中最常见的漏洞之一.事实上令人惊奇的是,开发者要同时犯两个错误才会引发一个SQL注入漏洞一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义( ...

  3. SQL注入与安全防护---以PHP为例

    一.什么是sql注入: 简单来说,当我们从前端的用户表单数据往后台数据库传输时,可能用户表单数据中的某些数据,会跟我们的后台发生“有机”反应,从而导致发生一些数据库的异常操作. 举个例子吧,以简单的用 ...

  4. 转:PHP中防止SQL注入的方法

    [一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最 ...

  5. php防止sql注入的方法(转)

    [一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最 ...

  6. 【实战】某项目SQL注入引发的思考

    数据包: 测试参数:username,测试payload: ' ' or '1'='1 ' or '1'='2 响应结果都未发生任何变化,借助sqlmap测试,结果一样: 尝试在or前面进行简单的fu ...

  7. SQL 注入

    我们的团队项目中有课程名称输入框,其中的内容会拼接到类sql查询语句中. 所以可能会产生类sql注入的问题,我们团队采用了利用正则表达式判断输入内容的形式来规避这类注入. 下面简单介绍一下sql注入 ...

  8. 利用SQL注入漏洞登录后台

    所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询 ...

  9. SQL注入之代码层防御

    [目录] 0x0 前言 0x1 领域驱动的安全 1.1 领域驱动的设计 1.2 领域驱动的安全示例 0x2 使用参数化查询 2.1 参数化查询 2.2 Java中的参数化语句 2.3 .NET(C#) ...

随机推荐

  1. Part 23 to 26 Routing in Angular

    Part 23 AngularJS routing tutorial In general, as the application becomes complex you will have more ...

  2. [第三章]c++学习笔记2(静态成员变量)

    静态成员:在说明前加了static关键字的对象 使用例: 基本概念 普通成员变量每个对象有各自的一份,而静态成员变量总共只有一份,为所有对象共享. 普通成员函数必须具体作用与某个对象,而静态成员函数并 ...

  3. 暑假算法练习Day4

    已经坚持第四天啦,Fighting!!! 1008 数组元素循环右移问题 (20 分) 一个数组\(A\)中存有\(N\)\((>0)\)个整数,在不允许使用另外数组的前提下,将每个整数循环向右 ...

  4. [loj3049]字符串问题

    考虑将所有A串向所能支配的B串连边,B串向满足B串是A串前缀的A串连边,在A串上有点权,跑最长路即可但这样前缀的边太多,考虑优化:在后缀树上,将这些串插入进去(注意相同的串A串要在B串下面),并将父亲 ...

  5. Spring Cloud Gateway限流实战

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. [JS高程] 特殊的原始值类型

    目录 原始值包装类型 (特殊引用类型) 原始值包装类型和应用类型的区别 原始值包装类型 (特殊引用类型) 在ES6 时,ECMAScript 数据类型是这样去分类的: 原始值(基本数据类型) Numb ...

  7. 一个Java发送邮件的案例

    经常有些要发送邮件的需求,但是去网上拷代码老是拷不到能直接运行的,还经常要去以前的项目里面拷,今天直接发出来算了,免得每次都要去别的项目拷. (只支持发送简单的文本文件,发附件的稍微复杂一丢丢,这里就 ...

  8. AT4168 [ARC100C] Or Plus Max

    从\(whk\)回来了. 考虑我们需要维护一个子集的信息. 对于二进制的子集信息维护有一个很经典的操作: 高维前缀和. AT4168 [ARC100C] Or Plus Max // Problem: ...

  9. Matlab流体后处理中的奇淫巧术总结

    Matlab流体后处理中的奇淫巧术总结 主要参考\demos\volvec.m示例 1.等值面绘制 %% Isosurface of MRI Data cla load mri D = squeeze ...

  10. R语言与医学统计图形-【23】ggplot2坐标系转换函数

    ggplot2绘图系统--坐标系转换函数 包括饼图.环状条图.玫瑰图.戒指图.坐标翻转. 笛卡尔坐标系(最常见). ArcGIS地理坐标系(地图). Cartesian坐标系. polar极坐标系. ...