渗透技术基础之XSS原理分析

XSS介绍

Cross-Site Scripting(跨站脚本攻击)简称XSS,是一种代码注入攻击。为了和CSS区分,这里将其缩写的第一个字母改成了X,于是叫做XSS。恶意攻击者在web页面里插入恶意JavaScript代码,当浏览者浏览网页时就会触发恶意代码,从而导致用户数据的泄露如Cookie、SessionID等,及造成其他类型的攻击。

XSS的本质是:恶意代码未经过滤,与网站正常代码混在一起,浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。从源头上讲,就是代码和数据被攻击混淆,导致浏览器将攻击者输入的数据解释为代码。

案例介绍

对于下面的代码

">
<button>搜索button>
<div>
  您搜索的关键词是:<%= getParameter("keyword") %>
div>

当构造链接:

http://xxx/search?keyword=">

浏览器请求该链接时,服务端会解析出参数keyword,得到">,拼接后,得到:

<input type="text" value=""><script>alert('XSS');script>">
<button>搜索button>
<div>
  您搜索的关键词是:"><script>alert('XSS');script>
div>

因为参数中的数据和页面代码产生了混淆,浏览将用户参数中的,解析为代码执行。

修复这个问题可以对用户输入参数进行转义。

使用函数escapeHTML()

">
<button>搜索button>
<div>
  您搜索的关键词是:<%= escapeHTML(getParameter("keyword")) %>
div>

escapeHTML()的转义规则为:

字符 转义后的字符
& &
< <
> >
" "
' '
/ /

经过转义,浏览器就可以很好的区分用户提交的数据和页面中的代码。

<input type="text" value=""><script>alert('XSS');</script>">
<button>搜索button>
<div>
  您搜索的关键词是:"><script>alert('XSS');</script>
div>
  1. 用户输入的为数据,目的是以文本显示出来
  2. 攻击者利用输入精心构造的片段,导致代码和数据混淆,使得浏览器将用户输入解析为代码
  3. 通过HTML转移可以防止XSS攻击

有时仅仅做HTML转义也是不够的。如:如果将JSON内联在HTML中

<script>
var initData = <%= data.toJSON() %>
script>

这时就不能使用escapeHTML(),因为会破坏JSON格式。

但此时并不安全

  • 当 JSON 中包含 U+2028U+2029 这两个字符时,不能作为 JavaScript 的字面量使用,否则会抛出语法错误。
  • 当 JSON 中包含字符串 时,当前的 script 标签将会被闭合,后面的字符串内容浏览器会按照 HTML 进行解析;通过增加下一个 \x3csVg/\x3e

    它能够检测到存在于 HTML 属性、HTML 文字内容、HTML 注释、跳转链接、内联 JavaScript 字符串、内联 CSS 样式表等多种上下文中的 XSS 漏洞,也能检测 eval()setTimeout()setInterval()Function()innerHTMLdocument.write() 等 DOM 型 XSS 漏洞,并且能绕过一些 XSS 过滤器。

    只要在网站的各输入框中提交这个字符串,或者把它拼接到 URL 参数上,就可以进行检测。

    检测工具

    • Arachni
    • Mozilla HTTP Observatory
    • w3af

    引用

    1. 前端安全系列(一):如何防止XSS攻击?
    2. 浅谈XSS攻击的那些事(附常用绕过姿势)
    3. XSS攻击原理分析与防御技术

    原文地址:渗透技术基础之XSS原理分析

你可能感兴趣的:(安全笔记,安全,XSS)