2008/06/19 老文章
作者:云舒
来源:心路
前几天刺在我们的maillist发了一个老外写的文章,大意是可以用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里面,没有多线程也没有多进程,但 是每一个新连接进来就要去处理,应该怎么做?显然不能顺序执行,因为光accept那里就会被阻塞住的,而且后面每一个session也需要分别处理的。 还好查手册发现经典的socket_select函数可用,有这个就好说了,专业实现多路复用的。
PHP代码如下,有详细注释。blog贴的,所以代码可能会掉些东西,其他的支持我就不提供了,看代码:
以下是引用片段:
// 构造函数 foreach($sockets as $socket) function add($add_socket) // 利用临时数组来删除数组中的元素 foreach($this->sockets as $socket) $this->sockets = $tmp_sockets; // 检查socket数组是否可读,传入超时时间,返回socket数组 // 检查socket数组是否可写,传入超时时间,返回socket数组 // 网页不超时 // 即时输出数据,不缓冲 if( !isset($_GET["listen_ip"]) ) $listen_ip = $_GET["listen_ip"]; // 建立socket // 设置重复绑定 // 明确指定绑定IP地址,优先获取数据 // 开始监听 echo "listen on ".htmlentities($listen_ip)." :".$listen_port." // 创建socket数组,使用select来轮询 // 映射客户端socket和服务端socket // 实例化select类 while(true) socket_getpeername($new_client, $ip, $port); // 建立到真实服务器的socket // 建立真实服务器socket和真实客户端socket之间的映射关系 // 添加到select轮询中 // $listen_sock的可读数据是因为有新连接,已经处理了。暂时去掉,因为下面开始处理数据转发 // 其他socket可读,表示有数据需要中转 continue; // 如果socket在$socket_maps1的key中,说明是从客户端读到了数据 ?> |
这个东西有什么作用?自由发挥。也许你有一个webshell,但是却想知道同一个服务器上面别人网站的密码……我是在windows xp+apache测试的,据我所知windows2003默认已经不准重复绑定端口了。
文章来源于lcx.cc:利用php来嗅探劫持服务器数据
相关推荐: DefCon's Ninja Tel pirate cell phone network
DefCon's Ninja Tel pirate cell phone network DefCon's Ninja Tel pirate cell phone network,DEFCON 忍者 GSM 网络 (视频)。 这是DEFCON 忍者 GSM 网…
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论