《Web漏洞防护》读书笔记——第5章,数据安全

SQL注入介绍

1.SQL是一种结构化的查询语言,用于与数据库进行交互并能够被数据库解析。
2.攻击方式是在客户端的输入数据中插入SQL命令,发送至服务端,服务端对数据进行解析,并执行一些非预期的操作。
3.SQL注入攻击能从数据中读取敏感数据、篡改数据库数据、对数据库执行管理员操作、甚至执行系统命令。

SQL注入产生具有的两个先决条件

1.SQL语句中包含了不可信任的数据,如用户输入等。
2.动态构建SQL语句,如将用户的输入的数据直接拼接到了SQL语句中。

SQL注入产生的影响,4个方面

1.保密性:数据库用来存储敏感数据,会导致敏感数据泄露。
2.身份验证:如果使用较差的SQL命令来检查用户名和密码,可能在不知道密码的情况下,直接以用户的身份登录系统。
3.授权:如果授权的信息保存在数据库中,则可以通过SQL命令来更改授权信息。
4.完整性:可以利用SQL注入漏洞篡改、删除信息,从而破坏信息的完整性。

SQL注入分类

1.按输入参数的类型不同,分为:数字型注入、字符型注入。
2.按注入位置进行分类,分为:GET注入,POST注入,Cookie注入,其他注入。
3.按结果反馈分类,分为:盲注入(需要向数据库提出真或假的问题,根据响应结果来确认答案正确与否),非盲注入。
4.盲注入分为:基于布尔值(通过服务器响应的正确与否来判断,可借助SUBSTR、LIMIT、ASCII等一些特殊命令或函数来进行猜测),基于时间(根据服务器响应时间来判断是否存在SQL注入,常用的延时函数或指令有sleep、repeat等)。
5.其他类型:延时注入、搜索注入(注入点在搜索框中)、编码注入(将输入的字符进行编码,如Base64编码)、堆查询注入(同事执行多条SQL语句的注入,每条语句使用;分割)、联合查询注入(使用UNION操作合并两条或多条语句,需要满足2个条件:a.两个查询余军返回的列数必须相同;b.两个查询语句对于列返回的数据类型必须相同)、多阶注入。
6.多阶注入(2阶注入)流程:a.攻击者在第一个HTTP请求中提交某种经过特殊构造的输入。b.应用存储该输入,以便后面使用并响应请求。c.攻击者提交第二个不同的HTTP请求。d.为了处理第二个请求,应用检索第一个请求存储的数据,从而造成SQL注入攻击。

检测SQL注入

用于操作数据库的SQL语句满足两个条件,则可能存在SQL注入漏洞:
1.SQL语句中包含不可信任的数据源,如用户输入,且未对数据源进行严格的安全检查。
2.SQL语句是动态构造的,而非使用预编译和参数绑定的方式进行构建。

检测是否存在SQL注入的6个步骤

