前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >那些年我们一起学XSS - 10. Dom Xss进阶 [邂逅eval]

那些年我们一起学XSS - 10. Dom Xss进阶 [邂逅eval]

作者头像
渗透攻击红队
发布2019-11-20 11:21:14
5920
发布2019-11-20 11:21:14
举报
文章被收录于专栏:漏洞知识库漏洞知识库
漏洞知识库

网络安全/渗透测试/代码审计/

关注

Dom Xss进阶 [邂逅eval]

代码语言:javascript
复制
前面的教程,说到了显式输出和隐式输出。但是不论怎么样,因为最终javascript都会通过document.write或innerHTML将内容输出到网页中,所以我们总是有办法看到输出到哪里。但是有时候,我们的输出,最终并没有流向innerHTML或document.write,而是与eval发生了邂逅,我们该怎么挖掘并利用呢?

1. 我们直接上例子。

代码语言:javascript
复制
http://kf.qq.com/search_app.shtml?key=aaaaa

和前面的不同之处,这次我们搜索源代码和调试工具都看不到任何东西。

2. 这个时候,我们可以看看Console,看看有没有其它有用的东西~~

一般来说,默认情况下,是不会有问题的。我们可以给参数加一些特殊符号。 这里我比较习惯用\,因为这玩意比较好使。当然你也可以用其它比较特殊的符号,比如双引号,单引号,只是被过滤掉的几率比较大。

这个时候,我们看看Console里面,多出了一条错误。

我们可以点右侧,直接定位到错误代码。

3. 点进去后,可以看到是哪个地方出错了。

我们来看看这段代码:

代码语言:javascript
复制
var getarg = function()
{
	var url = window.location.href;
	var allargs = url.split("?")[1];
	if (allargs!=null && allargs.indexOf("=")>0)
	{
		var args = allargs.split("&");
		for(var i=0; i<args.length; i++)
		{
			var arg = args[i].split("=");
			eval('this.'+arg[0]+'="'+arg[1]+'";');
		}
	}
};

和上一节教程类似,这段代码,实际上也是一个获取地址栏参数的代码。 比如,地址栏是key=aaaa; 那么 arg[0] 就是字符串'key', arg[1] 就是字符串 'aaaa'; 那么eval这句就是执行的 eval('this.key="aaaa";')

这样一来 , this.key="aaaa";这句就被执行了。

4. 如果这里我们把 key 换个写法呢? this.key="aaaa"; this.key;alert(1);//="aaaa";

如下图:

那么是不是将会执行我们的alert(1);呢? 5. 根据上面内容,我们可以构造代码。

代码语言:javascript
复制
http://kf.qq.com/search_app.shtml?key;alert(1);//=aaaa

HOHO~,如我们所愿的弹出了。

6. 不知道看完上面的,有没有娃注意到,后面的 aaaa 不是也可以构造吗? this.key="aaaa"; 换为 this.key="aaa";alert(1);//"; 确实是如此 :)

代码语言:javascript
复制
http://kf.qq.com/search_app.shtml?key=aaa";alert(1);//

这个在IE下一样是可以的。 但是这样在chrome下却不行。原因其实上面一节教程也提到过。 chrome会自动对", >, < 进行转换。 因而 this.key="aaa";alert(1);//"; 会变成 this.key="aaa%22;alert(1);//"; 从而失效。

7.上面就是本篇教程了,我们再来看看题外话。 其实以上问题,不是单独存在的。在另外一个页面也是存在的。 更多内容,参见本篇漏洞修复。

修复方案

参照你们已经修复的类似文件即可。

代码语言:javascript
复制
http://kf.qq.com/wsearch.shtml
的
http://kf.qq.com/js/wsearch.js

本来上面这个文件也是存在漏洞的,估计这个位置已经被人报告给腾讯了,因而腾讯加了一次防御。我们看看腾讯的防御措施。

代码语言:javascript
复制
var getarg = function(){
	.... 省略相同部分...
                eval('this.' + arg[0] + '="' + HtmlAttributeEncode(arg[1]) + '";');
	.... 省略相同部分...
    }

也就是说,腾讯这里对后面的arg[1]进行了过滤。 接着,这个问题又被再次报告了,因而前些时候,腾讯又进一步做了修复。

代码语言:javascript
复制
var getarg = function(){
	.... 省略相同部分...
            if (arg[0] != null && arg[1] != null && (arg[0] == 'page' || arg[0] == 'count' || arg[0] == 'tag' || arg[0] == 'key' || arg[0] == 'total') )
            {
                eval('this.' + arg[0] + '="' + HtmlAttributeEncode(arg[1]) + '";');
             }
	.... 省略相同部分...
    }

这一次,腾讯对 arg[0]进行了判断。 哈,补了东墙,补西墙。不过呢?补了这个wsearch.js文件,还有我们现在分析的这个(http://kf.qq.com/js/search_app.js)文件。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 漏洞知识库 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
网站渗透测试
网站渗透测试(Website Penetration Test,WPT)是完全模拟黑客可能使用的攻击技术和漏洞发现技术,对目标系统的安全做深入的探测,发现系统最脆弱的环节。渗透测试和黑客入侵最大区别在于渗透测试是经过客户授权,采用可控制、非破坏性质的方法和手段发现目标和网络设备中存在弱点,帮助管理者知道自己网络所面临的问题,同时提供安全加固意见帮助客户提升系统的安全性。腾讯云网站渗透测试由腾讯安全实验室安全专家进行,我们提供黑盒、白盒、灰盒多种测试方案,更全面更深入的发现客户的潜在风险。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档