常见安全性问题
- 一.XSS 跨站脚本攻击
- XSS分类
- 二、CSRF 跨站请求伪造
- 例子
- 解决方案
- 三、SQL注入攻击
- 特点
- 注入过程
- 防范措施
- 四、OS命令注入攻击
- 防范措施
- 五、点击劫持
- 防范措施
- 六、HTTP请求劫持
- 防范措施
- 七、DDOS攻击
- 原理
- 防范措施
- 总结
一.XSS 跨站脚本攻击
XSS攻击(Cross Site Scripting)是Web应用程序中最常见的漏洞攻击之一,通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript
,但实际上也可以包括Java
、VBScript
、ActiveX
、Flash
或者甚至是普通的HTML
。攻击成功后,攻击者可能得到包括但不限于更高的权限(比如执行一些操作)、私密网页内容、会话和cookie
等各种内容。所以xss漏洞关键就是寻找参数未过滤的输出函数。
常见的输出函数有: echo printf print print_r sprintf die var-dump var_export
。
XSS分类
-
非持久型跨站
反射型跨站脚本漏洞,最普遍的类型。用户访问服务器——跨站链接——返回跨站代码,一般容易出现在搜索页面。
①不要信任用户的输入。对用户输入的数据进行过滤,例如禁止输入( )
英文圆括号、< >
尖括号等。但是此方法只是在web端进行了初步过滤,攻击者可能通过工具绕过前端的输入限制,因此还需后台服务器在接收到数据后,对特殊危险字符进行过滤或者转义,再存储到数据库。
②输出过滤。在PHP中,有htmlentities( )
函数和htmlspecialchars( )
函数对服务端输出到浏览器的数据进行编码或转义来防范XSS攻击。相应的JavaScript的编码可以使用JavaScriptEnode
。
③安全编码。尽量使用innerText
(IE)和textContent
(Firefox),也就是jQuery的text( )
来输出文本内容,尽量避免Web客户端文档重写、重定向或其它敏感操作。
④HttpOnly Cookie。在设置cookie时,加上HttpOnly
参数,就可以避免该网页被XSS攻击时,cookie信息被盗取(可兼容至IE6);缺点是,作用有限,只能保证cookie的安全。 -
持久型跨站
跨站代码存储在服务器(数据库),最直接的危害类型,容易造成蠕虫,大量窃取cookie。如在个人信息或发表文章等地方。
存储型XSS对用户输入进行过滤的方式和反射型XSS相同。
-
htmlspecialchars( )
和htmlentities( )
的区别:
htmlspecialchars
只转义&
、"
、'
、<
、>
这几个html代码;
而htmlentities
却会转化所有的html代码,连同里面的它无法识别的中文字符也会转化。
-
DOM跨站(DOM XSS)
基于文档对象模型的一种漏洞,指受害者端的网页脚本在修改本地页面DOM环境时未进行合理的处置,而使得攻击脚本被执行。因为DOM中有很多对象,其中一些是用户可以操纵的,如URL
、location
、referer
等。
过滤函数。vaildURL
、HtmlEncode
、HtmlAttributeEncode
等函数方法。
二、CSRF 跨站请求伪造
CSRF攻击(Cross-site request forgery)是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。与XSS相比, XSS利用的是用户对指定网站的信任,而 CSRF 利用的是网站对用户网页浏览器的信任。
例子
假如一家银行用以运行转账操作的URL地址如下:/withdraw?account=AccoutName&amount=1000&for=PayeeName
那么,一个恶意攻击者可以在另一个网站上放置如下代码: <img src="/withdraw?account=Alice&amount=1000&for=Badman">
如果有账户名为Alice的用户访问了恶意站点,而她之前刚访问过银行不久,登录信息尚未过期,那么她就会损失1000资金。
这种恶意的网址可以有很多种形式,藏身于网页中的许多地方。此外,攻击者也不需要控制放置恶意网址的网站。例如他可以将这种地址藏在论坛、博客等任何用户生成内容的网站中。这意味着如果服务端没有合适的防御措施的话,用户即使访问熟悉的可信网站也有受攻击的危险。
通过这个例子能够看出,攻击者并不能通过CSRF攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户浏览器,让其以用户的名义运行操作。
解决方案
-
添加验证码
在一些敏感操作的页面(如账户交易),增加验证流程(比如指纹、密码、短信验证码等),强制用户输入验证码,才能完成最终请求。这种方案在一般情况下可以很好地遏制CSRF攻击,但是验证流程会大大地降低用户体验,网站不可能给每一步操作都加上验证流程,所以这只能作为一种辅助手段,在一些关键操作点设置。 -
尽量使用POST,限制GET
但是POST并不是万无一失,攻击者可以通过如构造form表单的形式进行攻击,不过会增加暴露的可能性。 -
检查Referer字段
HTTP头中有一个Referer
字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Referer
字段应和请求的地址位于同一域名下。以上文银行操作为例,Referer
字段地址通常应该是转账按钮所在的网页地址,应该也位于之下。而如果是CSRF攻击传来的请求,
Referer
字段会是包含恶意网址的地址,不会位于之下,这时候服务器就能识别出恶意的访问。
这种方法简单易操作,工作量低,但是有一定的局限性,因为其完全依赖浏览器发送正确的Referer
字段,虽然HTTP协议对此字段的内容有明确的规定,但无法保证浏览器没有安全漏洞影响到此字段。 -
token请求验证
发送请求时在HTTP请求中以参数的形式加入一个随机产生的token
,并在服务器建立一个拦截器来验证这个token
。服务器读取浏览器当前域cookie
中这个token值,会校验该请求当中的token
和cookie
中的token
值是否都存在且相等,才认为这是合法的请求;否则认为这次请求是违法的,拒绝该次服务。这种方法要比Referer检查安全很多。
三、SQL注入攻击
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
特点
特点 | 概述 |
---|---|
广泛性 | 任何一个基于SQL语言的数据库都可能被攻击,很多开发人员在编写Web应用程序时未对从 |
隐蔽性 | SQL注入语句一般都嵌入在普通的HTTP请求中,很难与正常语句区分开,所以当前许多防火墙都无法识别予以警告,而且SQL注入变种极多,攻击者可以调整攻击的参数,所以使用传统的方法防御SQL注入效果非常不理想。 |
危害大 | 攻击者通过SQL注入获取到服务器的库名、表名、字段名,从而获取到整个服务器中的数据,对网站用户的数据安全有极大的威胁。攻击者也可以通过获取到的数据,得到后台管理员的密码,然后对网页页面进行恶意篡改。这样不仅对数据库信息安全造成严重威胁,对整个数据库系统安全也影响重大。 |
操作方便 | 互联网上有很多SQL注入工具,简单易学,攻击过程简单,不需要专业知识也能自如运用。 |
注入过程
-
SQL注入点探测
探测SQL注入点是关键的一步,通过适当的分析应用程序,可以判断什么地方存在SQL注入点。通常只要带有输入提交的动态网页,并且动态网页访问数据库,就可能存在SQL注入漏洞。如果程序员信息安全意识不强,采用动态构造SQL语句访问数据库,并且对用户的输入未进行有效性验证,则存在SQL注入漏洞的可能性很大。一般通过页面的报错信息来确定是否存在SQL注入漏洞。
-
收集后台数据库信息
不同数据库的注入方法、函数都不尽相同,因此在注入之前,我们先要判断一下数据库的类型。判断数据库类型的方法很多,可以输入特殊字符,如单引号,让程序返回错误信息,我们根据错误信息提示进行判断;还可以使用特定函数来判断,比如输入“1 and version( )>0
”,程序返回正常,说明version( )
函数被数据库识别并执行,而version( )
函数是MySQL特有的函数,因此可以推断后台数据库为MySQL。
-
猜解用户名和密码
数据库中的表和字段命名一般都是有规律的。通过构造特殊SQL语句在数据库中依次猜解出表名、字段名、字段数、用户名和密码。
-
查找Web后台管理入口
WEB后台管理通常不对普通用户开放,要找到后台管理的登录网址,可以利用Web目录扫描工具(如:wwwscan
、AWVS
)快速搜索到可能的登录地址,然后逐一尝试,便可以找到后台管理平台的登录网址。
-
入侵和破坏
一般后台管理具有较高权限和较多的功能,使用前面已破译的用户名、密码成功登录后台管理平台后,就可以任意进行破坏,比如上传木马、篡改网页、修改和窃取信息等,还可以进一步提权,入侵Web服务器和数据库服务器。
防范措施
-
分级管理
对用户进行分级管理,严格控制用户的权限,对于普通用户,禁止给予数据库建立、删除、修改等相关权限,只有系统管理员才具有增、删、改、查的权限。
-
参数传值
程序员在书写SQL语言时,禁止将变量直接写入到SQL语句,必须通过设置相应的参数来传递相关的变量,从而抑制SQL注入。数据输入不能直接嵌入到查询语句中,同时要过滤输入的内容,过滤掉不安全的输入数据(如' '
单引号、" "
双引号、:
冒号等字符),或者采用参数传值的方式传递输入变量。这样可以最大程度防范SQL注入攻击。
-
漏洞扫描
系统管理员可以通过采购一些专门系统的SQL漏洞扫描工具,通过专业的扫描工具,可以及时的扫描到系统存在的相应漏洞。漏洞扫描工具只能扫描到SQL注入漏洞,不能防范SQL注入攻击。
-
多层验证
增加黑名单或者白名单验证。黑名单指:若用户在输入中,包含明显的恶意内容则拒绝该用户的请求;而白名单指:检查用户输入是否符合预期的类型、长度、数值范围或其它格式标准。在使用白名单验证时,一般会配合黑名单验证。 -
数据库信息加密
传统的加解密的方法大致可以分为三种:
类型 | 解析 |
---|---|
对称加密 | 即加密方和解密方都使用相同的加密算法和密钥,这种方案的密钥的保存非常关键,因为算法是公开的,而密钥是保密的,一旦密匙泄露,黑客仍然可以轻易解密。常见的对称加密算法有: |
非对称加密 | 即使用不同的密钥来进行加解密,密钥被分为公钥和私钥,用私钥加密的数据必须使用公钥来解密,同样用公钥加密的数据必须用对应的私钥来解密,常见的非对称加密算法有: |
不可逆加密 | 利用哈希算法使数据加密之后无法解密回原数据,这样的哈希算法常用的有: |
*[数据库信息加密]:《SQL注入攻击及其防范技术研究》,万方数据知识服务平台 |
四、OS命令注入攻击
OS命令注入(OS Command Injection)类似于上述的SQL注入,区别于应用场景不同。OS 注入攻击是指程序提供了直接执行Shell
命令的函数的场景,比如在构造OS命令时使用了外部输入的数据,如果没有对外部输入中可能影响OS命令的特殊元素进行过滤,或是过滤不充分,就有受到OS命令注入攻击的风险。
OS命令注入漏洞的形成需要同时满足以下三个条件:
- 使用了内部调用Shell的函数(
system
、open
等) - 将倍加传入的参数传递给内部调用的shell的函数
- 参数中shell的元字符(如
*
、?
、[]
、\
等)没有被转义
防范措施
-
白名单校验
对用户输入的参数进行过滤校验。当然黑名单也不是不可以,只是需要考虑的情况比较多,相比之下还是白名单简单高效。当然,如果可以的话,最好不要允许用户输入参数。 -
使用 execFile / spawn
在 中除了exec()
之外,还有execFile()
和spawn()
两个方法也可以用来执行系统命令。它们和exec()
的区别是后者是直接将一个命令字符串传给/bin/sh
执行,而前者是提供了一个数组作为参数容器,最后参数会被直接传到 C 的命令执行方法execve()
中,不容易执行额外的参数。
不过这个方法也不是绝对安全,因为这个只是利用了执行的命令只接收普通参数来做的过滤,但某些命令(如/bin/find
)提供了-exec
参数,后续的参数传入后会被其当成命令执行。
五、点击劫持
点击劫持(click jacking),也被称为UI-覆盖攻击,顾名思义,和点击事件有关,利用用户的点击操作,来完成非用户本意的操作。
这种攻击利用了HTML中<iframe>
标签的透明属性。虽然你点击的是你正在访问的页面,但其实上面覆盖了一层恶意攻击者精心构建的一个透明页面。
防范措施
-
JavaScript中禁止内嵌
普通页面的top
对象为window,而iframe
的top对象不等于window对象,所以可以在JS代码中插入:
if(top.location != window.location){
top.location == window.location;
}
这样如果存在嵌套的iframe
,页面就会跳转,避免遭到点击劫持。但是如果攻击者设置iframe
的属性sandbox="allow-forms"
时,这种方法就会失效。
-
X-FRAME-OPTIONS 防止内嵌
服务器端可设置HTTP头 "X-Frame-Options:DENY
"来让浏览器主动禁止iframe
内嵌。不过这种方式在HTTP中不可靠,恶意攻击者可以窃听篡改HTTP请求来修改HTTP头。 -
NoScript 扩展
对于 Firefox 的用户,使用 NoScript 扩展能够在一定程度上检测和阻止点击劫持攻击。利用 NoScript 中ClearClick
组件能够检测和警告潜在的点击劫持攻击,自动检测页面中可能不安全的页面。 -
其他辅助手段
例如上述XSS和CSRF攻击的防御方法。
六、HTTP请求劫持
HTTP劫持是在使用者与其目的网络服务所建立的专用数据通道中,监视特定数据信息,提示当满足设定的条件时,就会在正常的数据流中插入精心设计的网络数据报文,目的是让用户端程序解释“错误”的数据,并以弹出新窗口的形式在使用者界面展示宣传性广告或者直接显示某网站的内容。
防范措施
-
全网站https
很大一部分HTTP劫持,主要的原因就是在传输数据时都是明文的,使用了HTTPS后,会在HTTP协议之上加上TLS进行保护,使得传输的数据进行加密,但是使用HTTPS,一定要注意规范,必须要全站使用HTTPS,否则只要有一个地方没有使用HTTPS,明文传输就很有可能会被HTTP劫持了。例如,使用来访问百度。
但是此方法可能会降低性能(因为多了TLS握手所带来的2次RTT延时),此外,
由于运营商可能会使用DNS劫持,在DNS劫持之下,HTTPS的服务完全用不了了,所以会导致白屏。 -
加密代理
在用户和目标web服务器之间增加一个代理服务器,用户和代理之间会经过运营商的节点,这里使用各种加密手段保证安全,在代理服务器与web服务之间使用HTTP请求,只需确认代理与web服务之间不会被HTTP劫持就可以避开HTTP劫持
七、DDOS攻击
DDOS(Distributed Denial of Service)即分布式拒绝服务攻击,是指处于不同位置的多个攻击者同时向一个或数个目标发动攻击,或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。
原理
防范措施
-
安装入侵检测工具
安装入侵检测工具(如NIPC
、NGREP
),经常扫描检查系统,解决系统的漏洞,对系统文件和应用程序进行加密,并定期检查这些文件的变化。 -
大数据智能分析
对海量数据进行分析,进而对合法用户进行模型化,并利用这些指纹特征,如:Http模型特征、数据来源、请求源等,有效地对请求源进行白名单过滤,从而实现对DDoS流量的精确清洗。 -
防火墙
在系统中加装防火墙系统,利用防火墙系统对所有出入的数据包进行过滤,检查边界安全规则,确保输出的包受到正确限制。
总结
本文只是简单地介绍了一些常见的前端安全性问题,在实际生活中,靠前端防范是远远不够的,还需要在后台系统进行进一步的过滤。当然,除了本文列出的防范措施外,还有其他的方法,感兴趣可以自己研究研究~