[TOC]

反射型XSS

image.png
代码审计一般步骤:
找出关键位置

  1. 找出控制器
  2. 找出模板
  3. 验证位置

正向审计

  1. 接收参数位置
  2. 模板位置是否过滤
  3. 漏洞验证

反向审计

  1. 找出模板中的变量
  2. 查找变量来源
  3. 漏洞验证

    Xss漏洞的防御

  4. PHP输出到JS代码中,或者开发Json API的,则需要前端在JS中进行过滤:

    1. 尽量使用innerText(IE)和textContent(Firefox),也就是jQuery的text(来输出文本内容
    2. 必须要用innerHTML等等函数,则需要做类似php的htmlspecialchars的过滤(参照@eechen的答案)
  5. 其它的通用的补充性防御手段:
    1. 在输出html时,加上Content Security Policy的Http Header
    2. 在设置Cookie时,加上HttpOnly参数
    3. 在开发API时,检验请求的Referer参数

      了解浏览器编码

      浏览器如何工作

  • 用户界面
  • 浏览器引擎-用于查询和操作宣染引擎的界面。
  • 宣染引擎-负责显示请求的内容。如解析HTML和CSS并在屏幕上显示解析的内容。网络-用于网络呼叫,如HTTP请求。它具有平台独立接口和每个平台的底层实现。
  • UI后端-用于绘制组合框和窗口等基本小部件。它公开了一个非平台特定的通用接口。它下面使用操作系统用户界面方法。
  • JavaScript解释器。用于解析和执行JavaScript代码。
  • 数据存储。这是一个持久层。浏览器需要保存硬盘上的各种数据,例如cookie。新的HTML规范(HTML5)定义了”web数据库”,它是浏览器中一个完整的(尽管很轻的)数据库。

image.png
渲染引擎:

  • Firefox使用Gecko—种”自制”Mozilla宣染引Y。Safari和Chrome都使用Webkit。
  • Webkit是一个开源宣染引擎,起初是Linux平台的引擎,并由Apple修改以支持Mac和Windows。

主要流程:
渲染引擎将开始从网络层获取所请求文档的内容。这通常是以8K块的形式完成的。
image.png

  • 宣染引擎开始解析HTML文档并将标记转换为名为“内容树”的DOM节点。
  • 渲染树包含具有视觉属性(如颜色和尺寸)的矩形。矩形的顺序正确的在屏幕上显示。
  • 在构建宣染树之后,它将经历“布局”过程。

在开始构建和布局宣染树之前,它不会等到解析所有HTML。将解析和显示部分内容,同时继续处理来自网络的其余内容。
URL解析器> HTML解析器> CSS解析器>JS解析器
image.pngimage.png

解析器的类型:

  • 自上向下解析器:会看到语法的高级结构,并尝试匹配其中一个。
  • 自下而上解析器:从输入开始,逐渐将其转换为语法规则,从低级规则开始,直到满足高级规则。

    HTML解析器

    HTML5规范详细描述了解析算法。该算法包括两个阶段-标记化和树形结构。

  • 标记化是词法分析,将输入解析为标记。HTML标记包括开始标记,结束标记,属性名称和属性值。

  • 标记生成器识别标记,将其提供给树构造函数并使用下一个字符来识别下一个标记,依此类推,直到输入结束。

image.png

编码

url编码
标准的url结构是:
scheme://login:password@address:port/path?quesry_string#fragment
例:http://example.com/test.php?uid=27&content=on#main
一些常见的URL字符以及其编码值:详情HTML URL编码
image.png
Html编码
image.png
JS编码
image.png
CSS编码:
CSS的属性和值都可以进行CSS编码和解析,冒号:不可以
CSS解析器并不会等到所有的html都解析完成之后再去构建和布局render树。它是解析完一部分内容就显示一部分内容,同时,可能还在通过网络下载其余内容。
CSS编码解析是用了一套不太正统的转义策略:用一个反斜杠,后边跟1-6位十六进制数字构成。所以字母e可以编码为\65,1065,1000065。而因为这样,后边就不能直接紧跟数字或字母,否则会被当成转义里的内容处理,所以CSS选择了空格作为终止标识,在解码的时候,再将空格去除。

浏览器解码处理流:

浏览器接收时一般不需要对url进行解码处理,只有在发送后,服务器才需要对url进行解码来确定接收参数和定位资源。
HTML:
HTML解码是在浏览器构建完DOM树以后才进行解码的
JS编码:
不管是外部引用还是直接写在script标签里,又或者是在html标签的属性里,对于js编码的解码都是相同的。
HTML + CSS
image.png
可以触发JS解析器的方式

  • 直接嵌入