请选择 进入手机版 | 继续访问电脑版

Silic Group Hacker Forum

 找回密码
 Join Us
搜索
查看: 158|回复: 2

[代码] ZIP在线解压程序 - php [复制链接]

管理员

Silic Admin

Rank: 12Rank: 12

发表于 2012-1-28 02:48:31 |显示全部楼层
程序预览:



程序代码:
  1. <?php
  2. //此处为操作密码
  3. $password = "123456";
  4. ?>
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  8. <title>ZIP解压程序</title>
  9. <style type="text/css">
  10. body,td{font-size: 14px;color: #000000;}
  11. a{color: #000066;text-decoration: none;}
  12. a:hover {color: #FF6600;text-decoration: underline;}
  13. </style>
  14. </head>
  15. <body>
  16. <form name="myform" method="post" action="<?=$_SERVER[PHP_SELF];?>" enctype="multipart/form-data" onSubmit="return check_uploadObject(this);">
  17. <?
  18.         if(!$_REQUEST["myaction"]):
  19. ?>
  20. <script language="javascript">
  21. function check_uploadObject(form){
  22.         if(form.password.value==''){
  23.                 alert('请输入密码.');
  24.                 return false;
  25.         }
  26. return true;
  27. }
  28. </script>
  29. <table width="100%" border="0" cellspacing="0" cellpadding="4">
  30.   <tr><td height="40" colspan="2">ZIP在线解压</td></tr>
  31.   <tr><td width="11%">选择ZIP文件: </td>
  32.       <td width="89%"><select name="zipfile">
  33.         <option value="" selected>- 请选择 -</option>
  34. <?
  35. $fdir = opendir('./');
  36. while($file=readdir($fdir)){
  37.         if(!is_file($file)) continue;
  38.         if(preg_match('/\.zip$/mis',$file)){
  39.                 echo "<option value='$file'>$file</option>\r\n";
  40.         }
  41. }?>
  42.   </select></td></tr>
  43.   <tr><td width="11%" nowrap>或上传文件:</td><td width="89%"><input name="upfile" type="file" id="upfile" size="20"></td></tr>
  44.         <tr><td>解压到目录: </td><td><input name="todir" type="text" id="todir" value="__unzipfiles__" size="15">(留空为本目录,必须有写入权限)</td></tr>
  45.         <tr><td>操作密码: </td><td><input name="password" type="password" id="password" size="15">(源文件中设定的密码)</td></tr>
  46.   <tr><td><input name="myaction" type="hidden" id="myaction" value="dounzip"></td><td><input type="submit" name="Submit" value="解压"></td></tr>
  47. </table>
  48. <?
  49. elseif($_REQUEST["myaction"]=="dounzip"):
  50. class zip
  51. {
  52. var $total_files = 0;
  53. var $total_folders = 0;
  54. function Extract ( $zn, $to, $index = Array(-1) )
  55. {
  56.   $ok = 0; $zip = @fopen($zn,'rb');
  57.   if(!$zip) return(-1);
  58.   $cdir = $this->ReadCentralDir($zip,$zn);
  59.   $pos_entry = $cdir['offset'];
  60.   if(!is_array($index)){ $index = array($index);  }
  61.   for($i=0; $index[$i];$i++){
  62.   if(intval($index[$i])!=$index[$i]||$index[$i]>$cdir['entries'])
  63.         return(-1);
  64.   }
  65.   for ($i=0; $i<$cdir['entries']; $i++)
  66.   {
  67.    @fseek($zip, $pos_entry);
  68.    $header = $this->ReadCentralFileHeaders($zip);
  69.    $header['index'] = $i; $pos_entry = ftell($zip);
  70.    @rewind($zip); fseek($zip, $header['offset']);
  71.    if(in_array("-1",$index)||in_array($i,$index))
  72.    $stat[$header['filename']]=$this->ExtractFile($header, $to, $zip);
  73.   }
  74. fclose($zip);
  75. return $stat;
  76. }
  77. function ReadFileHeader($zip)
  78.   {
  79.     $binary_data = fread($zip, 30);
  80.     $data = unpack('vchk/vid/vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $binary_data);
  81.     $header['filename'] = fread($zip, $data['filename_len']);
  82.     if ($data['extra_len'] != 0) {
  83.       $header['extra'] = fread($zip, $data['extra_len']);
  84.     } else { $header['extra'] = ''; }
  85.     $header['compression'] = $data['compression'];$header['size'] = $data['size'];
  86.     $header['compressed_size'] = $data['compressed_size'];
  87.     $header['crc'] = $data['crc']; $header['flag'] = $data['flag'];
  88.     $header['mdate'] = $data['mdate'];$header['mtime'] = $data['mtime'];
  89.     if ($header['mdate'] && $header['mtime']){
  90.      $hour=($header['mtime']&0xF800)>>11;$minute=($header['mtime']&0x07E0)>>5;
  91.      $seconde=($header['mtime']&0x001F)*2;$year=(($header['mdate']&0xFE00)>>9)+1980;
  92.      $month=($header['mdate']&0x01E0)>>5;$day=$header['mdate']&0x001F;
  93.      $header['mtime'] = mktime($hour, $minute, $seconde, $month, $day, $year);
  94.     }else{$header['mtime'] = time();}

  95.     $header['stored_filename'] = $header['filename'];
  96.     $header['status'] = "ok";
  97.     return $header;
  98.   }
  99. function ReadCentralFileHeaders($zip){
  100.     $binary_data = fread($zip, 46);
  101.     $header = unpack('vchkid/vid/vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $binary_data);

  102.     if ($header['filename_len'] != 0)
  103.       $header['filename'] = fread($zip,$header['filename_len']);
  104.     else $header['filename'] = '';

  105.     if ($header['extra_len'] != 0)
  106.       $header['extra'] = fread($zip, $header['extra_len']);
  107.     else $header['extra'] = '';

  108.     if ($header['comment_len'] != 0)
  109.       $header['comment'] = fread($zip, $header['comment_len']);
  110.     else $header['comment'] = '';

  111.     if ($header['mdate'] && $header['mtime'])
  112.     {
  113.       $hour = ($header['mtime'] & 0xF800) >> 11;
  114.       $minute = ($header['mtime'] & 0x07E0) >> 5;
  115.       $seconde = ($header['mtime'] & 0x001F)*2;
  116.       $year = (($header['mdate'] & 0xFE00) >> 9) + 1980;
  117.       $month = ($header['mdate'] & 0x01E0) >> 5;
  118.       $day = $header['mdate'] & 0x001F;
  119.       $header['mtime'] = mktime($hour, $minute, $seconde, $month, $day, $year);
  120.     } else {
  121.       $header['mtime'] = time();
  122.     }
  123.     $header['stored_filename'] = $header['filename'];
  124.     $header['status'] = 'ok';
  125.     if (substr($header['filename'], -1) == '/')
  126.       $header['external'] = 0x41FF0010;
  127.     return $header;
  128. }
  129. function ReadCentralDir($zip,$zip_name){
  130.         $size = filesize($zip_name);
  131.         if ($size < 277) $maximum_size = $size;
  132.         else $maximum_size=277;
  133.         @fseek($zip, $size-$maximum_size);
  134.         $pos = ftell($zip); $bytes = 0x00000000;
  135.         while ($pos < $size){
  136.                 $byte = @fread($zip, 1); $bytes=($bytes << 8) | ord($byte);
  137.                 if ($bytes == 0x504b0506 or $bytes == 0x2e706870504b0506){ $pos++;break;} $pos++;
  138.         }
  139.         $fdata=fread($zip,18);
  140.         $data=@unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size',$fdata);
  141.         if ($data['comment_size'] != 0) $centd['comment'] = fread($zip, $data['comment_size']);
  142.         else $centd['comment'] = ''; $centd['entries'] = $data['entries'];
  143.         $centd['disk_entries'] = $data['disk_entries'];
  144.         $centd['offset'] = $data['offset'];$centd['disk_start'] = $data['disk_start'];
  145.         $centd['size'] = $data['size'];  $centd['disk'] = $data['disk'];
  146.         return $centd;
  147.   }
  148. function ExtractFile($header,$to,$zip){
  149.         $header = $this->readfileheader($zip);
  150.         if(substr($to,-1)!="/") $to.="/";
  151.         if($to=='./') $to = '';
  152.         $pth = explode("/",$to.$header['filename']);
  153.         $mydir = '';
  154.         for($i=0;$i<count($pth)-1;$i++){
  155.                 if(!$pth[$i]) continue;
  156.                 $mydir .= $pth[$i]."/";
  157.                 if((!is_dir($mydir) && @mkdir($mydir,0777)) || (($mydir==$to.$header['filename'] || ($mydir==$to && $this->total_folders==0)) && is_dir($mydir)) ){
  158.                         @chmod($mydir,0777);
  159.                         $this->total_folders ++;
  160.                         echo "<input name='dfile[]' type='checkbox' value='$mydir' checked> <a href='$mydir' target='_blank'>目录: $mydir</a><br>";
  161.                 }
  162.         }
  163.         if(strrchr($header['filename'],'/')=='/') return;
  164.         if (!($header['external']==0x41FF0010)&&!($header['external']==16)){
  165.                 if ($header['compression']==0){
  166.                         $fp = @fopen($to.$header['filename'], 'wb');
  167.                         if(!$fp) return(-1);
  168.                         $size = $header['compressed_size'];

  169.                         while ($size != 0){
  170.                                 $read_size = ($size < 2048 ? $size : 2048);
  171.                                 $buffer = fread($zip, $read_size);
  172.                                 $binary_data = pack('a'.$read_size, $buffer);
  173.                                 @fwrite($fp, $binary_data, $read_size);
  174.                                 $size -= $read_size;
  175.                         }
  176.                         fclose($fp);
  177.                         touch($to.$header['filename'], $header['mtime']);
  178.                 }else{
  179.                         $fp = @fopen($to.$header['filename'].'.gz','wb');
  180.                         if(!$fp) return(-1);
  181.                         $binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($header['compression']),
  182.                         Chr(0x00), time(), Chr(0x00), Chr(3));

  183.                         fwrite($fp, $binary_data, 10);
  184.                         $size = $header['compressed_size'];

  185.                         while ($size != 0){
  186.                                 $read_size = ($size < 1024 ? $size : 1024);
  187.                                 $buffer = fread($zip, $read_size);
  188.                                 $binary_data = pack('a'.$read_size, $buffer);
  189.                                 @fwrite($fp, $binary_data, $read_size);
  190.                                 $size -= $read_size;
  191.                         }

  192.                         $binary_data = pack('VV', $header['crc'], $header['size']);
  193.                         fwrite($fp, $binary_data,8); fclose($fp);

  194.                         $gzp = @gzopen($to.$header['filename'].'.gz','rb') or die("Cette archive est compress閑");
  195.                         if(!$gzp) return(-2);
  196.                         $fp = @fopen($to.$header['filename'],'wb');
  197.                         if(!$fp) return(-1);
  198.                         $size = $header['size'];

  199.                         while ($size != 0){
  200.                                 $read_size = ($size < 2048 ? $size : 2048);
  201.                                 $buffer = gzread($gzp, $read_size);
  202.                                 $binary_data = pack('a'.$read_size, $buffer);
  203.                                 @fwrite($fp, $binary_data, $read_size);
  204.                                 $size -= $read_size;
  205.                         }
  206.                         fclose($fp); gzclose($gzp);

  207.                         touch($to.$header['filename'], $header['mtime']);
  208.                         @unlink($to.$header['filename'].'.gz');

  209.                 }
  210.         }
  211.         $this->total_files ++;
  212.         echo "<input name='dfile[]' type='checkbox' value='$to$header[filename]' checked> <a href='$to$header[filename]' target='_blank'>文件: $to$header[filename]</a><br>";
  213.         return true;
  214. }
  215. // end class
  216. }
  217.         set_time_limit(0);
  218.         if ($_POST['password'] != $password) die("输入的密码不正确,请重新输入。");
  219.         if(!$_POST["todir"]) $_POST["todir"] = ".";
  220.         $z = new Zip;
  221.         $have_zip_file = 0;
  222.         function start_unzip($tmp_name,$new_name,$checked){
  223.                 global $_POST,$z,$have_zip_file;
  224.                 $upfile = array("tmp_name"=>$tmp_name,"name"=>$new_name);
  225.                 if(is_file($upfile[tmp_name])){
  226.                         $have_zip_file = 1;
  227.                         echo "<br>正在解压: <input name='dfile[]' type='checkbox' value='$upfile[name]' ".($checked?"checked":"")."> $upfile[name]<br><br>";
  228.                         if(preg_match('/\.zip$/mis',$upfile[name])){
  229.                                 $result=$z->Extract($upfile[tmp_name],$_POST["todir"]);
  230.                                 if($result==-1){
  231.                                         echo "<br>文件 $upfile[name] 错误.<br>";
  232.                                 }
  233.                                 echo "<br>完成,共建立 $z->total_folders 个目录,$z->total_files 个文件.<br><br><br>";
  234.                         }else{
  235.                                 echo "<br>$upfile[name] 不是 zip 文件.<br><br>";
  236.                         }
  237.                         if(realpath($upfile[name])!=realpath($upfile[tmp_name])){
  238.                                 @unlink($upfile[name]);
  239.                                 rename($upfile[tmp_name],$upfile[name]);
  240.                         }
  241.                 }
  242.         }
  243.         clearstatcache();

  244.         start_unzip($_POST["zipfile"],$_POST["zipfile"],0);
  245.         start_unzip($_FILES["upfile"][tmp_name],$_FILES["upfile"][name],1);

  246.         if(!$have_zip_file){
  247.                 echo "<br>请选择或上传文件.<br>";
  248.         }
  249. ?>
  250. <input name="password" type="hidden" id="password" value="<?=$_POST['password'];?>">
  251. <input name="myaction" type="hidden" id="myaction" value="dodelete">
  252. <input name="按钮" type="button" value="返回" onClick="window.location='<?=$_SERVER[PHP_SELF];?>';">
  253. <input type='button' value='反选' onclick='selrev();'> <input type='submit' onclick='return confirm("删除选定文件?");' value='删除选定'>
  254. <script language='javascript'>
  255. function selrev() {
  256.         with(document.myform) {
  257.                 for(i=0;i<elements.length;i++) {
  258.                         thiselm = elements[i];
  259.                         if(thiselm.name.match(/dfile\[]/))        thiselm.checked = !thiselm.checked;
  260.                 }
  261.         }
  262. }
  263. alert('完成.');
  264. </script>
  265. <?
  266. elseif($_REQUEST["myaction"]=="dodelete"):
  267.         set_time_limit(0);
  268.         if ($_POST['password'] != $password) die("输入的密码不正确,请重新输入。");
  269.         $dfile = $_POST["dfile"];
  270.         echo "正在删除文件...<br><br>";
  271.         if(is_array($dfile)){
  272.                 for($i=count($dfile)-1;$i>=0;$i--){
  273.                         if(is_file($dfile[$i])){
  274.                                 if(@unlink($dfile[$i])){
  275.                                         echo "已删除文件: $dfile[$i]<br>";
  276.                                 }else{
  277.                                         echo "删除文件失败: $dfile[$i]<br>";
  278.                                 }
  279.                         }else{
  280.                                 if(@rmdir($dfile[$i])){
  281.                                         echo "已删除目录: $dfile[$i]<br>";
  282.                                 }else{
  283.                                         echo "删除目录失败: $dfile[$i]<br>";
  284.                                 }
  285.                         }

  286.                 }
  287.         }
  288.         echo "<br>完成.<br><br><input type='button' value='返回' onclick=\"window.location='$_SERVER[PHP_SELF]';\"><br><br>
  289.                  <script language='javascript'>('完成.');</script>";
  290. endif;
  291. ?>
  292. </form>
  293. </body>
  294. </html>
复制代码
附件: 你需要登录才可以下载或查看附件。没有帐号?Join Us
思想主导行为

Rank: 1

发表于 2012-1-28 14:53:24 |显示全部楼层
这个。。。。。我上次就是用这个拿下了一个站的webshell。。。。

Rank: 2Rank: 2

发表于 2012-1-29 18:47:03 |显示全部楼层
好东西 收藏了
您需要登录后才可以回帖 登录 | Join Us

Archiver|手机版|计算机文献资料库

GMT+8, 2012-2-23 10:34

© 2009-2012 Silic Group Hacker Army

回顶部