知识点
这里先简单说明3个知识点,了解后,能够让大家更好的理解演示流程。
HTTP(超文本传输协议)是互联网核心应用层协议,基于 TCP/IP,用于客户端与服务器间传输数据。采用请求 - 响应模式:客户端发起请求。
HTTP 代理程序是客户端与目标服务器间的中间服务,接收客户端 HTTP 请求后转发至目标服务器,再将服务器响应回传给客户端。可实现隐藏客户端 IP、缓存数据提速、过滤内容、突破访问限制等功能,是网络请求转发与管控的常用工具。
HTTP 劫持是利用 HTTP 明文传输特性,在数据传输路径中,由中间节点(如代理、路由器等)对 HTTP 数据进行非法拦截、篡改或注入的行为,常见表现为插入广告、强制跳转、窃取信息等,因 HTTP 无加密机制,易被中间节点干预,危害用户体验与安全。
下面将演示下HTTP劫持流程,和关键逻辑。
演示流程
这里我使用C++ Qt框架,创建了一个HTTP代理服务器,程序运行截图如下:
程序结构如下:
HttpProxy/
├── HttpProxy.pro # 项目工程文件(qmake/makefile配置)
├── Headers/ # 头文件目录
│ └── http_proxy_server.h # 代理服务器类头文件
└── Sources/ # 源文件目录
├── http_proxy_server.cpp # 代理服务器类实现文件
└── main.cpp # 程序入口文件
此文章不涉及完整的代码,但在最后会说明关键逻辑。有兴趣的小伙伴可以直接留言等交流。整体流程如下:
详细过程:
① chrome浏览器正常访问站点
② 运行代理程序
② Chrome浏览器配置代理信息
③ 重新访问站点后,发现主页被劫持
此时也看下C++后台打印信息
从中可以看到数据从代理服务器中被流过时,被修改了。
关键逻辑
此代码为示例代码,逻辑简单,关键就是在数据转发时回修改后的数据即可。
具体代码如下。
转发逻辑:
void HttpProxyWorker::onServerReadyRead()
{
if (m_clientSocket->state() == QAbstractSocket::ConnectedState) {
//转发的关键
if(!m_isHack){
m_isHack = true;
hackIndex();
}
// QByteArray data = m_serverSocket->readAll();
// m_clientSocket->write(data);
}
}
正常发送目标站点逻辑:
void HttpProxyWorker::onServerConnected()
{
qDebug() << "Connected to" << m_targetHost << ":" << m_targetPort;
// HTTP隧道
m_serverSocket->write(m_requestData);
}
在此,有小伙伴就会问了,那HTTPS呢?会不会也被劫持。
答案是会的,但存在一定的条件,才能被劫持。这些条件在一般情况下比较难达成。总结起来就是需要破坏证书信任链。要想达到这一步比较难。关键在于“证书信任”, Charles、Fiddler这些知名软件都是这么干的。后面将出个文章详细说明。