SVG利用+xssgame第8关注入详解
1.SVG利用实现xss攻击
1.如下代码所示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>test</title>
</head>
<body>
</body>
<script>
const data = decodeURIComponent(location.hash.substr(1));
const root = document.createElement('div');
root.innerHTML = data;
for (let el of root.querySelectorAll('*')) {
let attrs = []
for(let attr of el.attributes) {
attrs.push(attr.name);
}
for(let name of attrs) {
el.removeAttribute(name);
}
}
document.body.appendChild(root);
</script>
</html>
代码解析: location
:JavaScript 的 window
对象的属性,表示当前页面的 URL。随后进行了div标签创建,innerHTML讲data的数据插入root当中,for循环获取所有的元素,会将payload当中所有的属性删除
图中可见,删除了所有的属性
但是在使用两个svg标签之后,payload却成功执行,这是为什么呢?
经过代码断点调试发现在 root.innerHTML = data; 这一行中就已经执行了payload进行了xss弹窗,这其实与svg标签的命名空间有些关系 Embedded Content — SVG 2
浏览器发现 <svg>
标签后,会根据 HTML 标准中的 SVG 解析规则,创建一个 SVG 命名空间的元素。此时,解析器切换到 SVG 解析模式,后续内容(包括子元素)将按照 SVG 规范处理。所以此时会按照svg规范进行处理,内部的这个 <svg>
并不是普通 HTML 中的 <svg>
,它是在 SVG 命名空间下 解析的,仍然是一个 SVG
元素。它的 onload
属性被识别为 SVG
事件,并且立即执行 alert(1)
。在 SVG 解析上下文 中,浏览器对 SVG 元素的行为有特殊处理:SVG 的某些事件(如 onload
)在浏览器解析到该元素时,立即绑定并触发,无需等待元素插入文档(document.body
)。解析阶段的即时执行:内层 <svg onload=alert(1)>
在解析阶段被浏览器识别为 SVG 元素,其 onload
事件会在属性被后续代码移除前触发。 所以利用两个svg标签可以进行该代码缺陷的xss漏洞。
2.xssgame第7关详解
网站链接:XSS Game - Learning XSS Made Simple! | Created by PwnFunction
代码分析,对payload进行了长度和特殊字符进行了限制以及对alert也进行了限制,因为对alert也进行了过滤,此时第一种想法是结合前面学的location,获取当前页面的url
解法一:
eval(location.hash.slice(1))#alert(1)
使用location特性获取本页面url地址,使用slice进行#号后的字符串截取,之后弹窗成功
解法二:
Function构造函数,Function()
构造函数创建 Function 对象。直接调用构造函数可以动态创建函数,与eval()函数相似
Function("alert(1)")
创建了一个新的函数,等价于:
function anonymous() {
alert(1);
}
因为过滤了alert所以可以在构造函数的时候使用大写ALERT再进行转小写
Function(/ALERT(1)/.source.toLowerCase())()
()表示立即执行该函数
3.xssgame第8关详解
DOMPurify
是一个用于清理恶意输入的库,它会从输入的 HTML 字符串中删除潜在的恶意代码,从而防止 XSS 攻击。所以平时我们使用的标签在这里都会被过滤清除,但是真的没有任何办法了吗?
在GitHub上找到该项目源码及白名单
通过官方文档可以查到setTimeout()这个函数只能执行一个函数或指定的代码片,不能为一个对象
我们可以伪造一个ok,然后利用setTimeout执行我们的代码,而刚好setTimeout拿到ok时,会自动调用toString方法去执行我们标签后面的属性,a标签在alert函数中会自动调用toString方法
结合之前的白名单构造正确的payload:
boomer=<a id="ok" href="mailto:alert(1)">