目录
1.SQL注入攻击
2.失效的身份认证
3.跨站脚本攻击
4.失效的访问控制
5.安全配置错误
6.敏感信息泄露
7.攻击检测与防范不足
8.跨站请求伪造
9.使用含有漏洞的组件
10.受保护的APIs
11.文件上传漏洞
SQL注入攻击
SQL注入就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
SQL注入攻击可以非法读取、篡改、添加、删除数据库中的数据,盗取用户各类敏感信息,获取利益,可以修改数据库来改变网页的内容,可以私自添加或删除账号。通常攻击者有以下攻击技巧。
错误回显
基于布尔的盲注
基于时间盲注
联合查询注入
SQL注入攻击-攻击技巧之错误回显
如果攻击者在请求参数中输入的参数导致后台执行查询语句的语法错误,从服务器中直接返回了错误信息。则表明该请求有sql注入漏洞,并且可以在错误回显中获取服务器的数据库类型。
从上图错误信息可以看出,该表名不是job,而且它还告诉我们后台数据库是SQL Server,不是MySQL或Oracle,这也设计一个漏洞把错误信息直接返回给了用户。
SQL注入攻击-攻击技巧之布尔盲注
所谓"基于布尔的盲注",就是在服务器没有显示回显时完成的注入攻击。常见的盲注验证方法是,构造简单的条件语句,根据返回页面是否发生变化,来判断SQL语句是否得到执行。
例如某url为:http://localhost:4444/web_test/LoginServlet?account=222
攻击者可以通过修改account参数为' and 1=1-- ,如果该页面返回正常;
之后再次修改account参数为' and 1=2-- ,如果页面未正常显示,则可以判断该url存在SQL漏洞。
SQL注入攻击-攻击技巧之时间盲注
所谓的"基于时间的盲注"是指用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
对于返回页面没有显示任何信息的情况下,利用HENCHMARK()函数或SLEEP()函数,使得结果返回的时间比平时要长,通过时间长短的变化,可以判断出注入语句是否执行成功。
这种攻击过程非常繁琐,所以一般使用一个自动化的工具来帮助完成整个过程。目前比较流行的SQL渗透工具是sqlmap。
SQL注入攻击-攻击技巧之联合查询注入
当SQL查询的数据可以在页面上显示时,也可以通过union联合查询的方式来获取数据信息。
数据库表名--DATABASE()
用户名--USER()
数据库信息--VERSION()
该用户可访问的所有数据库--select table_schema from information_schema.columns
指定数据库的所有表名 --select table_name from information_schema.TABLES WHERE
table_schema='XXX'
SQL注入攻击-防御
针对SQL注入攻击的防御一般有几种。
使用预编译语言
使用存储过程
检查数据类型
可以参考OWASP提供的ESAPI文档来对用户输入内容进行过滤。
如当用户输入为:aaaa' or 1=1#
则过滤后的用户输入即为:aaaa\' and 1\=2 \#
最小权限原则
失效的身份认证和会化管理
认证的目的是为了认出用户是谁。认证的手段是多样化的,目前认证方式有密码、数字证书、手机绑定、指纹、人脸、声音等认证。认证实际上就是一个验证凭证的过程。如果只有一个凭证被用户认证,则称为"单因素认证";如果有两个或多个凭证被用户认证,则成为"双因素认证"或"多因素认证"。一般来说,多因素认证的强度要高于单因素认证,但是在用户体验上,多因素认证或多或少都会带来一些不方便的地方。通常认证有两种手段。
密码认证
session认证
失效的身份认证和会化管理-密码认证
密码是最常见的一种认证手段,但目前并没有一个标准的密码策略,根据OWASP推荐的一些最佳实践,以下是对密码策略的总结。
密码长度方面
普通应用要求长度为6位以上
密码复杂度方面
不要有连续性的字符,比如1234abcd,这种字符容易被猜测到
密码为大写字母、小写字母、数字和特殊字符中两种以上的组合
密码认证方面
1)限制用户失败登录次数
2)根据常用登录信息(登录IP地址)合理使用图形验证码
失效的身份认证和会化管理-Session认证
密码与证书等认证手段,一般仅仅是用于登录的过程。当登录完成后,用户访问网站的页面,不可能每次浏览器请求页面时都使用密码认证一次。因此,当认证成功后,就需要替换一个对用户透明的凭证。这个凭证,就是SessionID。用户在登录完成后,服务器端会创建一个新的会话Session。
SessionID在cookie中传输存储
一般常见的做法是把SessionID保存在Cookie中。而Cookie泄露的途径有很多种,如XSS攻击、网络监听以及本地木马窃取。对于通过XSS泄露窃取Cookie的攻击,通过给Cookie标记httponly,可以有效的缓解XSS窃取Cookie的问题。
SessionID作为请求参数传输
SessionID作为请求参数通常会通过referer而泄露出去。QQ的WAP邮箱曾经出现过此漏洞。
失效的身份认证和会化管理-Session Fixation攻击
用户在登录网站的过程中,如果登陆前后用户的SessionID没有发生变化,则会存在Session Fixation攻击。SessionID在cookie中传输存储
攻击原理
用户X(攻击者)先获取一个未经认证的SessionID,然后将这个SessionID交给用户Y去认证,Y完成认证后,服务器并未更新此SessioniID的值,所以之后X可以凭借此SessionID登录进Y的账户。这种攻击一般是在SessionID作为URL的一个参数的情况。
防御
解决Session Fixation的正确做法是,在登录完成后,重写SessionID。
失效的身份认证和会化管理-Session保持攻击
攻击原理
一般应用都会给Session设置一个失效时间,当到达失效时间后,Session将被销毁。但有些系统,处于用户体验的考虑,只要这个用户还"活着",就不会让这个用户的Session失效。此时,如果攻击者已经获取一个有效的SessionID,则可以通过不停地发起访问请求,让Session一直"活"下去。
防御
在一定的时间强制销毁Session。这个时间可以从用户登录的时间算起,设定一个阈值,比如3天后强制Session过期。
当用户客户端发生变化时,要求用户重新登录。如用户的IP、UserAgent(特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件)等信息发生了变化,就可以强制销毁当前的Session,并要求用户重新登录。
跨站脚本
跨站脚本攻击(XSS),攻击者能够对用户当前浏览的页面植入恶意脚本,通过恶意脚本,控制用户的浏览器。这些用以完成各种具体功能的恶意脚本,被称为"XSS Payload"。
有用户数据输入或者交互的地方就有可能有XSS漏洞。
攻击类型
反射型XSS
存储型XSS
DOM Based XSS
跨站脚本-反射型XSS
反射型XSS只是简单地把用户输入的数据"反射"给浏览器,该恶意脚本并未存储到服务器。如果黑客想要攻击用户,首先需要诱使用户点击一个恶意的链接才能攻击成功。以下是XSS的攻击流程。
用户登录一个有XSS漏洞的A网站
黑客向用户发送一个恶意链接并且用户点击了该链接,或者用户在别的地方点击了一个恶意链接,该链接为请求A网站的链接,但是参数中包含恶意脚本。
用户点击该链接后,恶意脚本则会在A网站执行,至此攻击成功。
例如,A网站有个页面,是显示用户输入的数据,链接为:
http://localhost:4444/web_test/XSS/html_content/b.jsp?name=ABC。页面显示效果为:
如果用户把输入的name参数改为一个js脚本,则A网站则会执行该脚本:
http://localhost:4444/web_test/XSS/html_content/b.jsp?name=<script>alert(1)</script>
跨站脚本-存储型XSS
存储型XSS会把用户输入的数据存储在服务器端。当这些存储的数据再次展示在页面时,发起攻击。如黑客写下一篇包含有恶意脚本的文章发布,之后,访问该文章的用户,他们的浏览器都会执行这段恶意脚本。
跨站脚本-DOM Based XSS
DOM Based XSS为通过修改页面的DOM节点形成的XSS。
<script>
function domBasedXSS(){
var text = document.getElementById("content").value;
document.getElementById("aaa")[xss_clean] = "<a href='http://www.baidu.com?test="+text+"'>test</a>";
}
</script>
<div id="aaa"></div>
<input id="content" type="text" />
<input type="button" value="提交" onclick="domBasedXSS()"/>
跨站脚本-攻击原理
XSS的攻击主要分为以下几类攻击原理。
HTML标签中插入脚本
HTML属性中插入脚本
<script>标签中插入脚本
在事件中插入脚本
在地址中插入脚本
跨站脚本-危害
XSS的危害主要有以下几种。
Cookie泄露
构造GET与POST请求
XSS钓鱼
XSS蠕虫
获取用户浏览器信息等
跨站脚本-防御
关于XSS的防御主要有以下几种方法。
httponly
用户输入检查
用户输出检查
XSS攻击防御方法:对输入(和URL参数)进行过滤,对输出进行编码;白名单和黑名单结合;在正确的地方使用正确的编码方式。
失效的访问控制
所谓的访问控制,或者说是权限控制,就是指某个主体对某个客体需要实施某种操作,而系统对这种操作的限制就是权限控制。
访问控制漏洞是指访问了没有授权的资源或信息,也叫越权。越权可以分为两种。
垂直越权
水平越权
失效的访问控制-垂直越权
访问控制实际上是建立用户与权限之间的对应关系,现在应用广泛的一种方,就是"基于角色的访问控制",简称RBAC。
在系统验证权限时,只需要验证用户所属的角色,就可以根据该角色所拥有的权限进行授权。所以当用户在请求一些资源时,如果系统未对用户所属的角色进行权限验证,则用户就可以访问高权限的资源。这就是垂直越权。对于垂直越权的攻击漏洞,一般的防御措施是,在服务器端需要有所有角色的访问控制列表ACL,即不同角色对于所有访问资源的权限控制表。
Spring的Spring Security中的权限管理,就是RBAC模型的一个实现。
Spring Security提供两种权限管理方式,一种是"基于URL的访问控制",一种是"基于method的访问控制"。这两种访问控制都是RBAC模型的实现,换言之,在Spring Security中都是验证该用户所属的角色,以决定是否授权。
失效的访问控制-水平越权
在RBAC模型下,系统只会验证用户A是否属于角色X,而不会判断用户A是否能访问只属于用户B的数据资源,因此发生了越权访问,这种越权就叫做水平越权。如下图所示。
失效的访问控制-水平越权
水平权限漏洞对应的防御措施如下。
在逻辑层做鉴权,检查请求的操作者(从session中获取)和操作的对象(请求参数中获取)是否具有关联关系(查询数据库),如果无关联关系,则停止操作。这种防御的缺点使增加了一次数据库查询操作。
把权限的控制转移到数据接口层中,即在进行sql查询更新操作时,在sql语句后加入userId的条件,而userId的值是从session中获取。
在请求的参数中增加一个token值,如MD5(url+key),用做完整性校验,当攻击者修改参数时,拦截器将会拦截请求,从而完成防御。
安全配置错误
安全配置错误可以发生在一个应用程序堆栈的任何层面,包括平台、Web服务器、应用服务器、数据库、框架和自定义代码。开发人员和系统管理员需共同努力,以确保整个堆栈的正确配置。自动扫描器可用于检测未安装的补丁、错误的配置、默认帐户的使用、不必要的服务等。
服务器系统维护的安全配置
应用程序的安全配置
安全配置错误-服务器系统维护的安全配置
对于服务器系统维护方面的安全配置,主要有以下几个方面。
安装补丁程序
账号和密码保护
监测系统日志
使用HTTPS请求
隐藏IP地址
关闭不需要的服务和端口
部署检测系统和防御系统
定期对服务器进行备份
安全配置错误-应用程序的安全配置
关于应用程序的安全配置,主要是应用程序在部署到生产环境后的一些配置,主要有以下几个方面。
修改或删除后台默认账号
禁用服务器上的目录列表
隐藏错误堆栈信息
敏感信息泄露
在这个领域最常见的漏洞是应该加密的数据不进行加密。在使用加密的情况下,常见的问题是不安全的密钥生成和管理和使用弱算法是很普遍的,特别是使用弱的哈希算法来保护密码。以下是对敏感信息的分类。
个人信息,如姓名,身份证ID,电话号码,银行账户,驾驶证号码,社保卡号,护照号码等都是敏感数据。
网站登录的用户名、密码,SSL证书,会话ID,加密使用的密钥等都属于敏感信息,这些信息一旦泄露,攻击者就可以以合法用户的身份访问Web系统,随意进行各种攻击操作。
Web服务器的OS类型,版本信息,Web容器的名称,版本号,数据库类型,版本号,应用软件使用开源软件信息都属于敏感信息,因为攻击者知道这些软件信息,就会利用这些软件存在的公开漏洞进行专门攻击,提升了系统被攻破的可能性。
敏感信息泄露-保护敏感信息
对于数据信息需要保证数据安全的三要素:完整性、机密性和可用性。
针对个人数据,必须加密存储,且要使用安全的加密算法。
针对敏感数据传输,需要采用SSL加密通道,对每一个请求都应该使用SSL加密通道。
应用程序运行出错容易造成敏感信息的泄露,定制统一出错页面,杜绝显示此类敏感信息到Web客户端。
保存敏感信息的文件要严格控制访问权限。
攻击检测与防范不足
对攻击的防范措施所能覆盖的攻击类型,不应该只是XSS和SQL注入。 你可以通过如 WAFs, RASP, 和OWASP AppSensor 等技术来检测并阻止攻击。攻击保护有以下三个目标。
检测攻击
有没有发生合法用户不可能产生的情况? 应用程序是否以普通用户永远不会做的方式运行(例如,请求频率太高,非典型输入,异常使用模式,重复请求)?
对攻击的响应
日志和通知对及时响应至关重要。考虑是否自动阻止请求,并确定阻止的IP地址或IP段。 考虑禁用或监控不良行为的用户账户。
快速修复
如果开发或运维团队无法在一天内推出关键修补程序,需要部署一个可以分析HTTP流量,数据流或代码执行的虚拟补丁,并防止漏洞被利用。
攻击检测与防范不足-DDOS攻击方式
DDoS即分布式拒绝服务攻击, 是 指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DOS攻击,从而成倍地提高拒绝服务攻击的威力。
SYN Flood
SYN Flood (SYN洪水) 是种典型的DoS (Denial of Service,拒绝服务) 攻击。效果就是服务器TCP连接资源耗尽,停止响应正常的TCP连接请求。修改内核参数即可有效缓解,分别为启用SYN Cookie、设置SYN最大队列长度以及设置SYN+ACK最大重试次数。
UDP Flood
攻击者利用简单的TCP/IP服务,如Chargen和Echo来传送毫无用处的占满带宽的数据。通过伪造与某一主机的Chargen服务之间的一次的UDP连接,回复地址指向开着Echo服务的一台主机,这样就生成在两台主机之间存在很多的无用数据流,这些无用数据流就会导致带宽的服务攻击
防范配置方法:关闭Chargen服务。
land 攻击
land 攻击是一种使用相同的源和目的主机和端口发送数据包到某台机器的攻击。结果通常使存在漏洞的机器崩溃。
Smurf攻击
Smurf攻击是以最初发动这种攻击的程序名“Smurf”来命名的。这种攻击方法结合使用了IP欺骗和ICMP回复方法使大量网络传输充斥目标系统,引起目标系统拒绝为正常系统进行服务,对网络进行监控和统计发现, 若出现Smurf 攻击, 则会出现大量的echo 报文。由于存在echo 应答风暴, 此时,echo 报文在所有报文中所占的比例大大增加。所以,如出现这种情况, 就可能遭到了Smurf 攻击,挫败一个Smurf攻击的最简单的方法就是对边界路由器的回音应答(echo reply)信息包进行过滤,然后丢弃他们,使网络避免被湮没。
利用服务漏洞
攻击检测与防范不足-DDOS检测方式
关于DDOS的检测方式主要有以下几种。
基于流量的检测
基于流量大小进行检测的方法就是在被保护的网络边界路由器上部署流量检测算法,根据流量的突发检测DoS工具的发生
基于源IP地址的检测
就是在被保护网络的边界路由器上部署源IP检测算法,根据源IP个数的突然增加来判断Dos的发生
基于包属性的检测
绝服务攻击发生时,攻击数据包破坏了正常网络状况下进出数据包在IP数据包头字段的统计学稳定性,因此采用一定算法在正常情况下进行包属性字段学习判断进出数据包的危险度
攻击检测与防范不足-DDOS防范
关于DDOS的防御措施主要有以下几种。
源端防御
增加路由器安全性能配置,建议在该网段的路由器上做配置调整,做到数据包过滤、反欺骗、异常识别、协议分析、流量限制多验证体系
配置防火墙过滤规则
设计访问规则,阻止和杜绝一些恶意信息对主机的攻击
加强终端防御,对受害者主机、受害者网络进行防御
提高主机系统和网络系统安全性,加强入口防御
加强中端防御,攻击性的数据包在传输过程中采取的防御措施
跨站请求伪造
跨站请求伪造(CSRF)攻击可以以你的名义发送恶意请求。CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。
CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账,造成的问题包括:个人隐私泄露以及财产安全。
跨站请求伪造-攻击原理
攻击原理如下图所示:
跨站请求伪造-攻击原理
具体的攻击流程如下。
1)用户打开浏览器,访问受信任网站A,输入用户名和密码登陆请求登陆网站A。
2)网站A验证用户信息,用户信息通过验证后,网站A产生Cookie信息并返回给浏览器。
3)用户未退出网站A之前,在同一浏览器中,打开一个TAB访问网站B。
4)网站B接受到用户请求后,返回一些攻击性代码。
5)浏览器在接受到这些攻击性代码后,促使用户不知情的情况下浏览器携带Cookie(包括sessionId)信息,请求网站A。这种请求有可能进行删除、更新等操作。
跨站请求伪造-防御
一般来说,CSRF的防御主要有以下三点:
验证HTTP Referer
验证码
token校验
使用含有已知漏洞的组件
一些含有漏洞的组件(如:框架库)可以被自动化工具发现和利用。
漏洞组件检测
如果您使用的组件之一存在漏洞,您应该仔细评估该漏洞是否给您的业务也带来了缺陷。此评估可以通过检查您的代码使用该组件的部分,以及该缺陷可能导致的您关心的结果来完成。
漏洞组件防御
连续监控如NVD等披露的的组件中的漏洞是否出现在您的应用中;
分析库文件以确保在进行更改之前在运行时实际调用了它;
决定是升级组件还是部署一个分析HTTP流量,数据流或代码执行的虚拟补丁,并防止漏洞被利用
受保护的APIs
考虑可向你的API发送请求的任何人。客户端程序容易被逆向,网络通讯也容易被拦截。所以依靠客户端的混淆是无法保护API的。
WEB API漏洞应该类似于测试其他应用程序的漏洞。所有不同类型的注入、认证、访问控制、加密、配置和其他问题都可以在传统应用程序中出现的也存在于API中。
API安全防御
确保保护客户端和API之间的通信。
确保API具有强大的身份验证方案,并且所有凭据,密钥和令牌已被保护。
实现访问控制方案,保护API不被不正确地调用,包括未经授权的功能和数据引用。
防止所有形式的注入。
使用OAuth2对web API进行安全验证
用户向客户端提供账户及密码
客户端向授权服务器发送认证信息
授权服务器验证凭证后返回令牌
客户端发送包含在http header中的token请求到资源服务器
文件上传漏洞
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获取了执行服务器端命令的能力。
文件上传漏洞有以下危害。
上传文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行。
上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行。
上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用户钓鱼和欺诈。
文件上传漏洞-解析漏洞
攻击者在利用上传漏洞时,通常会与Web容器的解析漏洞配合在一起。所以我们了解一下解析漏洞。
IIS解析漏洞
当建立*.asa、*.asp格式的文件夹时,其目录下的任意文件都将被IIS当做asp文件来解析。
当文件名为*.asp;1.jpg时,IIS同样会以ASP脚本来执行。
Apache解析漏洞
在Apache 1.x和2.x中存在解析漏洞:当碰到不认识的扩展名是,将会从后向前解析,直到碰到认识的扩展名为止,如果都不认识,则会暴露其源代码。比如:a.php.aa.xa.bb,Apache首先会解析bb扩展名,如果不认识,将会解析xa扩展名,直到遍历到认识的扩展名为止,然后再将其进行解析。
文件上传漏洞-防御
对于文件上传漏洞的防御,有以下措施。
文件上传的目录设置为不可执行
在实际应用中,很多大型网站的上传应用,文件上传后会放到独立的存储上,做静态文件处理。
判断文件类型或对文件进行处理
在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
使用随机数改写文件名和文件路径
文件上传如果要执行代码,则需要用户能够访问到这个文件。如果应用使用随机数改写了文件名和路径,将极大地增加攻击的成本。与此同时,像a.jsp;b.jpg或者a.php.aa.bb这种文件,都将会因为文件名被改写而无法进行攻击。