本页目录

Learn XSS

概念、分类与威胁模型

跨站脚本攻击(Cross-site Scripting, XSS)是一种常见的网络安全漏洞,攻击者通过在网页中插入恶意脚本,使得用户在浏览网页时执行这些脚本,从而达到攻击的目的。

XSS攻击分为三种:反射型、存储型、DOM型。反射型和存储型是服务器端的漏洞,DOM型是客户端的漏洞。

Reflected XSS

反射型(Reflected XSS)/非持久型(Non-Persistent XSS):服务器直接从HTTP请求中读取数据,并且返回到HTTP响应中。

img
1.

攻击者发现有漏洞的站点,并构造恶意URL,例如URL中包含script标签;

2.

诱骗用户打开链接;

3.

服务器没有过滤URL中的输入,但也没有存储,而是直接反射到响应中;

4.

网站使用URL中的数据生成页面的某一部分内容,并返回;

5.

script标签被用户浏览器渲染,并执行了其中的恶意代码,例如将用户的cookie发送给攻击者。

Stored XSS

存储型(Stored XSS)/持久型(Persistent XSS):网站将未正确过滤的数据储存在数据库中,例如论坛发言、用户评论等等。

img
1.

攻击者发现服务器会直接保存未过滤的用户输入,因此向服务器注入一段代码,例如留下一条包含script标签的评论;

2.

服务器未经过滤就保存了攻击者的输入数据;

3.

用户完全正常的访问网站;

4.

网站将内容返回,例如返回评论列表;

5.

评论中的script标签被渲染时执行。

DOM-Based XSS

DOM型(DOM-Based XSS):DOM型XSS和反射型XSS很像,但DOM型XSS是由客户端的JavaScript代码处理数据时造成的漏洞,而不是服务器端。

img
1.

攻击者发现有漏洞的站点,并构造恶意URL;

2.

诱骗用户打开链接;

3.

服务器正常返回数据;

4.

对请求参数的处理在前端完成,例如在前端通过innerHTML了操作DOM,由此导致恶意代码被执行。

练习

下文给出的PortSwigger靶场中有关XSS的Lab目标是使得网站调用alert()函数。

Reflected XSS

PortSwigger Lab: Reflected XSS into HTML context with nothing encoded

1.

随便搜索点什么,看到内容会反射到h1标题中。

img
2.

尝试注入,搜索,完成。

img

Stored XSS

PortSwigger Lab: Stored XSS into HTML context with nothing encoded

1.

网站有评论系统,直接留言

img
2.

完成,可以看到再次加载页面时,评论内容未经过滤直接加载到HTML文档。

img
img

DOM-Based XSS

PortSwigger Lab: DOM XSS in document.write sink using source location.search

1.

同样的搜索框,搜索,发现这次被转义了。

img
2.

仔细看一下文档代码,发现一个script标签,类似用来追踪用户搜索行为的埋点。

img
3.

注意到URL参数中的search被直接写入img标签,因此这次搜索"/>,载荷最前面的"/>先让img闭合即可。

img

参考资料

本文的插图来源于: