第七章 注入攻击
2个关键条件
用户能够控制输入;
原本程序要执行的代码,拼接了用户输入的数据。
7.3 正确的防御SQL注入
1.使用预编译语句。
2.使用存储过程。
3.检验数据类型
4.使用安全函数。
第八章 文件上传漏洞
8.1 文件上传漏洞概述
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。
要完成这个攻击,需要满足如下几个条件:
1.上传的文件能够被web容器解释执行。所以文件上传后所在的目录要是Web容器所覆盖到的路径。
2.用户能够从Web上访问这个文件。如果文件上传了,但用户无法通过Web访问,或者无法获得Web容器解释这个脚本,那么也不能称之为漏洞。
3.用户上传的文件若被安全检验、格式化、图片压缩等功能改变了内容,则也可能导致攻击失败。
8.1.2 绕过文件上传检验功能
再上传文件的检验中,很多应用都是通过判断文件名的后缀名的方法来验证文件的安全性的。
但是在某些时候,攻击者手动修改了上传过程中的POST包,在文件名后面添加一个%00字节,则可以截断某些函数对文件名的判断。因为在许多语言的函数中,比如C、php等于眼的常用字符串处理中,0x00被认为是终止符。
比如应用原本只允许上传JPG图片,那么可以构造文件名(需要修改post包)为xxx.php[\0].JPG,其中[\0]为十六进制的0x00字符,JAP绕过了应用的上传文件类型;但对于服务器来说,此文件因为0x00字符截断的关系,最终却会变成xxx.php。
8.2功能还是漏洞!!!
8.2.1Apache文件解析问题
比如在Apache1.x、2.x中,对于文件名的解析存在以下特性。
Apache对于文件名的解析是从后往前解析的,直到遇见一个Apache认识的文件类型为止。
比如:
Phpshell.php.rar.rar.rar.rar
因为Apache不认识.rar这个文件类型,所以会一直便利后缀到.php,然后认为这是一个php文件。
(Apache认识的文件定义在Apache的mime.type文件中)
Apache的这个特性,很多工程师在写应用的时候并不知道,即便知道,可能有的人也会认为只是WebServer应该做的事情。如果不考虑这些因素的话,写出的安全检验功能可能会存在缺陷。比如rar是一个合法的上传需求,在应用李值判断后缀rar,最终用户上传的phpshell.php.rar.rar会被执行。
8.2.2 IIS文件解析问题
IIS6在处理文件解析时,也出现过一些漏洞。前面提到的0x00字符截断文件名,在IIS和windows环境下就曾出现过非常类似的漏洞,不过截断字符变成了“;”。
当文件名为abc.asp;xx.jsp,IIS6会将文件解析称abc.asp
此外,IIS曾出现过一个漏洞,因为处理文件夹扩展名出错,导致将/*.asp/目录下所有的文件都做为asp文件进行处理。
8.3 设计安全的文件上传功能
1.文件上传的目录设置为不可执行
2.判断文件类型
结合MIME Type、后缀检查等方式。
在文件类型检查中,强烈推荐白名单的方式,黑名单的方式已经无数次被证明是不可靠的。
对于图片的处理,可以使用压缩函数或者resize函数,处理图片的同时,破坏其中的代码。
3.使用随机数改写文件名和文件路径
4.单独设置文件服务器的域名
由于浏览器同源策略的关系,一系列客户端攻击将失效。
第九章 认证与会话管理
9.1 Who am I?
认证的目的是为了认出用户是谁,授权的目的是为了决定用户能做什么。
9.2 密码那些事儿
密码的优点是使用成本低,认证过程实现起来很简单;缺点是密码认证是一种比较弱的安全方案。
一般来说,密码必须以不可逆的加密算法,或者是单向散列函数算法,加密后存在数据库中,这样即使是网站管理人员也不能够看到用户的密码。
目前,黑客们广泛使用的一种破解MD5后密码的方法是“彩虹表”。
彩虹表的思路是手机尽可能多的密码明文和MD5对应值,为了避免黑客通过采用表查询出密码明文,在计算密文的时候,增加一个“salt”以增加明文的复杂度。
9.5 Session Fixation攻击
在用户登录网站的过程中,如果登录前后用户的SessionID没有发生变化,则会存在Session Fixation问题。
具体的攻击过程是,攻击者先获取到一个未经认证的SessionID,然后用这个SessionID交给用户认证。认证完成后服务器并没有更新SessionID的值,所以攻击者可以通过SessionID直接进入Y的账户。如果SessionID保存在Cookie中,比较难做到这一点,但是如果保存在URL中,那么攻击者只需诱使用户打开这个链接即可。
解决Session Fixation的正确做法是登录完成后,重写SessionID。
9.7 单点登录(SSO)
从用户体验的角度看,SSO无疑让用户的使用更加方便;但是从安全的角度,SSO把风险集中在了单点上。
SSO的优点在于风险集中化,只需要保护好这一点。解决了由于各个系统产品需求,应用环境、开发工程师的水平存在差异,登录功能的标准难以统一的问题。
SSO的缺点也很明显,如果单点一旦被攻破,后果非常严重。
降低这种风险的办法就是在一些敏感系统里,增加额外的认证机制。
第十章 访问控制
1.基于URL的控制访问
在基于Java的Web应用中,增加一个filter实现。
2.基于方法的控制访问
3.基于数据的控制访问
10.2 垂直权限管理
访问控制实际上是建立用户和权限之间的对应关系,现在应用广泛的一种方法就是“基于角色的访问控制”,建成RBAC。Spring Security中的权限管理就是RBAC模型的一个实现。
Spring Security提供两种权限管理方式,一种是“基于URL的访问控制”,一种是“基于method的访问控制“。
对于“基于URL的访问控制”,Spring Security使用配置文件对访问URL的用户权限进行设定。
对于“基于method的访问控制“,Spring Security使用Java中的断言,分别在方法调用前和调用后实施访问控制。
10.3水平权限管理
在RBAC这种“基于角色的访问控制”模型下,系统只会验证用户A是否数据角色RoleX,而不会判断A是否能访问只属于B的数据DataB,因此发生了越权访问。这样的问题,我们称之为“水平权限管理问题”,又称“基于数据的访问控制”。
<至今仍是一个难题!>
10.4 OAuth
第十三章 应用层拒绝服务攻击
DDOS又称分布式拒绝服务,全称是Distributed Denial of Service。DDOS本是利用合理的请求造成资源过载,导致服务不可用。
预防应用层DDOS:
1.使用缓存。相比于读写数据库,查询缓存所消耗的资源可以忽略不计。
缺点:缓存未命中。
2.限制“客户端”每个请求的频率。
缺点:无法明确的确定客户端,(IP伪造,Cookie清空)
3.应用代码性能优化,网站架构优化(CDN,镜像站点分流)
4.验证码
缺点:用户体验,被破解。
5.让客户端解析一段JS,并给出正确的运行结果。因为大部分自动化脚本是直接构造HTTP完成的。
6.服务器支持:Apache,Nginx,限制单个IP访问次数
7.Yahoo专利:架构中有一台master服务器集中计算所有IP请求频率,并同步到每一台WebServer上。
资源耗尽攻击
1.Slowloris攻击,以极低的网速往服务器发送HTTP请求。畸形的HTTP请求,不发送终止符\r\n\r\n,只发送http头保持链接。
2.HTTP POST DOS,发送POST包时,指定一个非常大的Content-Length,然后以极低的速度发包。
3.Server Limit DOS,Web Sever对HTTP包头都是有限制的,比如Apache限制为8192个字节。攻击者通过xss攻击向客户端写入一个非常大的Cookie,将无法访问该Cookie所在域的任何页面。
ReDOS
如果正则表达式写的不好,就可能被恶意利用,消耗大量的资源。
正则表达式是基于NFA的,他是一个状态机,每个状态和输入符号都可能有许多个不同的下一个状态。
比如,
^(a+)+$
当输入4个a是,他可能有16条路经,当输入16个a的时候,则有65536中情况。
这极大的增加了正则引擎解析数据时的消耗!!!