XSS的构造技巧

XSS的构造技巧

By:Mirror王宇阳 E-mail:2821319009@qq.com

本文为长期持续维护,一旦遇到新的技术技巧将及时更新本文内容

非常的欢迎技术大佬纠正并补充,也欢迎技术同僚讨论学习

利用字符编码

利用字符编码构造成一个xss,在道哥的书中是这样描述的:

百度搜索存在一个script标签输出一个变量,但是转义了双引号

var ** = "  \";alert(/xss/);" 

正常情况下,双引号被转义了,后面的(引号外)内容是会被赋给**并得不到有效输出的~(一旦赋值那么这就知识一个普通的字符串,而不会构成xss)

但是百度使用了GBK的编码方式返回页面,在返回中“%c1/”会组合成为一个Unicode字符,在浏览器中会被认为是一个合法的字符,意义:表示这个转义的斜杠就失去了作用,同理双引号也就不会被转义

# 构造
%c1";alert(/xss/);//
# 页面返回效果
var ** = "%c1/";alert(/xss/);//"
//这时的**的值时特殊的字符 alert(/xss/);被当做一条可执行的语句存在script标签中构成了xss

绕过长度限制

存在xss漏洞的攻击点,服务端对该处有逻辑上的长度限制;在有限的长度限定内无法完成自己需要的xss语句构造!

举例:<input type=text value="$var" > 该处的$var可以实现xss><script>alert(/xss/)</script>等一定字符限制内容的xss构造……

如果服务端对$var变量的长度设置了字符长度限制……攻击者可以利用事件Event来缩短自己xss的字符长度例如:" onclick=alert(/xss/) 这时候也会鼠标触发事件导致xss的执行……

但是如果长度的限制导致我们也无法使用事件来构造xss;道哥给出的解决办法是:将xss Payload写到其他地方,在构造简短的代码加载Payload xss

使用location.hash

location.hash是一个很好的藏代码的地方,他下载地址栏#符号后面,长度理论上没有限制而且HTTP协议中是不会计算该内容的……

# URL构造
http://www.xxx.com/index.html#alert(/xss执行/)
# 构造xss $var变量的值
" onclick="eval(location.hash.substr(1))" 

当触发鼠标时间后,就会执行eval函数(执行js代码),调用location.hash的内容且从第一个字符开始(因为第0个字符是符号#)

特定环境注释绕过长度限制

当我们的xss测试环境下,有两个以及两个以上的可输入的文本框,则可以利用HTML的注释符特性,将两个文本框之间的HTML代码内容全部注释,最终将多个文本框之间连通在一起可以实现多字节长度的xss Payload的构造和使用……

<base>标签

<base>标签是一种用于定义HTML文档中定义的“相对路径”链接属性源地址的标签;通俗的说:

<img src="/imgage/2001/9/img_222993.png">

这是一个图片标签,使用的是相对地址,默认情况是从当前的位置寻找imgage文件夹一路追溯找到png图片,但是本地并没有这个png图片,这个图片是从一个图穿网站上找来的,但是没有使用绝对路径导致图片无法加载,而正有几百个img标签存在与这同样的问题;为了方便可以使用<base>标签,定义:

<base href="http://www.xxx.con/">

在这个标签之后的所有地址链接都会从这个网站开始构造成一个绝对路径进行追溯文件并加载……

攻击者可以在适当的地方加入<base>标签,导致该标签后的所有链接地址重新定义追溯地址的起点位置,攻击者可以利用这个伪造图片、链接等等……这是一种链接地址劫持

巧妙运用window.name

window.name是对当前窗口的对象操作,而非document……利用window.name可以实现不一样的神奇的操作…

index_1.html:

<script>
	window.name = "text";
    alert(document.domain + "~" + window.name);
    window.location = "index_2.html";
</script>

index_2.html:

<script>
	alert(document.domain + "~" + window.name)
</script>

最后的测试结果显示:两个HTML页面的window.name的内容为一致!由此可得出:window.name是可以跨站、跨页面实现一定的操作内容的

同理:window.name的内容值实现了跨页面后,就可以在另外一个由该页面跳转的HTML页面中发现xss漏洞后利用window.name;若window.name是一个xss Payload语句,在页面xss利用处直接写入eval(window.name)岂不是美哉!

posted @ 2020-01-22 20:02  Mirror王宇阳  阅读(463)  评论(0编辑  收藏