Home > IT > Bypass Some Restrictions by Using JavaScript Injection

Bypass Some Restrictions by Using JavaScript Injection

分享家:Addthis中国

本文完成于昨天,本打算今日检查一遍后发布的。让我最难以料掉的是,本文用于测试的示例页面竟然很巧合的在今日改版了,不再对密码图片进行隐藏了。也许某天他又会开始隐藏吧

我找了好久都未找到和这个一样的既带有隐藏又具有 referer 限制的页面。唉。无奈还是发布了,毕竟写了这么多了。不过相信有一些前端基础的朋友还是看得懂这篇关于 JavaScript 注入的日志的。

给朋友带来的阅读上的麻烦,深感抱歉~

前几天 Solrex 告诉我一个很有趣的密码公布方式

该站是提供 Podcast 服务的,允许免费使用。但是免费用户需要向该站索取每n分钟更新一次的密码。可恶的是,获取密码的 Podcast password 链接按钮不停地在一个 Google Ad 前面漂浮。
hidepsw.JPG
为了避免不必要的麻烦,如广告嫌疑等等,我把图片的一些文字涂掉了!
点击那个按钮,就会显示出一个密码图片。但是有时候会一个不小心就点到广告。
getpsw.JPG

个人觉得,提供了服务收取相应费用也是很正常的,但是用这种获取免费密码的方式来折腾别人,我只能联想到两个字——变态!我想必然有绕过点击过程的方法。

通过查看源代码,发现密码图片的地址为 http://podcast.overseakids.com/text2png/show_psw_png.php 。我把这个地址直接输入地址栏,直接跳转到了首页。这也是意料之中,我想也应该做了一个限制的,如 referer 的检测等等。

于是,我进一步看了下免费密码获取页面的源代码和CSS,即 http://drupal.overseakids.com/node/17 。发现这么两段 HTML 和 CSS,如下:

<div id="psw"> 
	<img src="http://podcast.overseakids.com/text2png/show_psw_png.php" /> 
</div>
#psw { margin-top: 49px; margin-left: 260px; display: none; z-index: -1; }

由上面的 display: none; 看以看到,显示密码图片的层仅仅是把隐藏了而已。其实只要把 display 属性改为 block ,然后做一些相应的位置调整就 OK 了。

比较便捷的方法,就是直接利用 JavaScript 修改这个页面。代码如下:

function()
{
	var psw=document.getElementById("psw");
	//使 psw 层以“块”形式显示
	psw.style.display="block";
	//层边界为0
	psw.style.margin="0";
}

但是要让这段代码在页面中起到作用还需要做了小小的处理,写成直接可以在地址栏运行的 JavaScript ,即为 JavaScript 植入。如下

javascript:(function(){var%20psw=document.getElementById("psw");psw.style.display="block";psw.style.margin="0";})();

值得注意的是空格,即” “,需要被转换为”%20″。

到目前为止,先进入刚刚那个免费密码获取页面,然后直接在地址栏输入上面这段 JavaScript 代码,密码图片就会出现在那个 Google Ad 下面了。偶尔该站会出现一些问题,密码图片会是空白。

如果各位觉得每次都要复制粘贴这个 JavaScript 代码太麻烦的话,可以新建一个书签,书签的 URL 就是这段代码。当进入免费密码获取页面之后点一下该书签就 OK 了。

可以看到上述的解决方法并不是很完美,如果能让最后仅仅显示一个密码图片的话,那就更整洁和方便了。

其实这个密码图片的地址仅仅做了对 referer 的限制。一般情况下,用 PHP 、 ASP 等服务端脚本可以很方便的自定义一个 referer ,referer限制的问题也就解决了,但是 JavaScript 是客户端脚本,奢望他能自定义一个 referer 简直是天方夜谭。目前我可以想到一个简单的解决方法就是,用 JavaScript 在免费密码获取页面生成一个到密码图片的链接,并进行一个模拟点击。

function()
{
	var psw=document.getElementById("psw");
	//使 psw 层以“块”形式显示
	psw.style.display="block";
	//将 psw 层的内容改为一个 id 为 haha 的链接,改链接指向密码图片的地址。
	psw.innerHTML="<a id=haha href=http://podcast.overseakids.com/text2png/show_psw_png.php>haha</a>";
	var haha=document.getElementById("haha");
	//接下来实现对链接的模拟点击
}

由于现在浏览器的种类太多,所以模拟点击的方法也不尽相同。不过大体还是分为 IE 和非 IE 两种。

  1. IE 的方法很简单

    haha.click();
  2. 非 IE 的需要新建事件

    //建立一个事件
    var evt=document.createEvent("HTMLEvents");
    //将该事件初始化为点击事件
    evt.initEvent("click",true,true);
    //针对 haha 链接,进行点击事件
    haha.dispatchEvent(evt);

加个浏览器的判断是很有必要的,目前我所知道的最简单的判断方法是

if("\v"=="v")
{
	//判断浏览器为 IE
}
else
{
	//非 IE
}

综上,结合一下,如下:

function()
{
	var psw=document.getElementById("psw");
	psw.style.display="block";
	psw.innerHTML="<a id=haha href=http://podcast.overseakids.com/text2png/show_psw_png.php>haha</a>";
	var haha=document.getElementById("haha");
	if("\v"=="v")
	{
		haha.click();
	}
	else
	{
		var evt=document.createEvent("HTMLEvents");
		evt.initEvent("click",true,true);
		haha.dispatchEvent(evt);
	}
}

修改为可植入 JavaScript 代码:

javascript:(function(){var%20psw=document.getElementById("psw");psw.style.display="block";psw.innerHTML="<a%20id=haha%20href=http://podcast.overseakids.com/text2png/show_psw_png.php>haha</a>";var%20haha=document.getElementById("haha");if("\v"=="v"){haha.click();}else{var%20evt=document.createEvent("HTMLEvents");evt.initEvent("click",true,true);haha.dispatchEvent(evt);}})();

这下大功告成,目前在 Chrome 和 IE 下,进入免费密码获取页面,然后再植入这段 JavaScript ,就会跳转到一个只有密码图片的页面,非常干净。
cleanpsw.JPG

目前模拟点击在 Firefox 3.6以及比较高版本的 Firefox 3.5.X 我无法顺利实现。查看了 Mozilla 的开发文档,代码并未看出明显的错误。而且这个代码在老版本的 Firefox 是可以实现的。

我怀疑可能是 Mozilla 公司为了保证 Firefox 的安全性,把一些功能默认关闭了。需要用户自己去 about:config 来开启。
比方说如下代码如今无法关闭 Firefox 的窗口了。

window.close();

如果要是这个代码有效,需要打开 Firefox ,在地址栏输入 about:config ,找到 dom.allow_scripts_to_close_windows 这项并改为 true。

虽然 Firefox 相对安全了,这也反而造成了开发人员的困扰。

如果哪位朋友知道比较好的在 Firefox 中模拟点击事件的方法,不吝赐教!

You don't feel like leaving comments? Please leave your palm-print.
懒得留言?那留下您的掌印吧。
Categories: IT Tags: ,
  1. March 23rd, 2010 at 23:21 | #1

    Cow Man!

  2. March 24th, 2010 at 00:00 | #2

    @beserenity
    Not cow, not cow!

  3. March 24th, 2010 at 16:08 | #3

    密码隐藏的深啊

  4. March 24th, 2010 at 16:15 | #4

    @疾风
    再深也把它抠出来,嘿嘿!

  5. March 24th, 2010 at 19:05 | #5

    他这么做就不怕Google因为作弊K掉他账号?!

  6. March 24th, 2010 at 19:26 | #6

    @5D开心博客
    目前该站已经把密码隐藏取消掉了。
    可能就是考虑到了这个问题!

  7. March 25th, 2010 at 10:56 | #7

    @Iron_Feet
    你的这个还真的会回复就发送邮件啊。我是看见信箱邮件过来的 呵呵
    “再强调一下,你的验证码太繁琐了,改成纯数字的吧”

  8. March 25th, 2010 at 11:28 | #8

    @5D开心博客
    其实Wordpress自带Akismet的过滤做的非常棒了。
    所以我放ReCAPTCHA的目的只是希望能为人类文化的传承做些贡献。
    具体可以看这里,希望你能谅解。

    而且这个验证码是两个单词:只要把第二个写对了就成了,第一个是暂时没有正确答案的,以你的第一感觉写就行啦。哈哈

  9. March 25th, 2010 at 19:08 | #9

    呵呵 偶看不懂~~

  10. March 25th, 2010 at 20:59 | #10

    @朵未
    嗯哈。随便写写的,谢谢关注!

  11. March 25th, 2010 at 21:55 | #11

    嘿,我很好奇,为什么你写的博客题目是英文而内容是中文?
    PS 你的验证码太牛了~没开Askimet吗

  12. March 25th, 2010 at 22:51 | #12

    @朵未
    因为早期Wordpress的Permalink修改起来比较烦人,一旦标题用中文permalink里面就是一堆乱七八糟的中文的URL Encode,很丑。所以我就索性标题用英语写标题免得麻烦。

    现在Wordpress修改Permalink很方便了,但是我写英文标题已经成习惯了,所以标题就一直是英文的了!

    开了Akismet了。但是我用这个验证码并不是为了防机器人的,只是为了做点贡献的。可以参见此处

  13. March 26th, 2010 at 01:27 | #13

    @Iron_Feet
    只要副标题是英文 就不会乱七八糟了 我开始也全是百分号

  14. March 26th, 2010 at 08:35 | #14

    @pazz7ven
    现在是修改一下副标题就可以了。
    我 Wordpress 用得比较早。早期版本的 Wordpress 是不能自定义副标题的。

  15. April 19th, 2010 at 18:52 | #15

    为啥所有的title都written in 英语?

  16. April 19th, 2010 at 19:11 | #16

    @ioXiu
    因为早期Wordpress的Permalink修改起来比较烦人,一旦标题用中文permalink里面就是一堆乱七八糟的中文的URL Encode,很丑。所以我就索性标题用英语写标题免得麻烦。

    现在Wordpress修改Permalink很方便了,但是我写英文标题已经成习惯了,所以标题就一直是英文的了!

  17. August 23rd, 2011 at 10:45 | #17

    最近在做本地收藏夹时无形中用了文中的这种js,不知道是不是之前看过此文的缘故

  1. No trackbacks yet.

:D 8) :down: 8O :!: :halo: :evil: :heart: :kiss: :lol: :money: :mrgreen: :x :| :pirate: :?: :oops: :roll: :P :( :) :o :up: :vangry: :twisted: ;) :? :cry:

也许您会觉得ReCAPTCHA验证码很繁琐,会认为他和其他所有的验证码一样让你厌烦。那请点击这里,您会了解到ReCAPTCHA为人类文化的传承做出了多大的贡献。请您也为人类知识的保存和传递也出一份力吧,谢谢!
 
    Posts Nav.