Web安全学院
Web安全学院
  • 首页
  • 译序
  • 学习路线
  • 前篇
    • Web应用程序安全测试
    • 动态应用程序安全测试(DAST)
    • 带外应用程序安全测试(OAST)
  • 服务器端主题
    • SQL注入
      • SQL注入
      • SQL注入UNION攻击
      • 在SQL注入攻击中检索数据库
      • SQL盲注
      • SQL注入速查表
    • 认证
      • 认证漏洞
      • 基于密码登录中的漏洞
      • 多因素认证中的漏洞
      • 其他认证机制中的漏洞
      • 如何保护你的认证机制
    • 目录遍历
      • 目录遍历
    • 命令注入
      • OS命令注入
    • 业务逻辑漏洞
      • 业务逻辑漏洞
      • 业务逻辑漏洞示例
    • 信息泄露
      • 信息泄露漏洞
      • 如何发现并利用信息泄露漏洞
    • 访问控制
      • 访问控制漏洞与权限提升
      • 不安全的直接对象引用(IDOR)
      • 访问控制安全模型
    • 文件上传漏洞
      • 文件上传漏洞
    • 条件竞争
      • 条件竞争
    • 服务器端请求伪造(SSRF)
      • 服务器端请求伪造(SSRF)
      • 盲SSRF漏洞
    • XXE注入
      • XML外部实体(XXE)注入
      • XML实体
      • 发现并利用盲XXE漏洞
  • 客户端主题
    • 跨站脚本(XSS)
      • 跨站脚本
      • 反射型XSS
      • 存储型XSS
      • 基于DOM的XSS
      • XSS上下文
        • 跨站脚本上下文
        • 客户端模版注入
      • 利用跨站脚本漏洞
      • 内容安全策略
      • 悬空标记注入
      • 如何防范XSS漏洞
      • 跨站脚本(XSS)速查表
    • 跨站请求伪造(CSRF)
      • 跨站请求伪造(CSRF)
      • XSS与CSRF
      • 绕过CSRF令牌验证
      • 绕过SameSite Cookie限制
      • 绕过基于Referer的CSRF防御
      • 如何防范CSRF漏洞
    • 跨域资源共享(CORS)
      • 跨域资源共享(CORS)
      • 同源策略(SOP)
      • CORS和Access-Control-Allow-Origin响应标头
    • 点击劫持
      • 点击劫持(UI伪装)
    • 基于DOM的漏洞
      • 基于DOM的漏洞
      • 控制Web消息源
      • 基于DOM的开放重定向
      • 基于DOM的Cookie操纵
      • 基于DOM的JavaScript注入
      • 基于DOM的document-domain操纵
      • 基于DOM的WebSocket URL投毒
      • 基于DOM的链接操纵
      • Web消息操纵
      • 基于DOM的Ajax请求标头操纵
      • 基于DOM的本地文件路径操纵
      • 基于DOM的客户端SQL注入
      • 基于DOM的HTML5 Storage操纵
      • 基于DOM的客户端XPath注入
      • 基于DOM的客户端JSON注入
      • DOM-data操纵
      • 基于DOM的拒绝服务
      • DOM破坏
    • WebSocket
      • 测试WebSocket安全漏洞
      • 什么是WebSocket?
      • 跨站WebSocket劫持
  • 进阶主题
    • 不安全的反序列化
      • 不安全的反序列化
      • 利用不安全的反序列化漏洞
    • 测试GraphQL API
      • 测试GraphQL API
      • 什么是GraphQL?
    • 服务器端模板注入
      • 服务器端模板注入
      • 利用服务器端模板注入漏洞
    • Web缓存投毒
      • Web缓存投毒
      • 缓存设计缺陷的利用
      • 缓存实现缺陷的利用
    • HTTP Host标头攻击
      • HTTP Host标头攻击
      • 如何识别和利用HTTP Host头的漏洞
      • 密码重置投毒
    • HTTP请求走私
      • HTTP请求走私
      • 查找HTTP请求走私漏洞
      • 利用HTTP请求走私漏洞
      • 高级请求走私
        • 高级请求走私
        • HTTP/2降级
        • 响应队列投毒
        • HTTP/2专属载体
        • HTTP请求隧道
      • 浏览器驱动的请求伪造
        • 浏览器驱动的请求伪造
        • CL.0请求走私
        • 客户端异步攻击
        • 基于暂停的异步攻击
    • OAuth认证
      • OAuth 2.0认证漏洞
      • OAuth授权类型
      • OpenID Connect
      • 如何防范OAuth认证漏洞
    • JWT攻击
      • JWT攻击
      • 在Burp Suite中使用JWT
      • 算法混淆攻击
    • 原型污染
      • 什么是原型污染?
      • JavaScript原型和继承
      • 客户端
        • 客户端原型污染漏洞
        • 通过浏览器API进行原型污染
      • 服务器端
        • 服务器端原型污染
      • 预防原型污染漏洞
    • 基本技能
      • 基本技能
      • 使用编码混淆攻击
      • 在手动测试中使用Burp Scanner
