程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP-SOCKETS初步編程

PHP-SOCKETS初步編程

編輯:關於PHP編程

作者:darkness[bst]

msn:cqxy[at]21cn.net

學習php2個月了,收獲挺多.但是與別人不同的是,我更喜歡socket.php在socket這方面的文章太少了.所以決定寫一系列php-socket讀書筆記.一直從最基本寫到socket_raw.
實例+心得.實例將會有端口轉發(突破防火牆),動網類型exp,端口掃描,php後門,發包型exp框架.由於學習緣故,每周只能寫一篇.現給出卷一.希望大家一起投入到php shell編程中來.


前言:

php是世界上最流行的腳本語言之一。一直以來它在web編程中得到極廣泛的應用。我想說的是php不僅在web方面出色,在shell方面同樣出色。只是人們更習慣用perl來編寫shell腳本.這裡申明一下,本人不是php高手,接觸php不過幾個星期,這只是一篇讀書筆記。有錯誤的地方請提出來。也可以給我mail,共同探討php。

前置知識:

php最吸引我的地方就是sockets 擴展,事實上我會簡單的vb winsock,完全能用vb寫一個常用的winsock程序出來。但是我還是選擇了php。因為它是跨平台的。

php默認是不支持高級socket的,只支持被“封裝”的fsockopen等幾個函數。socket作為php的擴展,需要設置一下才能使其支持。在windows需要設置php。ini,在php。ini找;windows extensions這一行,去掉;extension=php_sockets.dll 前面的分號。that‘s ok。*nix下則需要在編譯的時候加入-enable—sockets命令。在沒有使用dl()函數的時候,你的php必須和在同一目錄php_sockets.dll。好了,完成php socket配置了。

下面就是運行的問題了

在終端下運行php腳本很簡單。windows下c:phpphp.exe ╟q test.php,*nix下要在php文件事先申明由php來執行,就像perl一樣。像#!/usr/local/bin/php ╟q .,然後再來個./test.php。參數q的意思就是不輸出php標頭信息。

輸入參數問題:

有的人說,php shell如何輸入參數。在web的時候可以這樣輸入參數http://xxx.com/aa.php?參數1=xxxx&參數2=ssssss。沒關系php同perl一樣,具有相似的參數功能。來看官方的描述

“argv”

傳遞給該腳本的參數。當腳本運行在命令行方式時,argv 變量傳遞給程序 c 語言樣式的命令行參數。當調用 get 方法時,該變量包含請求的數據。

“argc”

包含傳遞給程序的命令行參數的個數(如果運行在命令行模式)。



呵呵,簡單的說。看我舉個例子



以下是代碼:

[ctrl+a 全部選擇]


我想你應該看懂了哦,這裡argc[0]是指的程序本身。也可以這樣來.

print(%s,$argv[1]);
 

花中午在網吧的1個小時寫下這一小段


前面一段談到命令行方式的運行。更多請參照
http://www.php.net/manual/zh/features.commandline.php


1.fopen的應用
fopen也可以被稱作被封裝的socket函數。不僅用於文件讀寫,還可以用於socket。fopen相當於其他高級語言的inet控件/類,較於fsockopen,他對於url的操作更高級。

fopen的使用方法
$s = fopen ($url, mode);
fopen的mode屬性:
mode 說明
r 只讀方式打開,將文件指針指向文件頭。
r+ 讀寫方式打開,將文件指針指向文件頭。
w 寫入方式打開,將文件指針指向文件頭並將文件大小截為零。如果文件不存在則嘗試創建之。
w+ 讀寫方式打開,將文件指針指向文件頭並將文件大小截為零。如果文件不存在則嘗試創建之。
a 寫入方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創建之。
a+ 讀寫方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創建之。
x 創建並以寫入方式打開,將文件指針指向文件頭。如果文件已存在,則 fopen() 調用失敗並返回 false,並生成一條 e_warning 級別的錯誤信息。如果文件不存在則嘗試創建之。這和給 底層的 open(2) 系統調用指定 o_excl|o_creat 標記是等價的。此選項被 php 4.3.2 以及以後的版本所支持,僅能用於本地文件。
x+ 創建並以讀寫方式打開,將文件指針指向文件頭。如果文件已存在,則 fopen() 調用失敗並返回 false,並生成一條 e_warning 級別的錯誤信息。如果文件不存在則嘗試創建之。這和給 底層的 open(2) 系統調用指定 o_excl|o_creat 標記是等價的。此選項被 php 4.3.2 以及以後的版本所支持,僅能用於本地文件。


即用於本地文件的操作,也可以用於inet。是不是很kool?
假如要測試一個站的iis目錄是不是有寫權限。
可以這樣寫
$s = fopen("http://www.bugkidz.org","x+") or die(“不存在寫權限”)
如果存在的話,你可以繼續構造下面的語句。用fwrite 遠程寫入文件。
但是一般的網站都是只讀權限的
$s =fopen("http://www.bugkidz.org/index.php?id=1","r");
這樣就讀入了http://www.bugkidz.org/index.php?id=1的內容,但是還得經過處理才能獲取完整的文件內容
這樣
while (!feof($s)) {
echo fgets($s, 1024);
}
我認為fopen用於sql injection是最方便不過的了。
function phpinet($url)
{
fopen($url,"r") or die("打開url錯誤");


while (!feof($s)) {
$cahe = fgets($s, 1024);
}

retrun $cahe;
fclose($s)
}


這段函數等同於vb中的inet.openurl
fsockopen族函數的使用
fsockopen也是被封裝的一類socket函數.有點類似於VB中的winsock控件.令人遺憾的是它支持主動socket連接,不支持bind,listen等,如果需要實現這些功能,則要使用PHP中的高級socket編程.即便是這樣,fsockopen函數也能滿足大多數的需求.
這樣使用fsockopen
resource fsockopen ( string target, int port [, int errno [, string errstr [, float timeout]]])

例子:
$sock = fsockopen("192.168.0.1",80,$errno,$errstr,30);
前面2個是地址和端口,中間2個是有關錯誤的變量,最後就是timeout設置了.
通常$sock = fsockopen("192.168.0.1",80);這樣即可.
$sock = fsockopen("192.168.0.1",80);這是典型的TCP連接.UDP連接這樣來
$sock = fsockopen("udp://192.168.0.1",53);
用這個來寫一個TFTP的客戶端也是可以的.

fsockopen的應用實例:

實例一,簡單的HTTP會話.

代碼


以下是代碼:

[ctrl+a 全部選擇]

流程一般是這樣的
建立fsockopen 資源,定義發送內容,用fwrite函數或者fputs函數寫入定義內容,一行一行的輸出得到的內容,直到到達文件末尾,fgets函數或者是fread使用.使用fclose關閉建立的fsockopen 資源.
ANGEL寫了一個PHP的端口掃描工具,貼出之
http://www.4ngel.net/article/20.htm

選擇fsockopen 來寫簡單EXP發送框架絕對是個goodidea.becoz its so easy.
看我的PHP上傳漏洞的exp.

代碼


以下是代碼: