《Web漏洞防护》读书笔记——第2章,SQL注入防护
《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注入防护相关推荐
- oracle中值集限定词为灰色,《Oracle从入门到精通》读书笔记第四章 SQL语言基础之一...
4.1 SQL语言概述 4.1.1 SQL语言的特点 1.集合性 2.统一性 3.易于移植性 4.1.2 SQL语言的分类 1.数据查询语言(DQL)- select语句,查询数据 2.数据操纵语言( ...
- 《Oracle从入门到精通》读书笔记第四章 SQL语言基础之二
4.7 事务处理 4.7.1 事务概述 事务的4种属性:acid (1)原子性(atomic):事务是一个整体的工作单元,要么全部执行,要么全部取消. (2)一致性(consistency):所有的数 ...
- 深入分析Java Web技术内幕读书笔记(二)浅析DNS域名解析过程
上一篇文章<浅析Web请求过程>讲述的是如何发起HTTP请求,对于请求发起过程中很重要的一个步骤--DNS解析过程的描述是一带而过,本篇文章将跟着DNS解析过程来分析域名是如何解析的. 一 ...
- 《Spring实战》读书笔记-第4章 面向切面的Spring
<Spring实战>是学习Spring框架的一本非常经典的书籍,之前阅读了这本书,只是在书本上写写画画,最近整理了一下<Spring实战>的读书笔记,通过博客的方式进行记录分享 ...
- 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第一章 配置python环境
黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第一章 配置python环境 文章目录 黑帽python第二版(Black Hat Python 2nd ...
- 《Spring实战》读书笔记-第3章 高级装配
<Spring实战>是学习Spring框架的一本非常经典的书籍,之前阅读了这本书,只是在书本上写写画画,最近整理了一下<Spring实战>的读书笔记,通过博客的方式进行记录分享 ...
- 《Java编程思想》读书笔记 第十三章 字符串
<Java编程思想>读书笔记 第十三章 字符串 不可变String String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,以及包含修 ...
- Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据
Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据 Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据 7.1 程序数据的命名 PL/SQL要求在给数据结构命名的时候应 ...
- Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理
Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 ACID原则:即一个事务具有原子性.一致性. ...
- PMP读书笔记(第9章)
大家好,我是烤鸭: 今天做一个PMP的读书笔记. 第九章 项目资源管理 项目资源管理 项目资源管理的核心概念 项目资源管理的趋势和新兴实践 裁剪考虑因素 在敏捷或适应型环境中需要考虑的因素 9 ...
最新文章
- 深度学习目标检测指南:如何过滤不感兴趣的分类及添加新分类?
- Windwos下连远程linux Hbase小问题
- Java学习个人备忘录之线程间的通信
- 大数据哈希学习: 现状与趋势
- vue路由匹配实现包容性_包容性设计:面向老年用户的数字平等
- android http最新框架,Android框架学习笔记02AndroidAsycHttp框架
- Oracle 表备份还原
- 鸿蒙轻内核源码分析:MMU协处理器
- 什么是事件的三要素?
- 什么是区块链――区块链的分布式数据库、共识机制
- 5. Document open() 方法
- vscode 离线安装.vsix(window 全教程)
- for..in loops iterate over the entire prototype chain
- 关于高性能的MIMO技术的实现方法介绍
- MySQL 支持表情字符
- 数据挖掘 第四篇:OLS回归分析
- 有一种胸襟,叫“我搭台 你唱戏” 有一种气魄,叫“我做平台 大家赚钱”
- 第十四届蓝桥杯三月真题刷题训练——第 19 天
- oracle11g 服务端+客户端
- 使用Eclipse+httpClient+Jsoup读取网页数据-初级
热门文章
- java clone数组_Java中的数组有对应的类么,为什么数组可以直接调用clone()方法?...
- 百元百鸡 //构造结构体变量
- 数据库习题(填空题四)
- linux vim个人配色方案
- paypalsdk集成php,php核心paypal sdk
- ps读写ddr3里面的数据 zynq_ZYNQ应该如何让PS端的opencv程序读取到ddr中的图像数据...
- java技术分享ppt_精美PPT制作培训 | 技术二部内部分享
- 计算机室nb代码,NB-iot SDK源码(Linux版)
- 解析服务器响应的xml数据包,解析XML/JSON数据
- java usb camera_Android usb camera设备添加