Powered by GitBook
On this page
  • HTML标签之间的XSS
  • HTML标签属性中的XSS
  • XSS到JavaScript
  • 终止现有脚本
  • 跳出JavaScript字符串
  • 利用HTML编码
  • JavaScript模板字面值中的XSS
  • 通过客户端模板注入进行XSS
  1. 客户端主题
  2. 跨站脚本(XSS)
  3. XSS上下文

跨站脚本上下文

PreviousXSS上下文Next客户端模版注入

Last updated 1 year ago

在测试反射型和存储型XSS时,一个关键的任务就是识别XSS上下文:

  • 攻击者可控数据出现在响应中的位置。

  • 应用程序对该数据进行的任何输入验证或其他处理。

根据这些细节,选择一个或多个候选的XSS有效载荷,并测试它们是否有效。

注意

我们已经建立了一个全面的,以帮助测试Web应用程序和过滤。你可以按事件和标签进行筛选,并查看哪些载体需要用户交互。速查表还包含AngularJS沙箱逃逸和许多其他部分,以便协助进行XSS研究。

HTML标签之间的XSS

当XSS上下文是HTML标签之间的文本时,你需要引入一些新的HTML标签,用于触发JavaScript的执行。

一些执行JavaScript的有用方法:

<script>alert(document.domain)</script>
<img src=1 onerror=alert(1)>

LAB

LAB

LAB

LAB

LAB

LAB

HTML标签属性中的XSS

当XSS上下文进入到HTML标签属性值时,有时可以终止属性值、关闭标签,并引入一个新标签。

"><script>alert(document.domain)</script>

在这种情况下,更常见的是,尖括号被阻拦或被编码,因此你的输入无法逃脱其所在的标签。只要能终止属性值,一般就可以引入一个新属性来创建一个可执行脚本的上下文,如事件处理器。

" autofocus onfocus=alert(document.domain) x="

上述有效载荷创建了一个onfocus事件,该事件将在元素获得焦点时执行JavaScript,同时还添加了autofocus属性,以尝试在没有任何用户交互的情况下自动触发onfocus事件。最后,它添加了x="以优雅地修复后续的标记。

LAB

有时,XSS上下文进入的是一种HTML标签属性,它本身就可以创建一个可执行脚本的上下文。在这里,你可以执行JavaScript,而无需终止属性值。例如,如果XSS上下文进入锚标签的href属性,则可以使用javascript伪协议来执行脚本。

<a href="javascript:alert(document.domain)">

LAB

LAB

XSS到JavaScript

当XSS上下文为响应中的某些现有的JavaScript时,可能会出现各种各样的情况,需要使用不同的技术来进行成功的利用。

终止现有脚本

在最简单的情况下,可以简单地关闭封装现有JavaScript的脚本标签,并引入一些新的HTML标签来触发JavaScript的执行。例如,如果XSS上下文如下:

<script>
...
var input = 'controllable data here';
...
</script>

那么可以使用以下有效载荷跳出现有的JavaScript并执行自己的JavaScript:

</script><img src=1 onerror=alert(document.domain)>

这种方法能够起效的原因是,浏览器首先进行HTML解析,以识别包括脚本块在内的页面元素,然后才进行JavaScript解析,以理解并执行嵌入的脚本。上述有效载荷会破坏原始脚本,留下一个未终止的字符串字面值。但这并不妨碍后续的脚本按正常的方式解析和执行。

LAB

跳出JavaScript字符串

如果XSS上下文位于一个引号字符串字面值内,通常可以跳出字符串直接执行JavaScript。必须修复XSS上下文后的脚本,因为任何语法错误都会导致整个脚本无法执行。

一些跳出字符串字面值的有用方法:

'-alert(document.domain)-'
';alert(document.domain)//

LAB

一些应用程序会尝试用反斜杠转义任何单引号字符,以防止输入从JavaScript字符串中跳出。字符前的反斜杠会告诉JavaScript解析器,该字符应按字面意思解释,而不是解释为特殊字符,如字符串终止符。在这种情况下,应用程序经常会犯一个错误,就是没有转义反斜杠字符本身。这意味着攻击者可以使用他们自己的反斜杠字符来抵消应用程序添加的反斜杠字符。

例如,假设输入:

';alert(document.domain)//

被转换为:

\';alert(document.domain)//

你现在可以使用替代的有效载荷:

\';alert(document.domain)//

它被转换为:

\\';alert(document.domain)//

这里,第一个反斜杠意味着第二个反斜杠作为字面意义解释,而不是作为特殊字符。这等于引号现在被解释为字符串终止符,因此攻击成功。

LAB

某些网站通过限制你被允许使用的字符来使XSS变得更加困难。这可以是在网站层面进行,也可以通过部署WAF来阻止你的请求到达网站。在这些情况下,你需要尝试使用其他方式来调用绕过这些安全措施的函数。一种方法是将throw语句与异常处理器一起使用。使你能够在不使用括号的情况下将参数传递给函数。以下代码将alert()函数赋给全局异常处理器,throw语句将1传递给异常处理器(在本例中为alert)。最终结果是,调用以1作为参数的alert()函数。

onerror=alert;throw 1

下一个实验演示了一个过滤某些字符的网站。你必须使用与上述类似的技术才能解决它。

LAB

利用HTML编码

当XSS上下文是引号标签属性中的某些现有JavaScript(如事件处理器)时,可以利用HTML编码来绕过某些输入过滤。

当浏览器解析出响应中的HTML标签和属性时,在进一步处理之前,它将对标签属性值进行HTML解码。如果服务器端应用程序阻拦或清理了一些用于成功执行XSS攻击所需的字符,你通常可以通过对这些字符进行HTML编码来绕过输入验证。

例如,如果XSS上下文如下所示:

<a href="#" onclick="... var input='controllable data here'; ...">

并且应用程序会阻拦或转义单引号字符,你可以使用以下有效载荷来跳出JavaScript字符串并执行你自己的脚本:

&apos;-alert(document.domain)-&apos;

&apos;序列是表示撇号或单引号的HTML实体。因为浏览器在解释JavaScript之前会对onclick属性的值进行HTML解码,所以该实体会被解码为引号,而引号会成为字符串分割符,这样攻击就会成功。

LAB

JavaScript模板字面值中的XSS

JavaScript模板字面值是允许嵌入JavaScript表达式的字符串字面值。嵌入的表达式会被求值,通常会被连接到周围的文本中。模板字面值使用反引号封装,而不是普通的引号,嵌入的表达式使用${...}语法进行标识。

例如,以下脚本将打印一条包含用户的显示名称的欢迎消息:

document.getElementById('message').innerText = `Welcome, ${user.displayName}.`;xxxxxxxxxx document.getElementById('message').innerText = `Welcome, ${user.displayName}.`;document

当XSS上下文进入JavaScript模板字面值时,无需终止字面值。相反,你只需要使用${...}语法嵌入一个在处理字面值时将被执行的JavaScript表达式。例如,如果XSS上下文如下所示:

<script>
...
var input = `controllable data here`;
...
</script>

那么你可以使用以下有效载荷来执行JavaScript,而无需终止模板字面值:

${alert(document.domain)}

LAB

通过客户端模板注入进行XSS

一些网站使用客户端模板框架(如AngularJS)动态渲染网页。如果它们以不安全的方式将用户输入嵌入这些模板中,攻击者就有可能注入自己的恶意模板表达式,从而发起XSS攻击。

阅读更多

或许你会遇到对尖括号进行编码但仍允许注入属性的网站。有时,即使在通常不会自动触发事件的标签内(如Canonical标签),这些注入也是可能的。你可以使用Chrome上的访问键和用户交互来利用这种行为。访问键允许你提供引用特定元素的键盘快捷键。accesskey属性则允许你定义一个字母,当该字母与其他按键(这些按键在不同的平台上有所不同)一起按下时,将触发事件。在下一个实验中,你可以尝试使用访问键,并利用Canonical标签。。

有多种方式可以使用这种技术调用。

XSS速查表
反射型XSS到无任何编码的HTML上下文
存储型XSS到无任何编码的HTML上下文
反射型XSS到大部分标签和属性被阻拦的HTML上下文
反射型XSS到除自定义外的所有标签都被阻拦的HTML上下文
事件处理器和href属性被阻拦的反射型XSS
允许某些SVG标记的反射型XSS
反射型XSS到尖括号HTML编码的属性中
存储型XSS到双引号HTML编码的锚href属性中
你可以使用PortSwigger Research发明的一种技术在隐藏的输入字段中利用XSS
Canonical链接标签中的反射型XSS
反射型XSS到带单引号和反斜杠被转义的JavaScript字符串中
反射型XSS到一个带尖括号HTML编码的JavaScript字符串中
反射型XSS到一个带尖括号和双引号HTML编码以及被转义的单引号的JavaScript字符串中
不带括号的函数
在JavaScript URL中阻拦了某些字符的反射型XSS
存储型XSS到带HTML编码的尖括号和双引号以及被转义的单引号和反斜杆的onclick事件中
反射型XSS到一个通过Unicode转义尖括号、单引号、双引号、反斜杠和反引号的模板字面值中
客户端模板注入