黑客攻击与反黑客防御

网站应用攻击最主要的两个手段:XSS攻击SQL注入攻击。此外,常用的 Web应用还包括 CSRF、Session 劫持等手段。

一、XSS 攻击


XSS 攻击即跨站点脚本攻击Cross Site Script),指黑客通过篡改网页,注入恶意 HTML 脚本,在用户浏览网页时,控制用户浏览器进行恶意操作的一种攻击方式。

常见 XSS 攻击有两种,第一种是反射型,用户点击的链接中被黑客嵌入了恶意脚本,达到攻击的目的。如下图所示:攻击者可以采用XSS 攻击,偷取用户Cookie、密码等重要数据,伪造用户身份与 Web应用程序交互,从而盗取用户财产、窃取情报

第二种攻击方式是:持久型 XSS 攻击,黑客提交含有恶意脚本的请求,保持在被攻击的 Web 站点的数据库中,用户浏览网页时,恶意脚本被包含在正常页面中,达到攻击的目的,如下图:这种攻击经常使用 在论坛,博客等Web应用中。

XSS 攻击相对而言是一种“古老”的攻击手段,但不断的变化出新的攻击花样,许多以前认为不可能用来攻击的漏洞也逐渐被攻击这利用,因此 XSS 防攻击也非常复杂。

二、XSS 防御手段


【1】消毒:XSS 攻击者一般都是通过在请求中嵌入恶意脚本达到攻击的目的,这些脚本一般用户输入中不会出现,可以对输入进行过滤和消毒处理,即对某些 html 危险字符转义,如">"转义为“&gt”,"<" 转义为"&It"等,就可发防止大部分攻击。为了避免对不必要的内容错误转义,如“3<5”中的“<”需要进行文本匹配后再转义,如“<img src=”这样的上下文中的“<”才转义。事实上消毒是所有网站最必备的 XSS 防攻击手段。
【2】HttpOnly:最早由微软提出,即浏览器禁止页面 JavaScript 访问带有 HttpOnly 属性的 Cookie。HttpOnly 并不是直接对抗 XSS 攻击的,而是防止 XSS 攻击者窃取 Cookie。对于存放敏感信息的 Cookie,如有用户认证信息等,可通过对该 Cookie 添加 HttpOnly 属性,避免被攻击脚本窃取。设置如下:

response.setHeader("Set-Cookie", "cookiename=value;Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");

如果需要访问Cookie 信息可以通过如下方式访问:

Cookie cookies[]=request.getCookies();  

三、注入攻击


注入攻击主要有两种,SQL 注入攻击和 OS 注入[指程序提供了直接执行 Shell 命令的函数的场景]攻击。SQL 注入攻击的原理如下图所示:攻击者在 HTTP 请求中注入恶意 SQL 命令(drop table users),服务器用请求参数构造数据库 SQL 命令时,恶意 SQL 被一起构造,并在数据库中执行。

SQL 注入攻击需要攻击者对数据库结构有所了解才能进行,攻击者获取数据库表结构信息的手段有如下几种:
【1】开源:如果网站采取开源软件搭建,那么网站数据库结构就是公开的,攻击者可以直接获取。
【2】错误回显:如果网站开启错误回显,即服务内部 500错误会显示到浏览器上,攻击者通过故意构造非法参数,使服务器端异常信息输出到浏览器端,为攻击者猜测数据库表结构提供了便利。
【3】盲注:网站关闭错误回显,攻击者根据网页变化情况判断 SQL 语句的执行情况,据此猜测数据库结构,此方法难度较大。

四、SQL 注入防御措施


首先避免被攻击者猜测到表名等数据库表结构信息:
【1】消毒:和防止 XSS 攻击一样,请求参数消毒是一种比较有效的手段。通过正则匹配,过滤请求数据中可能注入的 SQL。
【2】参数绑定:使用预编译手段,绑定参数是最好的防 SQL 注入方法,目前许多数据访问层框架,如 MyBatis,Hibernate等,都实现 SQL 预编译和参数绑定,攻击者的恶意 SQL 会被当做 SQL 的参数,而不是 SQL 命令被执行。
除了 SQL 注入,攻击者还根据具体应用,注入 OS 命令,编程语言代码等,利用程序漏洞,达到攻击目的。

五、CSRF 攻击


CSRF(Cross Site Request Forgery跨站点请求伪造),攻击者通过跨站请求,以合法用户的身份进行非法操作,如转账交易、发表评论等,如下图所示:CSRF 的主要手段是利用跨站点请求,在用户不知情的情况下,以用户的身份伪造请求,其核心是利用了浏览器Cookie 或服务器 Session 策略,盗取用户身份。

响应地,CSRF 的防御手段主要是识别请求者身份。主要有以下几种方法:
  ■  表单 Token:CSRF 是一个伪造用户请求的操作,所有需要构造用户请求的所有参数才可以。表单 Token 通过在请求参数中增加随机数的办法来阻止攻击者获得所有请求参数:在页面表单中增加一个随机数作为 Token,每次响应页面的 Token 都不同,从正常页面提交的请求会包含该 Token 值,而伪造的请求无法获得该值,服务器检查请求参数中 Token 的值是否存在并且正确以确定提交者是否合法。
  ■ 验证码:相对说来,验证码更加简单有效,即请求提交时,需要用户输入验证码,以避免在用户不知情的情况下被攻击者伪造请求。但是输入验证码是一个糟糕的用户体验,所以请在必要时使用,如支付交易等关键页面。
  ■ Referer checkHTTP 请求头的 Referer 域中记录着请求来源,可通过检查请求来源,验证其是否合法,很多网站使用这个功能实现图片防盗链(如果图片访问的页面来源不是自己网站的网页就拒绝)。空 Referer是指 Referer头部的内容为空,或者一个HTTP 请求头中根本不包含Referer,那么什么时候HTTP请求会不包含Referer字段呢?根据 Referer的定义,它的作用是指示一个请求是从哪里链接过来,那么当一个请求并不是由链接触发产生的,那么自然也就不需要指定这个请求的链接来源。比如,直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含Referer字段的,因为这是一个“凭空产生”的HTTP请求,并不是从一个地方链接过去的。