1.确认应用何时与数据库进行交互,典型场景有登录验证、查询以及获取商品信息等操作。
2.对于每个与数据库进行交互的操作,列出所有可能用于构建SQL语句的数据域,包括URL参数、POST提交的数据、隐藏域、HTTP头、Cookie等信息。
3.对于每个输入域,构造一些异常输入,如包含单引号、分号、注释符(#、–、/**/)、UNION、and、or等的输入,提交到服务端。
4.分析上一步的响应信息,查看其中是否包含了一些提示信息,如错误信息,这些信息可能包含在HTML隐藏域或JavaScript源码中,并不一定会展现在页面上,因此需要对整个响应信息进行细致的分析。
5.根据提示信息中的线索,针对不同的数据库分别进行更深层次的注入。
6.响应信息中没有线索提示,如只返回500页面,则可能存在SQL盲注入,此时需要向数据库提出一些真或假的问题,根据返回的结果猜测数据库的内容。

检测SQL注入防护方案

遵循两个原则,三层防御的防护策略。
两个原则:最小权限原则、最细粒度原则(并不能起到防御SQL注入的目的,但是能最大限度的减少SQL注入攻击带来的危害)。
三层防御:预编译与参数绑定、白名单验证、输入编码。

最小权限原则:保证为每个操作数据库的用户分配合适的权限,不分配多余的权限。如查询操作,只为相应的用户分配数据查询权限,不为其分配写入数据或修改数据的权限,需要注意,不要讲管理员类的账户分配给应用程序。

最细粒度原则:保证为每个不同类型的操作都分配不同权限的用户,而不是使用同一个用户。如登录操作只需要执行查询,为其分配一个只拥有查询权限的用户。如注册操作需要向数据库中插入数据,则为其再分配一个拥有插入数据权限的用户,不要为两个操作分配为同一个用户。如果一个用户只需要访问数据库中的部分数据,可以创建一个对应这部分数据的试图,并授予其访问试图的权限,而非访问整个数据库的权限。

预编译与参数绑定:是防御SQL注入漏洞的最佳方案,能够解决大部分SQL注入的问题。
分为两种情况:a.在客户端进行预编译和参数绑定,JAVA中通过PreparedStatement来实现;b.在客户端进行参数绑定,在服务端进行预编译,服务端的预编译可以通过存储过程来实现,客户端的参数绑定在JAVA中通过CallableStatement来实现。

白名单验证:可变的表名称、列名称、排序方法(ASC、DESC)等不能进行参数绑定的操作,需要使用白名单的方式对输入的数据进行验证。如使用代码预先设定的值进行选择,而非直接输入,当对排序方式进行双值选择时,可以根据用户的输入使用三目运算符,如inputdata?“ASC”:“DESC”。如可以限制查询的表名只能是student和teacher,查询其他的表则直接抛出异常。

输入编码:只能作为最后的防御手段,并不能防御所有的SQL注入漏洞。方式主要有两种a.针对特定数据库的编码方式;b.使用通用的十六进制编码。如可以借助ESAPI对Mysql进行特定的编码。

ESAPI数据库编码支持两种编码方式:ANSI模式、STANDARD模式。

MyBatis安全使用

MyBatis是支持普通SQL查询、存储过程和高级映射的优秀持久层框架。
MyBatis最强大的特性之一就是动态SQL语句的构建,没有了SQL语句的拼接,就不容易产生SQL注入漏洞。

MyBatis执行SQL的步骤:
1.加载配置(配置来源于两个地方,一处是配置文件,另一处是JAVA代码朱姐。MyBatis框架将SQL的配置信息加载成为一个MappedStatement对象,包括传入参数映射配置、执行SQL语句和结果映射配置,最后存储到内存中)。
2.SQL解析(当API接口层收到调用请求时,会接收传入SQL的ID和对象,Mybatis会根据SQL的ID找到对应的MappedStatement对象,然后根据传入的参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数)。
3.SQL执行(将最终得到的SQL语句和参数传输到数据库中执行,得到操作数据库的结果)
4.结果映射(将操作数据库的结果按照映射的配置进行转换,成为HashMap、JavaBean和基本数据类型,并将最终的结果返回)。

MyBatis使用两种模式构建SQL语句:
a.JDBC预编译模式(该模式下使用#{}表示输入的参数,如select*from news where id=#{id};)。
b.动态拼接SQL语句(该模式下使用表示输入的参数,如select∗fromenewswhereid={}表示输入的参数,如select*frome news where id=表示输入的参数,如select∗fromenewswhereid={id};,${}仅仅为一个字符串替换,在动态SQL解析阶段进行变量替换)

由于${}直接进行变量替换,相当于动态拼接SQL语句,容易造成SQL注入漏洞,在实践中尽可能使用JDBC与编译模式#{},如果必须使用动态拼接的方式,可以用白名单的方式进行过滤。

小结

预编译与参数绑定:将表名固定,不作为可变参数,只讲用户名进行参数绑定。
白名单验证:针对表名,锁定表名。
输入编码:对输入数据进行编码,作为用户名来执行SQL的查询。

《Web漏洞防护》读书笔记——第2章,SQL注入防护相关推荐

  1. oracle中值集限定词为灰色,《Oracle从入门到精通》读书笔记第四章 SQL语言基础之一...

    4.1 SQL语言概述 4.1.1 SQL语言的特点 1.集合性 2.统一性 3.易于移植性 4.1.2 SQL语言的分类 1.数据查询语言(DQL)- select语句,查询数据 2.数据操纵语言( ...

  2. 《Oracle从入门到精通》读书笔记第四章 SQL语言基础之二

    4.7 事务处理 4.7.1 事务概述 事务的4种属性:acid (1)原子性(atomic):事务是一个整体的工作单元,要么全部执行,要么全部取消. (2)一致性(consistency):所有的数 ...

  3. 深入分析Java Web技术内幕读书笔记(二)浅析DNS域名解析过程

    上一篇文章<浅析Web请求过程>讲述的是如何发起HTTP请求,对于请求发起过程中很重要的一个步骤--DNS解析过程的描述是一带而过,本篇文章将跟着DNS解析过程来分析域名是如何解析的. 一 ...

  4. 《Spring实战》读书笔记-第4章 面向切面的Spring

    <Spring实战>是学习Spring框架的一本非常经典的书籍,之前阅读了这本书,只是在书本上写写画画,最近整理了一下<Spring实战>的读书笔记,通过博客的方式进行记录分享 ...

  5. 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第一章 配置python环境

    黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第一章 配置python环境 文章目录 黑帽python第二版(Black Hat Python 2nd ...

  6. 《Spring实战》读书笔记-第3章 高级装配

    <Spring实战>是学习Spring框架的一本非常经典的书籍,之前阅读了这本书,只是在书本上写写画画,最近整理了一下<Spring实战>的读书笔记,通过博客的方式进行记录分享 ...

  7. 《Java编程思想》读书笔记 第十三章 字符串

    <Java编程思想>读书笔记 第十三章 字符串 不可变String String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,以及包含修 ...

  8. Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据

    Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据 Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据 7.1 程序数据的命名 PL/SQL要求在给数据结构命名的时候应 ...

  9. Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理

    Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 ACID原则:即一个事务具有原子性.一致性. ...

  10. PMP读书笔记(第9章)

    大家好,我是烤鸭:     今天做一个PMP的读书笔记. 第九章 项目资源管理 项目资源管理 项目资源管理的核心概念 项目资源管理的趋势和新兴实践 裁剪考虑因素 在敏捷或适应型环境中需要考虑的因素 9 ...

最新文章

  1. 深度学习目标检测指南:如何过滤不感兴趣的分类及添加新分类?
  2. Windwos下连远程linux Hbase小问题
  3. Java学习个人备忘录之线程间的通信
  4. 大数据哈希学习: 现状与趋势
  5. vue路由匹配实现包容性_包容性设计:面向老年用户的数字平等
  6. android http最新框架,Android框架学习笔记02AndroidAsycHttp框架
  7. Oracle 表备份还原
  8. 鸿蒙轻内核源码分析:MMU协处理器
  9. 什么是事件的三要素?
  10. 什么是区块链――区块链的分布式数据库、共识机制
  11. 5. Document open() 方法
  12. vscode 离线安装.vsix(window 全教程)
  13. for..in loops iterate over the entire prototype chain
  14. 关于高性能的MIMO技术的实现方法介绍
  15. MySQL 支持表情字符
  16. 数据挖掘 第四篇:OLS回归分析
  17. 有一种胸襟,叫“我搭台 你唱戏” 有一种气魄,叫“我做平台 大家赚钱”
  18. 第十四届蓝桥杯三月真题刷题训练——第 19 天
  19. oracle11g 服务端+客户端
  20. 使用Eclipse+httpClient+Jsoup读取网页数据-初级

热门文章

  1. java clone数组_Java中的数组有对应的类么,为什么数组可以直接调用clone()方法?...
  2. 百元百鸡 //构造结构体变量
  3. 数据库习题(填空题四)
  4. linux vim个人配色方案
  5. paypalsdk集成php,php核心paypal sdk
  6. ps读写ddr3里面的数据 zynq_ZYNQ应该如何让PS端的opencv程序读取到ddr中的图像数据...
  7. java技术分享ppt_精美PPT制作培训 | 技术二部内部分享
  8. 计算机室nb代码,NB-iot SDK源码(Linux版)
  9. 解析服务器响应的xml数据包,解析XML/JSON数据
  10. java usb camera_Android usb camera设备添加