知己知彼,百战不殆。企业信息化的过程中,Web业务的迅速发展吸引了黑客们的热切关注,那么常见web漏洞有哪些呢?
1. cookie重要性
cookie是浏览器用来判断用户登录状态的。一旦cookie被窃取,相当于别人不用你的用户名和密码,就已经登录了你的个人网站。
2. 同源策略
没有同源策略的危害
早期的浏览器,没有同源策略。不同域名的javascript可以相互访问cookie。
假设这么一种情形,你登录了某银行网站,没有关闭,就访问了另一个病毒网站,这个网站的javascript读取了你银行网站的cookie,就相当于登陆了你的网上银行。
所以现在浏览器普遍都设置了同源策略,即:不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。
跨域资源共享
同时,在实际开发时,我们经常会碰到需要用javascript异步请求不同域名服务器的接口。这时候服务器可以设置一个白名单,允许指定域名的脚本,访问本服务器。这种方法叫做"跨域资源共享"(Cross-origin resource sharing)。
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。比如在b.com里面添加响应头声明允许a.com的访问,代码:
Access-Control-Allow-Origin: http://a.com
1
然后a.com就可以用ajax获取b.com里的数据了。
3. XSS攻击
攻击方法:
受同源策略影响,不同域名的的客户端脚本无法相互访问cookie。那么我们可不可以把恶意脚本,注入到原网站中,从而获取cookie呢?这就是xss(cross site scripting)攻击的思路。
这种攻击一般出现在允许用户自定义输入的输入框中,比如评论,博客等等。
防御方法:
用cookie的HttpOnly属性,加上了这个属性的cookie字段
用户输入框,加转义
4. CSRF攻击
攻击方法:
CSRF,全称跨站请求伪造(Cross Site Request Forgery)。
CSRF,不直接盗取cookie,而是诱骗用户在不关闭浏览器或退出登录的情况下,请求恶意网站的url,则相当于发出了身份认证后的请求,可能会执行一些用户不想做的敏感操作。
目标网站:www.webA.com
恶意网站:www.webB.com
转账功能链接:
http://www.webA.com/transport?account=abc&total=500
恶意网站www.webB.com某CSRF页面:
<script>
new Image().src=’http://www.webA.com/transport?account=abc&total=500’;
</script>
诱骗受害用户访问恶意网站CSRF页面
这种攻击方式,要求恶意网站知道转账功能的链接参数(比如转账功能链接)。
防御方法:
防护csrf的措施虽然很多,但归根到底就是一条:在客户端提交请求时增加伪造随机数。使得链接请求参数不可预测。
Token要足够随机–只有这样才算不可预测
Token是一次性的,即每次请求成功后要更新Token–这样可以增加攻击难度,增加预测难度
Token要注意保密性–敏感操作使用post,防止Token出现在URL中
5. SQL 注入
攻击方式:
由于程序中对用户输入检查不严格,用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
SQL注入的本质是对于输入检查不充分,导致SQL语句将用户提交的非法数据当作语句的一部分来执行。
SQL注入漏洞,就是将用户可控的数据拼接进了SQL语句中,一起提交到了数据库执行。
攻击者通过注入语句,改变SQL语句执行逻辑,通过控制部分SQL语句,攻击者可以查询数据库中任何自己需要的数据,利用数据库的一些特性,可以直接获取数据库服务器的系统权限。
防御方式:
防止 SQL 注入主要是不能允许用户输入的内容影响正常的 SQL 语句的逻辑,
严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对数据库的危害
后端代码检查输入的数据,对进入数据库的特殊字符(’,",,<,>,&,*,; 等)进行转义处理,或编码转换。
所有的查询语句建议使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到 SQL 语句中,即不要直接拼接 SQL 语句。
在应用发布之前建议使用专业的 SQL 注入检测工具进行检测,以及时修补被发现的 SQL 注入漏洞。网上有很多这方面的开源工具,例如 sqlmap、SQLninja 等。
避免网站打印出 SQL 错误信息,比如类型错误、字段不匹配等,把代码里的 SQL 语句暴露出来,以防止攻击者利用这些错误信息进行 SQL 注入。
不要过于细化返回的错误信息,如果目的是方便调试,就去使用后端日志,不要在接口上过多的暴露出错信息。