XSS 挑战

  • A+
所属分类:安全文章

前言

看到一篇有趣的帖子,是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的返回值

XSS 挑战

我继续阅读文档,发现有typeof返回值为undefined的有三种:

typeof undefined === 'undefined';
typeof declaredButUndefinedVariable === 'undefined';
typeof undeclaredVariable === 'undefined';

而这几种都是无法绕过判断的

XSS 挑战

当我看到后面发现document.all的时候 ,我感觉这可能是突破口

XSS 挑战

所有的浏览器都有一个暴露的类型undefined的非标准宿主对象--document.all

document.all已经从web标准中删除,但是各大浏览器目前还支持,Document接口有一个只读属性,返回一个HTMLALLCollection,包含页面上的所有元素

在挑战脚本中,绕过了对obj类型的限制,在脚本中,刚好存在一个div标签,我们可以用document.all中的id来访问div

当通过solve函数调用时,idv就具有了通过innerHTML接收器插入的img标签

测试一下

XSS 挑战

成功了

总结

挑战其实很简单,只要认真的阅读完关于typeof的介绍就可以通过,这也是很多ctf出题人常见的思路,利用一些规范来限制,绕过某些正常逻辑。



本文始发于微信公众号(跟着石头学安全):XSS 挑战

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: