打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
使用 WinHttpRequest 伪造 Referer 和cookie

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

日期:2010-08-06,23:32(星期五) 评论:4 分类:前端开发 点击:967

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

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

  1. var url = "http://www.trueloveshop.cn";   
  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);  
保存为 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 对表单的安全性无任何用处。

引用一张著名的漫画,在互联网上,没有人知道你是一条狗。在服务端,没有人知道你是从命令行发送出来的。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
WinHttp.WinHttpRequest.5.1
http://www.cnblogs.com/QLeelulu/archive/2009/...
ajax中get和post的说明及使用与区别
JAVAEE开发之POST/GET提交乱码解决总结
掌控POST(2)
登陆之后取网页cookie | VBA实例教程
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服