Web安全基础总结
1.SQL注入(SQL Injection)
定义:
由于程序中对用户输入检查不严格,用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
原因分析:
其本质是对于输入检查不充分,导致SQL语句将用户提交的非法数据当作语句的一部分来执行。由于我们的部分WEB应用,采用Jsp+JavaBean或SSH框架,代码中会有直接写SQL(或HQL)语句,而有些SQL是用拼串实现的。
风险:
SQL盲注:如果系统屏蔽了详细的错误信息,那么对攻击者而言就是盲注入,可能会查看、修改或删除数据库条目和表
使用SQL注入的认证旁路:可能会绕开 Web 应用程序的认证机制。
备注:
关于sql注入漏洞
它不是数据库的漏洞。它不是web服务程序或脚本解释器的漏洞。
它是应用程序本身的bug,是网站程序开发造成的问题。
如何防止SQL注入:
1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。
2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。
6.采用一些工具或网络平台检测是否存在SQL注入。
2.跨站脚本漏洞(XSS)
定义:
它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常忽略其危害性。XSS本质是在于执行脚本[javascript/html等],攻击者的js能力越强攻击效果越惊人。
这类攻击一般不会对网站主机本身有任何威胁,攻击者使用某些语言以网站主机为跳板对网站使用者进行攻击。
分类:
持久型XSS(Persistent),与非持久型XSS相反,它是指通过提交恶意数据到服务器,通过Web应用程序输出恶意数据输出到页面,持久型XSS多出现在Web邮箱、BBS、社区等从数据库读出数据的正常页面(比如BBS的某篇帖子中可能就含有恶意代码)
非持久型XSS(Non-persistent),即反射型,它是指那些浏览器每次都要在参数中提交恶意数据才能触发的跨站脚本漏洞。
如何防止XSS跨站脚本攻击:
原则:不相信用户输入的数据
注意:攻击代码不一定在<script></script>中
1.将重要的cookie标记为httponly,这样的话Javascript中的document.cookie语句就不能获取到cookie了。
2.只允许用户输入我们期望的数据。例如:年龄的textbox中,只允许用户输入数字,而数字之外的字符都过滤掉。
3.对数据进行HtmlEncode处理。<转化为<、>转化为>、&转化为&、'转化为'、"转化为"、空格转化为 。
4.过滤或移除特殊的Html标签。例如:<script>、<iframe>、<for<、>for>、"for。
5.过滤JavaScript 事件的标签。例如"οnclick="、"onfocus" 等等。
3.跨站请求伪造(cross-site request forgery)通常缩写为XSRF
攻击流程:
XSRF攻击流程如上图所示,从上图可以看出,要完成一次XSRF攻击,比较关键的三个问题:
1) 会话状态[A]的保持,即用户已经获取了易受攻击网站A的信任授权。
2) 用户在依然保持没有登出易受攻击网站A的情况下,访问了“第三方网站”。
3) 提交的“操作”数据包是可以预知的。
CSRF与XSS的区别
XSS:恶意脚本通过服务器回显到用户浏览器中执行。
CSRF:可能是恶意脚本,也可能是恶意的HTML标签;可能经过服务器的回显,也可能完全不经过)使得浏览器发起了攻击性的请求。
如何防止CSRF跨站请求伪造:
1.对于web站点,将持久化的授权方法(例如cookie或者HTTP授权)切换为瞬时的授权方法(在每个form中提供隐藏field)。
2.“双提交”cookie。此方法只工作于Ajax请求,但它能够作为无需改变大量form的全局修正方法。如果某个授权的cookie在formpost之前正被JavaScript代码读取,那么限制跨域规则将被应用。什么叫限制跨域规则呢?限制跨域规则就是:如果服务器需要在Post请求体或者URL中包含授权cookie的请求,那么这个请求必须来自于受信任的域,因为其它域是不能从信任域读取cookie的。上面那个例子的受信任域就是银行网站的某个域,而Mallory发给Bob的链接不是受信任的域。
3.使用Post代替Get。Post方式不会在web服务器和代理服务器日志中留下数据尾巴,然而Get方式却会留下数据尾巴。
4.以上三点都是正对web站点的防御手段,第4点是从用户的角度的防御手段。通过在浏览其它站点前登出站点或者在浏览器会话结束后清理浏览器的cookie来防止CSRF攻击。
4.文件上传漏洞:常见的验证错误
允许上传可执行文件
使用客户端JS验证上传文件类型
使用黑名单限制上传文件类型
文件名/存储目录名可自定义
文件名中特殊字符处理不当
文件上传漏洞解决方法:
首先编码者需要对上传页面代码严格把关,特别是在保存文件的时候,考察可能出现的异常字符,如../,..\,空字符等。
其次,对文件扩展名检查要采取“允许jpg,gif…”这样的检查,而不要采取“不允许asp…”这样的检查;
5.文件包含漏洞
定义:
文件包含漏洞,如果允许客户端用户输入控制动态包含在服务器端的文件,会导致恶意代码的执行及敏感信息泄露,主要包括本地文件包含和远程文件包含两种形式
解决方案:
1.严格检查变量是否已经初始化。
2.建议假定所有输入都是可疑的,尝试对所有输入提交可能可能包含的文件地址, 包括服务器本地文件及远程文件,进行严格的检查,参数中不允许出现../之类的目录跳转符。
3.严格检查include类的文件包含函数中的参数是否外界可控。
4.不要仅仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进行。
5.在发布应用程序之前测试所有已知的威胁。
6.Cookie安全
用户的Cookie可能因为某些原因被攻击者窃取,攻击者可能利用 窃取的Cookie以用户的身份直接登录用户的网站。
7.目录遍历攻击
指攻击者利用应用程序漏洞访问合法应用之外的数据或文件目录,导致数据泄露或被篡改。
最常见的就是利用“双句点代表父目录”机制进行攻击:“../../../../../../etc/passwd”
Web服务器主要提供两个级别的安全机制
根目录访问:服务器文件系统中一个特定目录作为网站的根目录,它往往是一个限制,用户无法访问位于这个目录之上的任何内容
访问控制列表(ACL):Web服务器的管理员用来说明什么用户或用户组能够在服务器上访问、修改和执行某些文件的列表。
8.分布式拒绝服务攻击
利用网络协议存在的固有漏洞,伪造合理的服务请求,消耗有限的网络带宽或占用过多的服务资源,使网络或者服务无法响应用户的正常请求,造成网络服务瘫痪。
资源耗尽型有:UDP DNS Query Flood、Connection Flood、HTTP Get Flood等等
流量型有:syn_flood,ack_flood,rst_flood,udp_flood,icmp_flood 等
9.不安全的对象直接引用
当开发者向用户暴露一个对网站内部部署对象的引用时,如一个文件、目录、数据库键值等,若系统没有访问控制检查或者其他的保护措施,攻击者则能伪造引用实现对未授权数据的访问。
原理:
基本的攻击原理就是根据已有的对象引用,推测其他未授权对象的引用。当网站地址或者其他参数包含了文件、目录、数据库记录或者关键字等参照物时就可能发生这种攻击。