描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302519553丛书名: 网络空间安全重点规划丛书
本书既适合作为网络空间安全、信息安全等专业的本科生相关专业基础课程的教材,也适合作为网络安全研究人员的入门基础读物。
本书由360企业安全集团针对高校网络空间安全专业的教学规划组织编写,既适合作为网络空间安全、信息安全等专业本科生相关专业基础课程教材,也适合作为网络安全研究人员的基础读物。
第1章Web系统安全概述1
1.1Web系统安全现状1
1.2Web网站系统结构3
1.2.1静态网站3
1.2.2动态网站3
1.2.3Web服务器5
1.3Web安全漏洞6
1.3.1应用系统安全漏洞6
1.3.2Web漏洞类型6
1.3.3Web系统安全技术8
1.4Web安全威胁前沿趋势9
思考题11
第2章Web应用防火墙12
2.1WAF简介12
2.2WAF的功能及特点12
2.2.1WAF的功能13
2.2.2WAF的特点13
2.2.3WAF产品性能指标14
2.3WAF部署16
2.3.1串联防护部署模式16
2.3.2旁路防护部署模式18
2.4WAF防护原理19
2.4.1Web应用安全监测19
2.4.2双重边界20
2.4.3纵深防御体系22
思考题23Web应用防火墙技术及应用目录第3章HTTP校验和访问控制24
3.1HTTP24
3.1.1HTTP简介24
3.1.2统一资源定位符25
3.1.3HTTP请求25
3.1.4HTTP响应27
3.1.5HTTP消息28
3.1.6Cookie30
3.2HTTP校验31
3.3HTTP访问控制32
思考题33
第4章Web防护34
4.1弱密码34
4.1.1弱密码攻击34
4.1.2弱密码检测35
4.1.3弱密码防范36
4.2SQL注入36
4.2.1SQL注入攻击原理37
4.2.2SQL注入漏洞利用38
4.2.3SQL注入漏洞检测40
4.2.4SQL注入漏洞防范42
4.3跨站脚本攻击44
4.3.1XSS攻击原理45
4.3.2XSS漏洞利用47
4.3.3XSS漏洞检测48
4.3.4XSS防范49
4.4跨站请求伪造攻击52
4.4.1CSRF攻击原理52
4.4.2CSRF漏洞利用53
4.4.3CSRF漏洞检测54
4.4.4CSRF漏洞防范55
4.5恶意流量攻击57
4.5.1爬虫攻击分析57
4.5.2爬虫攻击防范62
4.5.3盗链攻击分析64
4.5.4盗链攻击防范66
4.6文件上传与下载攻击67
4.6.1文件上传攻击原理67
4.6.2文件上传攻击防范69
4.6.3文件下载攻击原理70
4.6.4文件下载攻击防范72
4.7Web服务器敏感信息泄露74
4.7.1敏感信息泄露原理74
4.7.2敏感信息泄露检测78
4.7.3敏感信息泄露防范78
思考题80
第5章网页防篡改82
5.1网页篡改的原理82
5.2攻击者常用的网页篡改方法83
5.3网页篡改防范技术85
5.3.1时间轮询技术86
5.3.2核心内嵌技术86
5.3.3事件触发技术87
5.3.43种网页防篡改技术的对比88
5.3.5网页防篡改系统90
思考题91
第6章分布式拒绝服务攻击防护92
6.1DDoS攻击原理92
6.2DDoS攻击现象与特点94
6.3DDoS攻击方式96
6.3.1攻击网络带宽资源96
6.3.2攻击系统资源100
6.3.3攻击应用资源103
6.4DDoS攻击的防御方法109
6.4.1DDoS攻击的治理109
6.4.2DDoS攻击的缓解114
思考题121
第7章威胁情报中心122
7.1威胁情报概述122
7.1.1威胁情报定义122
7.1.2威胁情报分类125
7.2威胁情报服务和威胁情报的用途126
7.3智慧Web应用防火墙128
思考题129
第8章典型案例130
8.1防数据泄露解决方案130
8.1.1背景及需求130
8.1.2解决方案及分析131
8.2防DDoS攻击解决方案132
8.2.1背景及需求132
8.2.2解决方案及分析133
8.3防网页篡改解决方案134
8.3.1背景及需求134
8.3.2解决方案及分析135
附录AWAF技术英文缩略语136
参考文献139
网络空间安全重点规划丛书编审委员会顾问委员会主任: 沈昌祥(中国工程院院士)
特别顾问: 姚期智(美国国家科学院院士、美国人文及科学院院士、中国科学院院士、“图灵奖”获得者)
何德全(中国工程院院士)蔡吉人(中国工程院院士)
方滨兴(中国工程院院士)吴建平(中国工程院院士)
王小云(中国科学院院士)
主任: 封化民
副主任: 韩臻李建华张焕国冯登国
委员: (按姓氏拼音为序)
蔡晶晶曹珍富陈克非陈兴蜀杜瑞颖杜跃进
段海新范红高岭宫力谷大武何大可
侯整风胡爱群胡道元黄继武黄刘生荆继武
寇卫东来学嘉李晖刘建伟刘建亚马建峰
毛文波潘柱廷裴定一钱德沛秦玉海秦志光
卿斯汉仇保利任奎石文昌汪烈军王怀民
王劲松王军王丽娜王美琴王清贤王新梅
王育民吴晓平吴云坤徐明许进徐文渊
严明杨波杨庚杨义先俞能海张功萱
张红旗张宏莉张敏情张玉清郑东周福才
左英男
丛书策划: 张民21世纪是信息时代,信息已成为社会发展的重要战略资源,社会的信息化已成为当今世界发展的潮流和核心,而信息安全在信息社会中将扮演极为重要的角色,它会直接关系到国家安全、企业经营和人们的日常生活。 随着信息安全产业的快速发展,全球对信息安全人才的需求量不断增加,但我国目前信息安全人才极度匮乏,远远不能满足金融、商业、公安、军事和政府等部门的需求。要解决供需矛盾,必须加快信息安全人才的培养,以满足社会对信息安全人才的需求。为此,教育部继2001年批准在武汉大学开设信息安全本科专业之后,又批准了多所高等院校设立信息安全本科专业,而且许多高校和科研院所已设立了信息安全方向的具有硕士和博士学位授予权的学科点。
信息安全是计算机、通信、物理、数学等领域的交叉学科,对于这一新兴学科的培养模式和课程设置,各高校普遍缺乏经验,因此中国计算机学会教育专业委员会和清华大学出版社联合主办了“信息安全专业教育教学研讨会”等一系列研讨活动,并成立了“高等院校信息安全专业系列教材”编审委员会,由我国信息安全领域著名专家肖国镇教授担任编委会主任,指导“高等院校信息安全专业系列教材”的编写工作。编委会本着研究先行的指导原则,认真研讨国内外高等院校信息安全专业的教学体系和课程设置,进行了大量前瞻性的研究工作,而且这种研究工作将随着我国信息安全专业的发展不断深入。系列教材的作者都是既在本专业领域有深厚的学术造诣、又在教学第一线有丰富的教学经验的学者、专家。
该系列教材是我国第一套专门针对信息安全专业的教材,其特点是:
① 体系完整、结构合理、内容先进。
② 适应面广:能够满足信息安全、计算机、通信工程等相关专业对信息安全领域课程的教材要求。
③ 立体配套:除主教材外,还配有多媒体电子教案、习题与实验指导等。
④ 版本更新及时,紧跟科学技术的新发展。
在全力做好本版教材,满足学生用书的基础上,还经由专家的推荐和审定,遴选了一批国外信息安全领域的优秀教材加入到系列教材中,以进一步满足大家对外版书的需求。“高等院校信息安全专业系列教材”已于2006年年初正式列入普通高等教育“十一五”国家级教材规划。
2007年6月,教育部高等学校信息安全类专业教学指导委员会成立大会暨第一次会议在北京胜利召开。本次会议由教育部高等学校信息安全类专业教学指导委员会主任单位北京工业大学和北京电子科技学院主办,清华大学出版社协办。教育部高等学校信息安全类专业教学指导委员会的成立对我国信息安全专业的发展起到重要的指导和推动作用。2006年教育部给武汉大学下达了“信息安全专业指导性专业规范研制”的教学科研项目。2007年起该项目由教育部高等学校信息安全类专业教学指导委员会组织实施。在高教司和教指委的指导下,项目组团结一致,努力工作,克服困难,历时5年,制定出我国第一个信息安全专业指导性专业规范,于2012年年底通过经教育部高等教育司理工科教育处授权组织的专家组评审,并且已经得到武汉大学等许多高校的实际使用。2013年,新一届“教育部高等学校信息安全专业教学指导委员会”成立。经组织审查和研究决定,2014年以“教育部高等学校信息安全专业教学指导委员会”的名义正式发布《高等学校信息安全专业指导性专业规范》(由清华大学出版社正式出版)。
Web应用防火墙技术及应用出版说明2015年6月,国务院学位委员会、教育部出台增设“网络空间安全”为一级学科的决定,将高校培养网络空间安全人才提到新的高度。2016年6月,中央网络安全和信息化领导小组办公室(下文简称中央网信办)、国家发展和改革委员会、教育部、科学技术部、工业和信息化部及人力资源和社会保障部六大部门联合发布《关于加强网络安全学科建设和人才培养的意见》(中网办发文〔2016〕4号)。为贯彻落实《关于加强网络安全学科建设和人才培养的意见》,进一步深化高等教育教学改革,促进网络安全学科专业建设和人才培养,促进网络空间安全相关核心课程和教材建设,在教育部高等学校信息安全专业教学指导委员会和中央网信办资助的网络空间安全教材建设课题组的指导下,启动了“网络空间安全重点规划丛书”的工作,由教育部高等学校信息安全专业教学指导委员会秘书长封化民校长担任编委会主任。本规划丛书基于“高等院校信息安全专业系列教材”坚实的工作基础和成果、阵容强大的编审委员会和优秀的作者队伍,目前已经有多本图书获得教育部和中央网信办等机构评选的“普通高等教育本科国家级规划教材”“普通高等教育精品教材”“中国大学出版社图书奖”和“国家网络安全优秀教材奖”等多个奖项。
“网络空间安全重点规划丛书”将根据《高等学校信息安全专业指导性专业规范》(及后续版本)和相关教材建设课题组的研究成果不断更新和扩展,进一步体现科学性、系统性和新颖性,及时反映教学改革和课程建设的新成果,并随着我国网络空间安全学科的发展不断完善,力争为我国网络空间安全相关学科专业的本科和研究生教材建设、学术出版与人才培养做出更大的贡献。
我们的Email地址是: [email protected],联系人: 张民。
“网络空间安全重点规划丛书”编审委员会没有网络安全,就没有国家安全;没有网络安全人才,就没有网络安全。
为了适应对网络安全人才的需要,如今,许多学校都在下大功夫、花大本钱,聘请优秀教师,招收优秀学生,建设一流的网络空间安全专业,努力培养网络安全人才。
网络空间安全专业建设需要体系化的培养方案、系统化的专业教材和专业化的师资队伍。优秀教材是培养网络空间安全专业人才的关键。但是,这又是一项十分艰巨的任务。原因有二: 其一,网络空间安全的涉及面非常广,至少包括密码学、数学、计算机、通信工程、信息工程等多个学科,因此,其知识体系庞杂,难以梳理;其二,网络空间安全的实践性很强,技术发展更新非常快,对环境和师资要求也很高。
“Web应用防火墙技术及应用”是网络空间安全和信息安全专业的基础课程,其目标是使学生掌握Web应用防火墙技术及应用。
本书涉及的知识面很宽。全书共8章。第1章为Web系统安全概述,第2章介绍Web应用防火墙,第3章介绍HTTP校验和访问控制,第4章介绍Web防护,第5章介绍网页防篡改,第6章介绍分布式拒绝服务攻击防护,第7章介绍威胁情报中心,第8章介绍典型案例。
本书既适合作为网络空间安全、信息安全等专业的本科生相关专业基础课程的教材,也适合作为网络安全研究人员的入门基础读物。本书的内容将随着新技术的发展而更新。
由于作者水平有限,书中难免存在疏漏和不妥之处,欢迎读者批评指正。
作者2018年8月
超文本传输协议(HTTP)是应用最广泛的网络协议之一。本章介绍HTTP的基本原理,然后结合HTTP的基本知识讲述HTTP校验和访问控制的原理。3.1HTTP3.1.1HTTP简介
HTTP是一种基于请求与响应模式交互数据的无状态协议。无状态是指协议对于事务处理没有记忆能力,连接关闭后服务器端不保留连接的有关信息。HTTP是应用层协议,它是万维网(World Wide Web,WWW)上能够可靠地交换文件的重要基础。万维网访问网点的具体工作过程如图31所示。
图31万维网访问网点工作过程
首先,Web服务器会不断地监听服务器提供HTTP服务的TCP端口(默认的端口为80),检测客户端向服务器发出的连接建立请求。当服务器监听到连接建立请求并与客户端建立了TCP连接后,客户端向服务器发出浏览某个页面的请求,服务器就会返回客户端所请求的页面作为响应。当用户关闭本地浏览器或者结束网站访问时,服务器释放TCP连接。这种客户端和服务器之间请求和响应的交互必须按照规定的格式并且遵循一定的规则,这些格式和规则就是超文本传输协议。
Web应用防火墙技术及应用第3章HTTP校验和访问控制3.1.2统一资源定位符
万维网以客户端服务器的方式工作,客户端向服务器发出请求,服务器向客户端返回客户端所需的万维网文档。在客户端浏览器中显示的万维网文档即平常所说的页面。那么客户端是如何定位分布在整个互联网上的万维网文档呢?为解决这个问题,万维网使用统一资源定位符(Uniform Resource Locator,URL)标志万维网上的各个文档,并使每一个文档具有唯一的URL。
URL用来表示从互联网中得到的资源位置和访问这些资源的方法,即平常所说的“网址”。而这里所说的“资源”是指在互联网上可以被任何人访问的对象,包括文件目录、文件、图像和声音等。由此可见,URL相当于一个文件名在网络范围的扩展,是互联网上任何可访问对象的指针。由于访问不同对象所使用的协议不同,URL还需要指出读取某个对象时使用的协议。
URL一般由以下4个部分组成: ://:/当客户端访问万维网的网站时,需要使用HTTP,此时URL的一般形式是http://:/其中http表示要通过HTTP来定位网络资源;“主机”是指该网站是在互联网中哪一台主机上,一般为主机在互联网上的域名或者IP地址;“端口”是指服务器监听的TCP端口号,HTTP的默认端口号是80,通常可以省略,当服务器监听的端口不是80的时候,则需要显式指定端口,例如8080;“路径”是指该资源在服务器中的路径,若省略此项,则URL会指向网站的主页,例如http: //www.example.com,即访问某个网站的主页,并省略了默认端口号80。
3.1.3HTTP请求
HTTP报文分为请求报文和响应报文两种。HTTP请求报文由请求行、请求头、请求实体3部分组成,具体结构如图32所示。
图32HTTP请求报文
1. 请求行
请求行用于说明请求类型、要访问的资源以及所使用的HTTP版本。以一个方法符号开头,以空格分开,后面跟着请求的URL和协议的版本,格式如下: Method URL HTTP-Version CRLF其中,Method表示请求方法,URL是一个统一资源定位符,HTTPVersion表示请求的HTTP版本,CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。
请求方法有多种,常用的方法有GET、POST和HEAD。
(1) GET方法: 在浏览器的地址栏中输入网址来访问网页时,浏览器采用GET方法从服务器获取资源。GET /index.html HTTP/1.1就表示它将要从服务器获取/index.html的内容。
(2) POST方法: 被请求服务器需接收附在请求后面的数据,常用于提交表单。
(3) HEAD方法: 与GET方法几乎一样,对于HEAD请求的回应部分来说,它的HTTP头部中包含的信息与通过GET请求所得到的信息是相同的。利用HEAD方法,不必传输整个资源内容,就可以得到URL所标识的资源的信息。该方法常用于测试超链接的有效性、是否可以访问以及最近是否更新。
各个方法的解释如表31所示。表31HTTP请求方法请求方法说明GET请求获取URL所标识的资源POST在URL所标识的资源后附加新的数据HEAD请求获取由URL所标识的资源的响应消息报头PUT请求服务器存储一个资源,并用URL作为其标识DELETE请求服务器删除URL所标识的资源TRACE请求服务器回送收到的请求信息,主要用于测试或诊断CONNECT保留将来使用OPTIONS请求查询服务器的性能,或者查询与资源相关的选项和需求PATCH请求更改部分文档除了表31介绍的HTTP请求方法,WebDAV等基于HTTP的通信协议还拓展了HTTP,在GET、POST、HEAD等HTTP标准方法以外添加了一些新的方法,例如PROPFIND(查看文件属性)、PROPPATCH(设置文件属性)、MKCOL(创建文件集合)、COPY(文件复制)、MOVE(文件移动)、LOCK(文件加锁)、UNLOCK(文件解锁)等,使应用程序可直接对Web服务器进行读写。
2. 请求头
紧接着请求行之后的部分是请求头。请求头允许客户端向服务器传递请求的附加信息以及客户端自身的信息,例如请求的目的地等。请求头的详细讲解见3.1.5节。
3. 请求实体
请求实体也叫请求数据、正文,此处可以添加任意的其他数据。
3.1.4HTTP响应
在接收到HTTP请求报文后,服务器会返回一个HTTP响应报文。HTTP响应报文由状态行、响应头、响应实体3部分组成,其具体结构如图33所示。
图33HTTP响应报文
1. 状态行
状态行由HTTP版本号、状态码、描述状态的短语3部分组成。格式如下: HTTP-Version Status-Code Reason-Phrase CRLF其中,HTTPVersion表示服务器HTTP的版本,StatusCode表示服务器发回的响应状态码,ReasonPhrase表示状态代码的文本描述。
状态码由3位数字组成,左侧第一位数字定义了响应的类别,有5种可能取值,具体说明如表32所示。表32状态码取值说明状态码说明1××指示信息。表示请求已被接收,继续处理2××成功。表示请求已被成功接收、理解并接受3××重定向。表示要完成请求必须进行更进一步的操作4××客户端错误。表示请求有语法错误或请求无法实现5××服务器端错误。表示服务器未能实现合法的请求常见状态码及状态描述短语如表33所示。表33常见状态码及状态描述短语状态码及状态描述短语说明200 OK客户端请求成功400 Bad Request客户端请求有语法错误,不能被服务器所理解401 Unauthorized请求未经授权,这个状态代码必须和WWWAuthenticate报头域一起使用403 Forbidden服务器收到请求,但是拒绝提供服务404 Not Found请求资源不存在,例如输入了错误的URL500 Internal Server Error服务器发生不可预期的错误503 Server Unavailable服务器当前不能处理客户端的请求,一段时间后可能恢复正常2. 响应头
响应头允许服务器传递HTTP响应的附加信息、关于服务器的信息和对URL所标识的资源进行下一步访问的信息。响应头的详细讲解见3.1.5节。
3. 响应实体
响应实体即服务器返回资源的内容。
3.1.5HTTP消息
图34HTTP头结构示意图
HTTP消息又称HTTP头(HTTP header),包括普通头、请求头、响应头、实体头4部分。其一般结构如图34所示。
1. 普通头
在普通头中,有少数报头用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。
请求时的缓存指令包括nocache(用于指示请求或响应消息不能缓存)、nostore、maxage、maxstale、minfresh、onlyifcached。
响应时的缓存指令包括public、private、nocache、nostore、notransform、mustrevalidate、proxyrevalidate、maxage、smaxage。
常用的HTTP普通头如下:
CacheControl: 用于指定缓存指令。缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制)。
Date: 表示消息产生的日期和时间。
Connection: 允许发送指定连接的选项。例如指定连接是连续的,或者指定close选项,通知服务器在响应完成后关闭连接。
2. 请求头
请求头只出现在HTTP请求中,请求头允许客户端向服务器传递请求的附加信息以及客户端自身的信息。
常用的HTTP请求头如下:
Host: 主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的,例如Host: www.example.com: 88。
UserAgent: 允许客户端将它的操作系统、浏览器和其他属性告诉服务器。某些网站能列出用户的操作系统名称和版本,用户所使用的浏览器的名称和版本其实是服务器从UserAgent请求头中获取的,例如UserAgent: My privacy。
Referer: 包含一个URL,代表当前访问URL的上一个URL。例如Referer: www.example.com/login.php,代表用户从login.php来到当前网页。
Cookie: 是一段明文显示的文本信息,常用来表明请求者身份等。Cookie的详细讲解见3.1.6节。
Range: 可以请求正文的部分内容,多线程下载一般会用到此请求头。例如Range: bytes=0~499,表示正文头为500B。
xforwardfor: 即XXF头,它代表请求端的IP,可以有多个,中间使用逗号隔开,例如xforwardfor: 127.0.0.1。
Accept: 用于指定客户端接受哪些MIME类型的信息。例如,Accept: image/gif,表明客户端接受GIF图像格式的资源;Accept: text/html,表明客户端接受HTML文本。
AcceptCharset: 用于指定客户端接受的字符集,例如AcceptCharset: gb2312。
AcceptLanguage: 用于指定客户端接受的语言,例如AcceptLanguage: zhcn。
AcceptEncoding: 用于指定客户端接受的内容编码,例如AcceptEncoding: gzip.deflate。
3. 响应头
响应头允许服务器传递响应的附加信息、关于服务器的信息和对URL所标识的资源进行下一步访问的信息。
常用的HTTP响应头如下:
Location: 用于重定向接收者到一个新的位置,服务器在接收到这个请求后会立刻访问Location响应头指向的页面,常配合302状态码使用。
Server: 包含服务器用来处理请求的软件信息,与UserAgent请求头相对应,例如Server: ApacheCoyote/1.1。
Refresh: 服务器通过该响应头告诉浏览器定时刷新。
SetCookie: 用于指定服务器向客户端设置Cookie。
4. 实体头
请求和响应消息都可以传送一个实体。实体头定义了关于实体正文和请求所标识的资源的元信息。元信息也就是实体内容的属性,包括实体信息类型、长度和压缩方法等。
常用的HTTP实体头如下:
ContentType: 用于指明发送给接收者的实体正文的媒体类型,例如ContentType : text/html;charset=GB2312。
ContentEncoding: 被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得ContentType实体头中所引用的媒体类型,必须采用相应的解码机制,例如ContentEncoding: gzip。
ContentLanguage: 描述了资源所用的语言,例如ContentLanguage: zhcn。
ContentLength: 说明实体正文的长度,以字节数的十进制来表示。
LastModified: 说明资源的最后修改日期和时间。
Expires: 给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中的页面(再次访问曾访问过的页面时,直接从缓存中加载,可以缩短响应时间和降低服务器负载),可以使用Expires实体头域指定页面过期的时间。
3.1.6Cookie
因为HTTP是一个无状态的协议,所以一旦数据交换完毕,客户端与服务器的连接就会关闭,再次交换数据时需要建立新的连接,这意味着服务器无法从连接上跟踪会话。即,用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪会话,必须采用Cookie机制。
Cookie实际上是一小段文本信息。在客户端访问服务器之后,服务器会根据不同的情况,在HTTP响应头中置入SetCookie通知客户端设置Cookie。客户端浏览器会以“名称=值”的形式在本地保存Cookie。在每次进行HTTP会话时,Cookie都会作为一个字段明文放置在HTTP头中,以此传递用户的状态。
SetCookie的一般形式如下: Set-Cookie:NAME=VALUE[;domain=DOMAIN][;path=PATH][;max-age=AGE][;expire=EXPIRE][;secure][;HttpOnly]具体示例如下: Set-Cookie:key1=example;domain=.example.com;path=/example;expire= Wednesday, 19-OCT-05 23:12:40 GMT;[secure]其中,第一部分是“名称=值”数据对,这部分不能省略;domain部分指定Cookie被发送到哪个服务器主机,假设domain=.example.com,则Cookie会发送到*.example.com上,如果domain为空,则domain与当前网站相同;path部分控制哪些访问能够触发该Cookie的发送,如果未指定path,Cookie将对全站生效;expire部分指明了Cookie失效的时间,如果未指定expire,Cookie只会持续到本次会话结束,但是现已被maxage取代;如果指定了secure,那么Cookie只能通过安全通道传输(即SSL通道),否则浏览器将会忽略此Cookie;而在支持HttpOnly的浏览器中,JavaScript无法读取和修改HttpOnly Cookie,这样可以让Cookie免受脚本攻击。
Cookie中可以包含除了逗号、分号、空格之外所有可打印的ASCII字符。除了服务器端的设置,浏览器中的脚本也可以通过给对象document.cookie赋值来设置页面的Cookie。
在客户端浏览器设置完Cookie后,下次访问资源的时候服务器就可以识别用户,从而实现了状态的传递。而客户端也可以读取Cookie中的内容,将Cookie作为和服务器共享数据的工具。3.2HTTP校验HTTP的使用极为广泛,但是却存在不小的安全缺陷。HTTP在设计时并未考虑信息的加密和验证,因此HTTP面临着数据的明文传输和缺乏对消息完整性的验证机制两个问题。类似网银支付、账号登录等需要安全保证的地方,如果使用HTTP可能会导致严重的信息泄露风险。
在HTTP的数据传输过程中,只要攻击者能够控制受害者网络,便可以轻易地嗅探、修改HTTP传输的内容。另外,HTTP在传输客户端请求和服务器响应时,仅仅在报文头部包含了传输的数据的长度(数据长度这一栏也可以被攻击者任意修改),而没有任何校验数据完整性的机制,这使得它极容易受到攻击者的篡改。
由于HTTP请求是由客户端发起的,因此HTTP请求相较于HTTP响应更容易受到攻击者的篡改。当大量畸形的HTTP请求数据包攻击服务器时,将影响服务器对正常请求的反应速度,严重的甚至会造成服务器缓冲区溢出或者服务器瘫痪。例如,HTTP Split攻击利用了服务器处理HTTP格式的机制漏洞,向HTTP数据包中注入CRLF,从而将当前的HTTP数据隔断成两个数据包,使攻击者有机会控制当前的HTTP响应和下一次的HTTP响应。
因此为了加强HTTP数据传输的安全,可以引入Web应用防火墙对HTTP的请求进行异常检测,即进行HTTP校验。
通过WAF可以设置HTTP包头各字段的长度限值、个数限值等,进行细粒度的HTTP校验。当客户端向服务器发起请求时,WAF引擎获取标准头中的数据,对源IP对象向服务器IP对象的请求进行校验,然后将规则中设定了限值的实际值和限值比较,如果大于限值,则说明可能遭受了畸形HTTP包的攻击。
针对HTTP请求报文整体,可以对参数个数、HTTP请求最大长度、请求行的最大长度、头信息最大个数、消息体实际长度等进行校验;针对HTTP请求行,可以检测URL的最大长度、参数最大个数、参数最大长度;针对HTTP请求头,可以对各种常用请求头的个数及长度进行限制;同时也可以检查HTTP的版本号和请求方法、HOST域是否为空、POST请求消息报头中的content_length是否为空等。3.3HTTP访问控制访问控制(access control)是指系统对用户身份及其所属的预先定义的策略组限制其使用数据资源能力的手段,通常用于系统管理员控制用户对服务器、目录、文件等网络资源的访问。
访问控制是系统机密性、完整性、可用性和合法使用性的重要基础,是网络安全防范和资源保护的关键策略之一,也是主体依据某些控制策略或权限对客体本身或其资源进行的不同授权访问。访问控制的主要目的是限制访问主体对客体的访问,从而保障数据资源在合法范围内得以有效使用和管理。抽象地说,即限制某个主体对某个客体实施某种操作。
建立访问控制模型和实现访问控制都是抽象和复杂的行为,实现访问的控制不仅要保证授权用户使用的权限与其所拥有的权限对应,制止非授权用户的非授权行为;还要保证敏感信息的交叉感染。访问控制的实现首先要考虑对合法用户进行验证,然后对控制策略进行选用与管理,最后对非法用户或是越权操作进行管理。
HTTP访问控制主要是针对网络层的访问控制,通过配置面向对象的通用包过滤规则实现控制域名以外的访问行为。具体的访问控制分为以下3类:
(1) 对访问者访问的URL的控制,允许或不允许访问设定的URL对象。即防止合法用户对受保护的网络资源进行非授权的访问。为保障系统内部信息的机密性与完整性,减少关键信息丢失或被修改的风险,管理员应根据业务的需要对服务器内的关键资源所在的URL进行访问控制。
(2) 对访问者的HTTP方法的控制,允许或不允许设定的HTTP方法访问。即对越权操作进行管理。只是获取信息而不会更改服务器状态的方法是安全的。例如HEAD、GET、OPTIONS和TRACE一般被认为是安全的方法;而POST、PUT、DELETE和PATCH由于可能会改变服务器状态,所以一般被认为是不安全的;WebDAV拓展的HTTP方法由于涉及文件的读写,也被认为是不安全的。
(3) 对访问者的IP的控制,允许或不允许设定的IP对象访问。即保证合法用户访问受权保护的网络资源,防止非法的主体访问受保护的网络资源。对访问者的IP进行控制能有效地防御分布式拒绝服务(Distributed Denial of Service,DDoS)攻击。DDoS攻击是指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台发动拒绝服务(Denial of Service, DoS)攻击,从而成倍地提高拒绝服务攻击的威力。在向目标系统发起的恶意攻击请求中,会随机生成大批假冒源IP。一般而言,任何进入内部网络的数据包都不能把网络内部的地址作为源地址,任何进入内部网络的数据包都必须把网络内部的地址作为目的地址,任何离开内部网络的数据包都必须把网络内部的地址作为源地址,任何离开内部网络的数据包都不能把网络内部的地址作为目的地址。
思考题
1. HTTP的URL的一般格式是什么?
2. CRLF是指什么?简述HTTP响应报文的结构。
3. 写出5种HTTP请求方法,并简述其作用及安全性。
4. 第一个数字为4的状态码表示什么?404 Not Found具体表示什么?
5. 分别说明Referer、Host、SetCookie是哪种类型的HTTP头,并简述它们的作用。
6. SetCookie的一般形式是什么?
7. 写出5个HTTP的校验的对象及限制。
8. HTTP访问控制主要对TCP/IP的哪一层进行访问控制?具体可以分为哪几类?第4章Web防护
Web应用都必须由Web服务器提供支撑,Web服务器是构建和支撑各类网站和信息系统的最重要的基础设备之一。随着Web应用的普及和发展,针对Web服务器的各种攻击手段也层出不穷,攻击者通过入侵Web服务器窃取Web服务器后台数据库中数据的网络安全事件屡屡发生,因此Web服务器的安全防护至关重要。本章主要介绍Web应用常见的SQL注入、跨站脚本攻击、跨站请求伪造、恶意流量、文件上传和下载等攻击的原理、检测和防范措施,同时介绍Web服务器敏感信息泄露和弱口令的原理、检测及防范措施。4.1弱密码弱密码(weak password)也称弱口令,即容易破解的密码,通常是简单的数字组合、键盘上的邻近键或用户常用信息,例如123456、abc123、qwerty等。终端设备出厂配置的通用密码等也属于弱密码,例如网络设备出厂时设置的管理员初始密码为admin,而用户在使用的过程中未修改管理员的初始密码。在设备的操作使用手册中会介绍设备的用户名和初始密码,如果用户在使用的过程中不修改用户的初始密码,系统就极易遭受攻击。表41列举了一些国内外常见的弱密码和用户名。表41常见的弱密码和用户名中国常见弱密码000000、111111、11111111、112233、123123、123321、123456、12345678、654321、666666、888888、abcdef、abcabc、abc123、a1b2c3、aaa111、123qwe、qwerty、qweasd、admin、password、p@ssword、passwd、iloveyou、5201314、asdfghjkl、66666666、88888888国外常见弱密码password、123456、12345678、qwerty、abc123、monkey、1234567、letmein、trustno1、dragon、baseball、111111、iloveyou、master、sunshine、ashley、bailey、passw0rd、shadow、123123、654321、superman、qazwsx、michael、football、asdfghjkl系统常见用户名admin、administrator、apache、root、backup、cyrus、ftp、guest、oracle、test、user、tester、www、Web、server、toor、Webmaster、student、students、postgres、mysql、nagios、info、server4.1.1弱密码攻击
长期以来,弱密码一直是各项安全检查、风险评估报告中最常见的高风险安全问题,成为攻击者控制系统的主要途径。由于大部分安全防护体系是基于密码的,如果密码被破解,就意味着其安全体系的全面崩溃。
弱密码漏洞有三大特点:
(1) 危害大。弱密码漏洞是目前最为高危的安全漏洞之一,当系统的管理员口令是弱密码时,攻击者可利用管理员用户的弱密码进入系统,从而控制整个系统。
(2) 易利用。弱密码也是最容易被利用的安全漏洞之一,攻击者只需要利用简单的IE浏览器或者借助简单的工具技能就能对此种类型的漏洞进行利用。
(3) 修补难。如果系统的弱密码没有固化在固件中,是可以修改的,此种类型的弱密码修补成本非常低,管理人员可以随时修改。但是往往由于用户的安全意识比较差,没有及时修改弱密码,从而导致弱密码被攻击者利用。如果管理员的弱密码被固化在固件中,弱密码的修补成本就比较高。很多已经售出的产品修改弱密码的成本更高。
弱密码攻击的方法主要有以下9种:
Web应用防火墙技术及应用第4章Web防护(1) 社会工程学(social engineering),通过人际交往这一非技术手段,以欺骗、套取的方式来获得密码。避免此类攻击的对策是加强用户安全意识。
(2) 猜测攻击。首先使用密码猜测程序进行攻击。密码猜测程序往往根据用户定义密码的习惯猜测用户密码,像名字缩写、生日、公司名等。在详细了解用户的社会背景之后,攻击者可以列举出几百种可能的密码,并在很短的时间内就可以完成猜测攻击。
(3) 字典攻击。如果猜测攻击不成功,入侵者会继续扩大攻击范围,对所有英文单词进行尝试,程序将按序取出一个又一个的单词,进行一次又一次尝试,直到成功。
(4) 穷举攻击。如果字典攻击仍然不能够成功,入侵者会采取穷举攻击。利用穷举法暴力破解是较多的弱密码检查工具(如Cain and Abel或者其他破解工具)采用的方法。为了避免计算量过大和破译时间太长,这些破解工具通常会使用密码字典,只对字典里的密码进行尝试。
(5) 混合攻击,结合了字典攻击和穷举攻击,先进行字典攻击,再进行穷举攻击。
(6) 直接破解系统的密码文件。入侵者会寻找目标主机的安全漏洞和薄弱环节,盗取存放系统密码的文件,然后破译加密的密码,以便冒充合法用户访问这台主机。
(7) 网络嗅探。通过嗅探器(sniffer)在局域网内嗅探明文传输的密码字符串。避免此类攻击的对策是网络传输采用加密传输的方式进行。
(8) 键盘记录。在目标系统中安装键盘记录后门,记录操作员输入的密码字符串。很多间谍软件、木马等都采用这种方法盗取密码。
(9) 其他攻击方式,包括中间人攻击、重放攻击、生日攻击、时间攻击等。
4.1.2弱密码检测
从检测方法来看,Web应用系统的弱密码检测可以分为白盒检测和黑盒检测两类方法。
对于弱密码检测来说,白盒检测是指通过直接查询数据库的方法,将存放用户名和密码的表数据提取出来,然后将查询到的用户密码与事先定义好的弱密码字典进行匹配,检查是否存在弱密码的情况。这类方法可以对应用系统弱密码情况进行全面排查,做到无遗漏、无死角,且检测效率高。但这类方法由于需要直接连接数据库,因此无法进行远程操作,且要求测试者对应用系统的数据库信息和表结构非常清楚。
黑盒检测则是一类更为常见的弱密码检测方法。相对于白盒检测,黑盒检测是基于数据驱动的测试,这种检测不需要了解软件系统的内部情况、逻辑结构等,只需知道程序的输入输出接口和主要功能即可。穷举法(暴力破解)是弱密码黑盒检测的一种主要方法,其原理是利用应用系统的登录接口,对所有符合弱密码条件的用户密码进行逐一验证,如果其中某种情况能够登录成功,则说明该账号存在弱密码情况。这类方法的优势是简单、方便,可远程操作。其缺点是容易受到应用系统的登录限制,例如,如果应用系统具备登录失败锁定功能,则穷举法将无法实施。
4.1.3弱密码防范
360安全中心针对中国网民密码使用习惯发布了“密码安全指南”,建议网民从以下4个方面保护账号安全:
(1) 尽量使用“字母 数字 特殊符号”形式的高强度密码。
(2) 网银、网上支付、常用邮箱、聊天账号单独设置密码,切忌“一套密码到处用”。
(3) 按照账号重要程度对密码进行分级管理,重要账号定期更换密码。
(4) 避免以生日、姓名拼音、手机号码等与身份隐私相关的信息作为密码,因为攻击者针对特定目标破解密码时,往往首先试探此类信息。
要有效防范弱密码攻击,首先要选择一个好的密码,并且要注意保护密码的安全。好密码是防范弱密码攻击的最基本、最有效的方法。最好采用字母、数字、标点符号和特殊字符的组合,同时有大小写字母,长度最好达到8个以上,绝对不要用易于被他人获知的信息作密码。
注意保护密码安全。不要将密码记在纸上或存储于计算机文件中;最好不要将自己的密码告诉其他人;不要在不同的系统中使用相同的口令;在输入口令时应确保无人在身边窥视;在公共上网场所(如网吧等处)最好先确认系统是否安全;定期更改口令,至少6个月更改一次,这会使遭受口令攻击的风险降到最低。
目前,Web应用防火墙也具有弱密码的检测及防护功能,当WAF检测到系统中存在的弱口令时,会将弱口令转换为复杂口令展示给用户,但实际交互的还是原口令。4.2SQL注入注入(injection)类漏洞是Web应用系统中最常见的安全漏洞。注入类漏洞的共同特点是Web应用程序对用户输入的参数未做输入验证和过滤处理就输出到相应的请求对象中存储或执行,从而给Web服务器、应用系统和数据库带来安全隐患。
SQL注入漏洞是危害性很大的一种注入类漏洞。攻击者利用SQL注入漏洞可从数据库中获取敏感信息,在数据库中添加数据库操作用户,从数据库中导出文件,甚至获取数据库系统的管理员权限。
4.2.1SQL注入攻击原理
Web应用系统普遍采用三层架构,即由表示层、业务逻辑层和数据层组成,如图41所示。其中数据层为后台数据库系统,SQL 注入攻击的对象主要是后台数据库系统。
图41三层架构
SQL注入漏洞主要存在于动态网站的Web应用系统中。攻击者将恶意的SQL语句插入表单的输入域或网页请求的查询字符串中提交给Web服务器。如果Web应用程序没有对用户的输入进行检查和过滤,在接收后将攻击者的输入作为原始SQL查询语句的一部分,则会改变程序原始的SQL查询逻辑,从而执行攻击者构造的SQL查询语句,产生严重的后果,如图42所示。
图42SQL注入攻击示意图
SQL 注入攻击具有如下特点:
(1) 普遍性。SQL注入攻击利用了SQL语法,只要Web应用程序对输入的SQL语法未做安全检查和过滤处理,就可能存在SQL注入漏洞。在基于三层架构的Web应用系统中,使用SQL语言的数据库非常普遍,即它们都可能存在SQL注入漏洞,受到SQL注入攻击的威胁。
(2) 隐蔽性。SQL注入攻击通过用户输入来构造新的SQL语句,以获取信息和对Web服务器进行非法操作的权限,因此其操作与正常的Web网页访问没有区别,非常隐蔽,一般的防火墙等防护设施不会对它进行拦截或发出警告。
(3) 简单性。SQL注入攻击方法比较简单,易学易用,攻击者不必具备太多的SQL注入攻击的知识和技术,只要从互联网下载一些SQL注入软件工具,这些工具基本都是图形化界面,使用这些工具即可轻易地对存在SQL注入漏洞的Web网站进行攻击。
(4) 危害性。SQL注入漏洞的危害性是显而易见的,如果一个Web应用系统遭受SQL注入攻击,轻则Web网站内容被篡改,泄露敏感信息,重则Web服务器被植入木马,被攻击者所控制。
4.2.2SQL注入漏洞利用〖*2〗1. 攻击流程一般情况下,SQL注入攻击的流程如下。
(1) 探测SQL 注入点。SQL注入点通常存在于含有参数的动态网页中。常见的探测方法是在有参数传递的地方输入参数,并且添加“’”、永真式and 1=1或永假式and 1=2等语句。如果浏览器返回错误信息,则说明对输入未做处理;如果添加and 1=1和and 1=2时浏览器返回的结果不同,则说明存在SQL注入点。
(2) 判断数据库类型。攻击者根据不同的数据库类型采取不同的攻击方式。
(3) 提升权限,进一步攻击。攻击者在确定数据库的相关信息并获取权限后,就会开始攻击。例如,攻击者可以随意添加和修改管理员账号、修改网站内容、开放远程终端服务、利用上传功能植入木马程序等,并通过这些手段最终取得对服务器的控制。
图43展示了SQL注入攻击的流程。
图43SQL注入攻击的流程
2. 注入方式
SQL注入攻击主要有以下3种注入方式:
(1) 利用用户输入注入。攻击者利用用户输入来注入SQL语句。通过HTTP的GET和POST请求处理用户输入的Web应用程序更容易受到SQL注入攻击。Web应用程序使用用户输入来构造SQL查询,然后提交给数据库。
(2) 利用Cookies注入。Cookies文件包含Web应用程序生成的状态信息并将其存储在客户端,当客户端再次访问这个Web应用程序时,Cookies会返回存储的状态信息,即客户端可以完全控制Cookies中存储的内容。如果一个Web应用程序使用Cookies中的内容来构造SQL查询,则攻击者可以轻易地将恶意的SQL语句注入Cookies中,并提交给Web应用程序。
(3) 利用系统变量注入。系统变量包含了HTTP、网络Header和环境变量,Web应用程序需要使用这些变量。
3. 攻击方式
SQL注入攻击方式有很多种,但本质上都是由SQL语言的属性来决定的。
(1) 重言式攻击。这是黑客常用的实现SQL注入攻击的技术之一。Web系统中采用的典型的用户登录认证处理是由用户提供用户名和口令,Web应用程序利用用户输入动态地构造以下SQL查询语句: Query=”SELECT FROM account WHERE username ='”
request.getParameter(“username”) ” ‘ AND password=
‘” request.getParameter(“password” ) “‘” 在上述SQL查询语句的动态构造处理过程中,Web应用程序只是利用拼接操作 将等号右边的4个部分看成无任何结果的字符序列,将其连接在一起,形成一个字符串。此时,假设黑客攻击者提供这样的输入: 在用户名域输入abc,在口令域输入” ‘ OR’1’=’ 1″;此时,Web应用程序拼接得到一个其条件表达式为重言式的SQL查询语句,如下: SELECT FROM account WHERE username = ‘abc’ AND password = ‘ ‘ OR’1′ =’ ‘1’上述处理使得数据库把WHERE后面的句子解释为条件语句,这样就把OR 1=1 子句包含了进去,成功实现了重言式的构造,使得数据库返回所有用户在数据库中的记录。攻击者还可以利用重言式攻击插入修改和破坏数据库表格的多种查询命令,造成极其严重的后果。
(2) 非法或逻辑错误查询攻击。该攻击的原理是识别可攻击的参数、分析数据库的关系结构、提取数据等。攻击者通过这种攻击收集Web应用程序后台数据库的类型和结构等信息,为实施其他攻击建立前提条件。攻击者尝试注入语句导致数据库出现语法错误、类型错误或者逻辑错误,语法错误可以用来判别可注入参数,类型错误可以用来推断某一列的数据类型和提取数据,逻辑错误可能泄露表名和列名。利用这些信息,攻击者可以实施进一步攻击。
(3) 联合(union)查询攻击。该攻击的原理是绕过身份验证机制来提取数据。攻击者通过构造联合查询,将注入的查询语句插入正常的SQL 语句中,从而获得希望得到的信息。
(4) 附带查询攻击。该攻击的原理是提取、增加和修改数据库中的数据,实现拒绝服务攻击和远程命令执行。在这种攻击中,攻击者尝试在原有的查询语句中加入新的查询语句,与其他攻击类型不同的是,它不改变原有的查询语句,而是在原来的查询语句后面“附带”查询语句。这种攻击一般依赖于数据库配置,需要数据库配置为支持在单个字符串中包含多个查询语句。
(5) 利用存储过程攻击。该攻击的原理是扩大权限,实施服务器拒绝服务攻击和远程命令执行。这种攻击是通过执行数据库中存在的存储过程来达到目的。大多数的数据库系统为了实现与操作系统的交互,扩展数据库的功能,都会使用一系列标准存储过程。因此,只要攻击者确定了应用后台数据库的类型,就可以构造命令来执行数据库所提供的存储过程。一些程序员有一种错误的观念,以为使用存储过程可以避免SQL 注入攻击。事实上,存储过程和普通的程序一样,都存在着安全风险,并且存储过程一般都是用特定的脚本语言编写的,因此它可能包含其他类型的漏洞,如缓冲区溢出漏洞等。
(6) 推断攻击。该攻击的原理是识别可注入的参数,提取数据,识别数据库策略。这种攻击针对数据库构造查询,查询得到的结果一般都是真或者假。攻击者之所以采用这种攻击方法,主要的原因是网站管理员对数据库进行了安全设置,使用非法或逻辑错误的查询方式无法得到数据库返回的出错信息,也就无法获得数据库的相关信息。推断攻击方法有两种: SQL盲注入和时间盲目注入。SQL盲注入是由于网站并不会返回具体的数据或信息,只能通过对参数进行不同输入得到相应结果来判断此参数是否可以注入;时间盲目注入是当页面不返回任何错误信息或者不会输出联合查询注入所查出来的数据信息时,通过使用数据库中可以延长响应时间的函数来进行信息获取。在MySQL中,使用BENCHMARK()或者SLEEP()函数重复执行某一操作或使执行操作睡眠一定时间。例如以下查询:SELECT BENCHMARK(10000000,ENCODE(‘hello’, ‘goodbye’))便会因为执行大量的编码操作而延缓返回的时间,攻击者可以在SQL语句中添加条件判断,通过每次请求的时间来判断结果。
(7) 替换编码攻击。该攻击的原理是躲避编码安全性检测系统的检测。一般的编码安全性检测系统都会对已知的恶意字符进行检测,如单引号和注释符等。为了躲避这种检测机制,就出现了替换编码攻击方式,它经常与其他攻击方式结合起来使用。
4.2.3SQL注入漏洞检测
SQL注入漏洞检测有以下几种方法: 基于源代码复查的静态检测方法,基于渗透测试的动态检测方法和基于文档对象模型(DOM)的检测方法。
静态检测方法可有针对性地对代码依赖关系进行分析,对变量和数据流进行跟踪,其方法主要有3种: 基于字符串的模式匹配法、词法标记匹配法和基于抽象语法的数据流分析法。源代码复查方法在复查代码上具有较高的检查效率,但缺点是误报率和漏报率都比较高,并且需要有经验的程序员进行复查。
动态检测方法主要采用渗透测试技术,通过查找网页中的注入点,构建相应的测试用例,对Web应用系统进行测试,通过分析Web服务器的响应信息来验证是否存在SQL注入漏洞。由于动态检测方法限制条件少,针对性强,检测准确率高,更适合对Web应用系统进行安全性检测。
基于文档对象模型(DOM)的检测方法,通过分析目标网页的DOM,找出向Web服务器提交数据的URL、Form和Cookies,形成注入点列表。在此基础上依次构建相应的测试用例,通过对Web服务器响应数据进行特征匹配或差异化分析,确定是否存在SQL注入漏洞。
SQL注入漏洞扫描分析工具结构如图44所示。具体的漏洞扫描分析流程如图45所示。
图44SQL注入漏洞扫描分析工具结构
图45漏洞扫描分析流程4.2.4SQL注入漏洞防范
SQL注入漏洞防范主要采用两种方法: 一种是增强Web应用程序本身的安全性,这也是最根本的方法;另一种是增强Web应用系统运行平台的安全性,包括部署Web应用级防火墙、设置数据库安全措施以及其他的防护措施等。
增强Web应用程序本身的安全性即在设计Web应用程序时充分考虑到如何避免SQL注入漏洞问题,采用SQL参数化语句、输入验证、输出编码、规范化以及避免SQL注入漏洞的程序设计等方法来增强Web应用程序本身的安全性。
1. SQL参数化语句
产生SQL注入漏洞的根源是把SQL查询语句当作普通字符串提交给数据库执行,这就是动态字符串或动态SQL查询语句的创建问题。现在的大多数编程语言和应用程序数据库访问接口都允许编程人员通过参数化语句,使用占位符或者绑定的变量来创建SQL查询语句,以替代直接通过用户输入来创建SQL查询语句。
SQL参数化语句是一种更安全的动态查询创建方式,可以避免一般的SQL注入漏洞。一般情况下,它可以用来代替动态查询,由于现在的数据库具有查询优化能力,因此这种方法具有很高的查询速度和执行效率。
然而,使用SQL参数化语句也存在向数据库传递不安全参数的可能性。例如,一个查询语句或者存储过程的调用并没有改变传递给数据库的参数值内容,因此,如果数据库的功能函数调用在存储过程或者函数完成过程中使用了动态SQL查询语句,还是有可能会发生SQL注入漏洞。
2. 输入验证
输入验证就是验证用户的输入是否符合系统定义的标准,它可能简单到直接验证一个参数的类型,也可能复杂到使用正则表达式或者业务逻辑去验证用户输入。用户输入验证有两种方式: 白名单验证和黑名单验证。
(1) 白名单验证。建立白名单,将允许输入的类型、长度或大小、数值范围以及其他格式标准等存入白名单。在接收用户输入时,首先通过白名单验证用户输入的合规性,以确定是否接受用户输入。如果是白名单允许的输入,则接受该输入,否则拒绝。在白名单验证中,通常采用正则表达式进行比对。然而白名单存在的问题是很难覆盖所有复杂的、各种可能的输入,因此,需要和其他方法配合使用,如输出编码方法等。白名单防范模型如图46所示。
图46白名单防范模型(2) 黑名单验证。建立黑名单,将不允许输入的字符、字符串和模式等加入黑名单。当接收用户输入时,首先通过黑名单验证用户输入的非法性,以确定是否接收用户输入。黑名单验证方法也使用正则表达式,但这种方法没有白名单验证效率高,因为潜在威胁的字符数量庞大,使得黑名单比较庞大,检测过程比较慢。一般情况下,不会单独使用黑名单验证,而是使用白名单验证。在无法使用白名单验证的情况下,黑名单验证也是一种可选的验证方式。黑名单防范模型如图47所示。
图47黑名单防范模型
3. 输出编码
除了对用户输入进行验证外,还需要对程序各个模块之间或者各个部分之间传递的数据进行编码。在可能存在SQL注入漏洞的环境中,为了保证传递给数据库的数据不会被错误地处理,需要对输出进行编码。
有一种情况经常会被忽略,就是当编码的信息来自数据库,尤其是使用过的数据,通常不会对这些数据进行验证或者过滤处理。在这种情况下,虽然不会直接导致SQL注入漏洞,但还是应当考虑采用类似的编码方式进行处理,以防止产生其他安全漏洞,如XSS攻击等。
4. 规范化
输入验证和输出编码这两种方法都需要将数据转化成最终用户想要的格式,在实际应用中存在一定的难度。在这种情况下,可以使用规范化方法。所谓规范化就是将输入变为规范格式或者简单格式的过程。常用的规范化方法如下。
(1) 拒绝所有不符合规范格式的输入。当输入中出现不期望的编码时,拒绝其输入。同时,当使用白名单验证方式拒绝普通格式的字符时,它是一种默认的处理方法。使用这样的方法至少可以拒绝经过编码的字符。
(2) 对输入编码进行解码分析。可采用两种方式: 一是只要输入数据中存在编码,就要进行一次解码,判断解码后是否还存在编码字符,这样对每一步都要进行一次判断;二是只对输入进行一次解码,只要解码后的数据中还存在编码字符就拒绝接受,这种方式是以假设输入都只编码一次为前提。
5. 避免SQL注入漏洞的程序设计
前面几种方法既可以用于正在开发的Web应用系统,也可以用于已存在的Web应用系统,但是可能需要对原来的Web应用程序结构进行重新构造。
在开发一个新的Web应用系统时,最好采用安全的程序设计方法,以避免或减轻
评论
还没有评论。