1、None:绝不允许referrer data通过
标签写法:<meta name="referrer" content="none">

2、None When Downgrade:发送referrer信息去安全的HTTPS站点,而非不稳定的HTTP站点。
标签写法:<meta name="referrer" content="none-when-downgrade">

3、Origin Only: 发送协议、主机和端口(即子域)没有一个完整的URL作为来源,
即https://moz.com/example.html只会发送https://moz.com
标签写法:<meta name="referrer" content="origin">

4、Origin When Cross-Origin: 当传origin-only来路信息发送给外部站点时,如果目标有相同的协议、主机和端口(即子域),无论它是HTTP或HTTPS,都将全部的URL作为Referrer发送出去。(注解:官方说明书上有一处排印错误,将来的版本应该是"origin-when-cross-origin")
标签写法:<meta name="referrer" content="origin-when-crossorigin">

5、Unsafe URL: 总是将URL字串作为一个referrer通过。
注意:如果你的URL中存在任何敏感信息,这不是最安全的选择。其中URL的片段、用户名、密码被自动剥去。
标签写法:<meta name="referrer" content="unsafe-url">

六、其他攻击和漏洞


【1】Error Code:也称作错误回显,许多 Web 服务器默认是打开异常信息输出的,即服务器端未处理的异常堆栈信息直接输出到客户端浏览器,这种方式虽然对程序调试和错误报告有好处,但同时也给黑客可乘之机。通过故意制造非法输入,使系统运行时出错,获得异常信息,从而寻找系统漏洞进行攻击。防御手段也简单,通过配置 Web服务器参数,跳转500页面到专门的页面即可,Web 应用常用的 MVC 框架也有着这个功能。

<!-- 仅仅在调试的时候注视掉,在正式部署的时候不能注释 -->  
<!-- 这样配置也是可以的,表示发生500错误的时候,转到500.jsp页面处理。 -->  
<error-page>   
	<error-code>500</error-code>   
	<location>/500.html</location>   
</error-page>   
  
<!-- 这样的配置表示如果jsp页面或者servlet发生java.lang.Exception类型(当然包含子类)的异常就会转到500.jsp页面处理。 -->  
<error-page>   
	<exception-type>java.lang.Exception</exception-type>   
	<location>/500.jsp</location>   
</error-page>   

【2】HTML 注释:为了调试方便,有时候开发人员会在 JSP 等服务器页面程序中使用 HTML 注释语法进行注释,这些 HTML 注释会显示在客户端浏览器,给黑客造成攻击便利。程序最终发布前需要进行代码 review 或自动扫描,避免 HTML 注释漏洞。
【3】文件上传:一般网站都有文件上传功能,设置头像、分享视频、上传附件等。如果上传的是可执行程序并通过该程序获得服务器端执行能力,那么攻击者几乎可以在服务器上为所欲为,并以此为跳板攻击集群环境的其他机器。最有效的预防手段是设置上传文件白名单,只允许上传可靠的文件类型。此外还可以修改文件名、使用专门的存储等手段,保护服务器受上传文件攻击。
【4】路径遍历:攻击者在请求的 URL 中使用相对路径,遍历系统未开放的目录和文件防御方法主要是将 JS、CSS 等资源文件部署在独立服务器、使用独立域名,其他文件不使用静态 URL 访问,动态参数不包含文件路径信息。

七、Web 应用防火墙


网站面临的安全问题复杂多样,各种攻击手段日新月异,新型漏洞不断被报告。如果有一款产品能够统一拦截请求,过滤恶意参数,自动消毒、添加Token,并且能够根据最新攻击和漏洞情报,不断升级对策,处理掉大多数令人头疼的网站攻击,就是一件很美妙的事了。比如 ModSecurity 产品,采用处理逻辑与攻击规则集合分离的架构模式处理逻辑(执行引擎)负责请求和响应的拦截过滤,规则加载执行等功能。而攻击规则集合则负责描述对具体攻击的规则定义、模式识别、防御策略等功能。处理逻辑比较稳定,规则集合需要不断针对漏洞进行升级,这是一种可扩展的架构设计。除了开源的 ModSecurity,还有一些商业产品也实现 Web 应用防火墙功能,如 NEC 的 SiteShell和 naxsi为 Nginx 提供的 WAF。目前已经支持 Nginx和 IIS,配合 Nginx的灵活和高效,可以打造成生产级的WAF,是保护和审核 Web安全的利器。

八、网站安全漏洞扫描


和计算机漏洞扫描一样,网站也需要安全漏洞扫描。网站安全漏洞扫描工具是根据内置规则,构造具有攻击性的 URL请求,模拟黑客攻击行为,用以发现网站安全漏洞工具。许多大型网站的安全团队都有自己开发的漏洞扫描工具,不定期地扫描,查漏补缺。市场上也有很多商用的网站安全漏洞扫描平台。

----如果喜欢,点个  红心♡  支持以下,谢谢----

发布了229 篇原创文章 · 获赞 317 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/zhengzhaoyang122/article/details/104505511