Web安全初探

WEB基本攻击大致可以分为三大类—— “资源枚举”、“参数操纵” 和 “其它攻击”。

资源枚举

遍历站点所有可访问的目录,寻找备份文件(.bak, bak.rar)。

参数操纵

包括了 SQL 注入、XPath 注入、cgi 命令执行,还有 XXS 和会话劫持等。前三个的攻击主要是在服务端触发的,后二者的攻击则是侧重于客户端。

SQL 注入、XPath 注入、cgi 命令执行

SQL 注入是指提交含有 SQL 操作语句的信息给后端,后端如果没有做好过滤就执行该语句,攻击者自然可以随意操纵该站点的数据库。

例如:

book.com/book?id=100'or'1'='1

XPath 注入跟 SQL 注入差不多,只不过这里的数据库走的 xml 格式。cgi 命令执行指的是用户远程访问 cgi 脚本时,通过提交恶意的参数让服务器执行相关的 cgi 命令来获取信息甚至操纵服务器。

对于这几个攻击,需要做的自然是对提交参数的过滤,最好是前端过滤一遍,后端也过滤一遍(重要)。

XSS

XSScross-site scripting 跨域脚本攻击)攻击重点是“跨域”和“客户端执行”。

比如在某个网站的输入框输入一段脚本:

<script>alert('xss')</script>

站点没有对数据做任何过滤,而且会原封不动地把用户输入的数据展示回来,那么返回的页面自然也会返回这段脚本,从而执行它。

如果网站对 js 敏感字符进行了过滤,也还是有办法:

1
2
3
4
<script type="text/javascript">
var x='eva'+String.fromCharCode(108),y=window,e='a'+String.fromCharCode(108)+'ert("欢迎收看本文章")';
y[x]['call'](this,e);
</script>

另外,对于出现在 html 标签的属性里的脚本,如:

<input type="text" value="<script>alert('xss')</script>">

可以通过在 script 标签前加 > 来是脚本得以执行,或者将脚本放在 onclickonload 事件中,具体参考:XSS的原理分析与解剖

对于XSS的预防自然也是对提交数据的过滤,另外还有一点——谨慎返回用户提交的内容。

会话劫持:

第三方攻击者可以通过嗅探的方式来获取用户与服务器通讯中的报文信息,如果他能猜测到数据中的序列号,那便能把合法的用户断开,伪装成合法用户让自己控制后续的通话。

对于会话劫持的预防,可以走SSH协议、增强网络安全系统健壮性,也可以使用无序的UUID来替代通讯中的序列号码(而非逐步递增)。

其他攻击

包括CSRF攻击、钓鱼攻击和拒绝服务攻击等。

CSRFcross-site request forgery,跨站请求伪造),与 XSS 非常相似,但 XSS 是利用用户对当前网站的信任来发起攻击,而 CSRF 是利用网站对用户的信任来发起攻击。

假设某网站安全机制很松懈,只要没关闭浏览器,就可以进行任意操作。那么,可以给用户发送一封邮件,邮件中插入一张图片:

<img src='http://aaa.com/pay?id=100'/>

imgscriptiframe 标签都是不受同源策略限制的,此时若用户登录了该网站且未关闭浏览器,会直接跳到支付页面。

对于 CSRF 攻击,能做的可以有:

  1. 检查报头中的 Referer 参数确保请求发自正确的网站(但 XHR 请求可调用 setRequestHeader 方法来修改 Referer 报头);

  2. 对于任何重要的请求都需要重新验证用户的身份;

  3. 创建一个唯一的令牌(Token),将其存在服务端的 session 中及客户端的 cookie 中,对任何请求,都检查二者是否一致。

钓鱼攻击指的是网站的伪造,比如 ta0bao.com,然后在其中应用XSS等方式发起攻击。拒绝服务(DoS)指的是向网站发起洪水一样的请求(Traffic Floor),导致服务器超负荷并关闭。

攻击层面

  1. 表单输入(甚至包括hidden控件的内容);

  2. cookie(通过修改cookie内容也可以达到SQL注入攻击的目的);

  3. 报头(有时候为了方便统计来源数据,服务器会把客户端发来报头的Referer、User-Agent信息存到数据库中,那么通过修改报头信息也可以起到SQL注入工具目的)

  4. 请求参数

  5. 上传文件(在文件内携带恶意代码)

解决方案

  1. 永远不要相信客户端传来的任何信息,对这些信息都应先进行编码或过滤处理;

  2. 谨慎返回用户输入的信息;

  3. 使用黑名单和白名单处理(即“不允许哪些敏感信息”或“只允许哪些信息”,白名单的效果更好但局限性高);

  4. 检查、验证请求来源,对每一个重要的操作都进行重新验证;

  5. 使用SSL防止第三方监听通信(但无法阻止XSS、CSRF、SQL注入攻击);

  6. 不要将重要文件、备份文件存放在公众可访问到的地方;

  7. 会话ID无序化;

  8. 对用户上传的文件进行验证(不单单是格式验证,比方一张gif图片还应将其转为二进制并验证其每帧颜色值<无符号8位>和宽高值<无符号16位>);

  9. WSDL文档应当要求用户注册后才能获取;

  10. 在报头定义CSP(Content Security Policy)

感谢

本文是 浅谈WEB安全性(前端向) 一文的读书笔记,具体还需实际项目中运用后才能理解。另外,涉及到 Web安全 的开发中可参考 给开发者的终极XSS防护备忘录

坚持原创技术分享,您的支持将鼓励我继续创作!