前言
看到一篇有趣的帖子,是Gareth Heyes分享的一个有趣的xss 挑战,帖子的内容如下:
<script>
function solve(obj, property){
if(typeof obj === 'undefined') {
obj[property].innerHTML = '<img src=1 onerror="alert(`You win`)">';
} else {
alert('You must try harder than that.');
}
}
</script>
<div id=x></div>
挑战
目的
需要绕过限制,触发弹窗
初步判断
在这个挑战中有一个接收器--inner HTML,
innerHTML 属性用于设置或返回指定标签之间的 HTML 内容。简单理解就是获取对象的内容或者向对象插入内容,
当obj的类型为定义时,才能进入if 判断,我们才能制定属性的innerHTML设置为xss负载
ok,到这一步大概思路就有了,如何传入一个(obj,property),才能弹窗
寻找类型是undefined的对象
console.log(typeof 42);
// expected output: "number"
console.log(typeof 'blubber');
// expected output: "string"
console.log(typeof true);
// expected output: "boolean"
console.log(typeof undeclaredVariable);
// expected output: "undefined"
var arr = new Array(); // Array类型
console.log(typeof arr);
var nul =null; // 特殊地
console.log(typeof nul);
var obj = new Object(); // Object 类型
console.log(typeof obj);
var arr2 = [1,32]; // 字面数字的数组
console.log(typeof arr2);
function Person(name){// 自定义对象
this.name =name;
}
var stu = new Person();
console.log(typeof stu);
// expected output: "object"
var fn = function(){};
console.log(typeof fn);
// expected output: "function"
根据typeof的介绍也能了解到typeof的返回值
我继续阅读文档,发现有typeof返回值为undefined
的有三种:
typeof undefined === 'undefined';
typeof declaredButUndefinedVariable === 'undefined';
typeof undeclaredVariable === 'undefined';
而这几种都是无法绕过判断的
当我看到后面发现document.all的时候 ,我感觉这可能是突破口
所有的浏览器都有一个暴露的类型undefined
的非标准宿主对象--document.all
document.all已经从web标准中删除,但是各大浏览器目前还支持,Document接口有一个只读属性,返回一个HTMLALLCollection,包含页面上的所有元素
在挑战脚本中,绕过了对obj类型的限制,在脚本中,刚好存在一个div标签,我们可以用document.all中的id来访问div
当通过solve函数调用时,idv就具有了通过innerHTML
接收器插入的img标签
测试一下
成功了
总结
挑战其实很简单,只要认真的阅读完关于typeof的介绍就可以通过,这也是很多ctf出题人常见的思路,利用一些规范来限制,绕过某些正常逻辑。
本文始发于微信公众号(跟着石头学安全):XSS 挑战
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论