使用 js WinHttpRequest 修改伪造 Referer (附实战代码)

 
【转】使用 js WinHttpRequest 修改伪造 Referer (附实战代码)

首先说明,伪造访问来路不是什么光明正大的事情,目的就是为了欺骗服务器。原本以为给 XMLHTTP 对象增加一个 Referer 的header 就可以,结果却没有任何作用,改用 ServerXMLHTTP 也如此。

无意间发现公司内部项目使用的 paypal 扣款程序里面有 WinHttp.WinHttpRequest.5.1 对象,它负责把客户的信用卡信息提交到 paypal 的服务器,看来是一个核心的远程访问方法,google一下发现它居然用可以成功伪造所有 http 请求的 header 信息!下面的代码通过伪造referer 的值,假装从百度首页提交一个表单到指定的 url 去:

  1. var url = "http://www.yourtarget.com";   
  2. var param = "name=david&age=30";   
  3. var obj = new ActiveXObject("WinHttp.WinHttpRequest.5.1");   
  4. obj.Open("POST", url, false);   
  5. obj.Option(4) = 13056;   
  6. obj.Option(6) = false; //false可以不自动跳转,截取服务端返回的302状态。  
  7. obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");   
  8. obj.setRequestHeader("Referer", "http://www.baidu.com");   
  9. obj.Send(param);   
  10. WScript.Echo(obj.responseText);  
var url = "http://www.yourtarget.com";
var param = "name=david&age=30";
var obj = new ActiveXObject("WinHttp.WinHttpRequest.5.1");
obj.Open("POST", url, false);
obj.Option(4) = 13056;
obj.Option(6) = false; //false可以不自动跳转,截取服务端返回的302状态。
obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
obj.setRequestHeader("Referer", "http://www.baidu.com");
obj.Send(param);
WScript.Echo(obj.responseText);
保存为 xxx.js 文件,在命令行中运行 cscript.exe xxx.js。

从msdn得知,WinHttp.WinHttpRequest.5.1 是 msxml 4.0 的底层对象,也就是说 XMLHTTP/ServerXMLHTTP 也是在它的基础上封装而来。用 WinHttpRequest 发的请求,连Fiddler 也监测不到,看来确实是比较底层的东西。

--------------------------- 邪恶的分割线------------------------

既然可以用它来伪造所有 http 请求的 header,那 Cookies、Sessionid 自然也就可以得到并传递了。下面是实战代码,用命令行登录博客园,共三次请求,第一次请求获取表单的 VIEWSTATE 和 EVENTVALIDATION,第二次带账户登录,第三次带Cookie访问其首页:

  1. //封装成远程访问的函数   
  2. function RemoteCall(method, url, param, header){   
  3.     var obj = new ActiveXObject("WinHttp.WinHttpRequest.5.1");   
  4.     obj.Open(method||"GET", url, false);   
  5.     obj.Option(4) = 13056;   
  6.     obj.Option(6) = false;   
  7.     if(method=="POST"){   
  8.         obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");   
  9.     }   
  10.     if(header){   
  11.         for(var key in header){   
  12.             if(key=="Cookie"){//根据 MSDN 的建议,设置Cookie前,先设置一个无用的值  
  13.                 obj.setRequestHeader("Cookie", "string");   
  14.             }   
  15.             obj.setRequestHeader(key, header[key]);   
  16.         }   
  17.     }   
  18.     obj.Send(param);   
  19.     return obj;   
  20. }   
  21. //第一次远程访问博客园的登录入口   
  22. var url = "http://passport.cnblogs.com/login.aspx";   
  23. var objFirst = RemoteCall("GET", url, null);   
  24.   
  25. //取得 viewstate 与 eventvalidation   
  26. var viewstate = objFirst.responseText.match(/id="__VIEWSTATE" value="(.*?)" \/>/)[1];   
  27. var eventvalidation = objFirst.responseText.match(/id="__EVENTVALIDATION" value="(.*?)" \/>/)[1];   
  28.   
  29. //输入自己的账户与密码   
  30. var username = "";   
  31. var password = "";   
  32. var param = ""  
  33. + "__VIEWSTATE="+encodeURIComponent(viewstate)    
  34. + "&__EVENTVALIDATION="+encodeURIComponent(eventvalidation)    
  35. + "&tbUserName="+username   
  36. + "&tbPassword="+password   
  37. + "&btnLogin="+encodeURIComponent("登  录");   
  38.   
  39. var objSecond = RemoteCall("POST", url, param);   
  40.   
  41. //登录成功后服务器执行 Response.Redirect 跳转,即向客户端发送了 302 状态代码   
  42. WScript.Echo(objSecond.status); //302即登录成功, 如果是200,则登录失败,页面没有跳转  
  43.   
  44. //带上登录成功后的cookie,再次访问其首页   
  45. var json = {"Cookie": objSecond.getResponseHeader("Set-Cookie")};   
  46. var objThird = RemoteCall("GET", "http://www.cnblogs.com", null, json);   
  47. WScript.Echo(objThird.responseText);  

上面的代码其实已经有一定恶意,我只为证明使用 WinHttpRequest 确实可以模拟浏览器发送请求,服务端也无法区别是从浏览器来的,还是从命令行来的。这证明到一点,从客户端提交来的任何数据都不可信,因为发送的 http 数据包不但表单值可以修改,连数据包的header都可以随意修改。同时也说明,使用 VIEWSTATE 对表单的安全性无任何用处。

在互联网上,没有人知道你是一条狗。在服务端,没有人知道你是从命令行发送出来

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值