PHP Security-Shell RFI Scanner

  1. <?php  
  2. /*************************************************************************** 
  3.  *   PHP Security-Shell RFI scanner                                        * 
  4.  *                                                                         * 
  5.  *   Copyright (C) 2007 by pentest                                         * 
  6.  *                                                                         * 
  7.  *   http://security-shell.uni.cc                                          * 
  8.  *                                                                         * 
  9.  *   This program is free software; you can redistribute it and/or modify  * 
  10.  *   it under the terms of the GNU General Public License as published by  * 
  11.  *   the Free Software Foundation; either version 2 of the License, or     * 
  12.  *   (at your option) any later version.                                   * 
  13.  *                                                                         * 
  14.  *   This program is distributed in the hope that it will be useful,       * 
  15.  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        * 
  16.  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         * 
  17.  *   GNU General Public License for more details.                          *  
  18.  ***************************************************************************/  
  19.      
  20.     $escan_inc_regex   = array'/include(_once)?.\$/ix''/require(_once)?.\$/ix' );  
  21.     /* Regex to extract the names of variables */  
  22.     $escan_var_regex   = array'/\Ainclude(_once)?./is''/\Arequire(_once)?./is' );  
  23.     /* Array of file extensions to scan */  
  24.     $escan_valid_ext   = array'php' );  
  25.     /* Maximum size of a file to scan, scans all if 0 */  
  26.     $escan_max_size    = 0;  
  27.     /* Counter crawled directory */  
  28.     $escan_dir_count   = 0;  
  29.     /* Perpetual scanned files */  
  30.     $escan_file_count  = 0;  
  31.     /* Perpetual potential rfi found */  
  32.     $escan_match_count = 0;  
  33.     /*Perpetual crawled total bytes */  
  34.     $escan_byte_count  = 0;  
  35.   
  36.     escan_banner();  
  37.   
  38.   
  39.     if$argc < 2 ){  
  40.         escan_usage($argv[0]);  
  41.     }  
  42.     else{     
  43.   
  44.         $stime = escan_get_mtime();  
  45.   
  46.         escan_recurse_dir( realpath($argv[1]).DIRECTORY_SEPARATOR );  
  47.   
  48.         $etime = escan_get_mtime();  
  49.   
  50.         print "\n@ Scan report : \n\n" .  
  51.               "\t$escan_dir_count directory .\n".  
  52.               "\t$escan_file_count file .\n".  
  53.               "\t" . escan_format_size($escan_byte_count) . " .\n".  
  54.               "\t$escan_match_count Potential RFI .\n".  
  55.               "\t".($etime-$stime) . " Second Processing .\n\n";  
  56.     }  
  57.   
  58.     /* A string formats in a magnitude expressed in bytes */  
  59.     function escan_format_size($bytes)  
  60.     {  
  61.         if$bytes < 1024       ) return "$bytes bytes";  
  62.         if$bytes < 1048576    ) return ($bytes / 1024) . " Kb";  
  63.         if$bytes < 1073741824 ) return ($bytes / 1048576) . " Mb";  
  64.          
  65.         return ($bytes / 1073741824) . " Gb";  
  66.     }  
  67.      
  68.     /* Returns the timestamp in seconds */  
  69.     function escan_get_mtime()  
  70.     {  
  71.         list($usec$sec) = explode(" ",microtime());  
  72.         return ((float)$usec + (float)$sec);  
  73.     }  
  74.   
  75.     /* Extracts line of code inclusion */  
  76.     function escan_scan_line($content,$offset)  
  77.     {  
  78.         list( $line$dummy ) = explode";" , substr($content,$offset,strlen($content)) );  
  79.          
  80.         return $line.";";  
  81.     }  
  82.   
  83.     /* Extract the variable name from line of code inclusion */  
  84.     function escan_parse_var( $line$regex_id )  
  85.     {  
  86.         global $escan_var_regex;  
  87.          
  88.         $vars       = preg_split($escan_var_regex[$regex_id],$line);  
  89.         $varname    = $vars[1];  
  90.         $delimiters = " .);";  
  91.   
  92.         for$i = 0; $i < strlen($varname); $i++ ){  
  93.             for$j = 0; $j < strlen($delimiters); $j++ ){  
  94.                 if($varname[$i] == $delimiters[$j]){  
  95.                     return substr$varname, 0, $i );  
  96.                 }  
  97.             }  
  98.         }  
  99.   
  100.         return $varname;  
  101.     }  
  102.   
  103.     /* Check if the variable $var is defined in $content before position $offset*/  
  104.     function escan_check_definitions($content,$offset,$var)  
  105.     {  
  106.         ifstrpos$var"->" ) ){  
  107.             return 1;  
  108.         }  
  109.   
  110.         $chunk = substr($content,0,$offset);  
  111.         $regex = "/".preg_quote($var,"/")."\s*=/ix";  
  112.         preg_match( $regex$chunk,$matches );  
  113.   
  114.         return count($matches);  
  115.     }  
  116.   
  117.     /* $file the file to check for potential rfi */  
  118.     function escan_parse_file($file)     
  119.     {  
  120.         global $escan_inc_regex;         
  121.         global $escan_max_size;  
  122.         global $escan_file_count;  
  123.         global $escan_match_count;  
  124.         global $escan_byte_count;  
  125.   
  126.         $fsize = filesize($file);  
  127.   
  128.         if$escan_max_size && $fsize > $escan_max_size ) return;  
  129.   
  130.         $escan_file_count++;  
  131.         $escan_byte_count += $fsize;  
  132.   
  133.         $content = @file_get_contents($file);  
  134.   
  135.         for$i = 0; $i < count($escan_inc_regex); $i++ ){  
  136.             if( preg_match_all( $escan_inc_regex[$i], $content$matches, PREG_OFFSET_CAPTURE ) ){         
  137.                  
  138.                 $nmatch = count($matches[0]);  
  139.   
  140.                 for$j = 0; $j < $nmatch$j++ ){  
  141.                     $offset = $matches[0][$j][1];  
  142.                     $line   = escan_scan_line($content,$offset);  
  143.                     $var    = escan_parse_var($line,$i);  
  144.                      
  145.                     if( escan_check_definitions($content,$offset,$var) == 0 )  
  146.                     {  
  147.                         $escan_match_count++;  
  148.                         print "@ $file - \n\t- '$var' The position $offset .\n";  
  149.                     }  
  150.                 }  
  151.             }  
  152.         }  
  153.     }  
  154.      
  155.     /* Returns the file extension $fname */  
  156.     function escan_get_file_ext($fname)  
  157.     {  
  158.         ifstrchr($fname,'.') ){  
  159.             return substr($fname,strrpos($fname,'.')+1);  
  160.         }  
  161.         else{  
  162.             return "";  
  163.         }  
  164.     }  
  165.   
  166.     /* Check if file $fname is a valid extension */  
  167.     function escan_isvalid_ext($fname)  
  168.     {  
  169.         global $escan_valid_ext;  
  170.   
  171.         for$i = 0; $i < count($escan_valid_ext); $i++ ){  
  172.             if(strstr(escan_get_file_ext($fname),$escan_valid_ext[$i])){  
  173.                 return true;  
  174.             }  
  175.         }  
  176.   
  177.         return false;  
  178.     }  
  179.   
  180.     /* That function scans directories recursively */  
  181.     function escan_recurse_dir($dir)  
  182.     {           
  183.         global $escan_dir_count;  
  184.          
  185.         $escan_dir_count++;  
  186.   
  187.         if$cdir = @dir($dir) ){  
  188.             while$entry = $cdir->read() ){  
  189.                 if$entry != '.' && $entry != '..' ){  
  190.                     ifis_dir($dir.$entry) ){  
  191.                         escan_recurse_dir($dir.$entry.DIRECTORY_SEPARATOR);  
  192.                     }  
  193.                     else{  
  194.                         if( escan_isvalid_ext($dir.$entry) ){  
  195.                             escan_parse_file($dir.$entry);  
  196.                         }  
  197.                     }         
  198.                 }  
  199.             }  
  200.      
  201.             $cdir->close();  
  202.         }  
  203.     }  
  204.   
  205.     function escan_banner()  
  206.     {  
  207.         print "*-----------------------------------------------------*\n" .  
  208.               "*   PHP Security-Shell RFI Scanner v1.0  by pentest   *\n" .  
  209.               "*                                                     *\n" .  
  210.               "*             http://security-shell.uni.cc            *\n" .  
  211.               "*-----------------------------------------------------*\n\n";  
  212.     }  
  213.      
  214.     function escan_usage($pname)  
  215.     {  
  216.         print "Use : php $pname <dir>\n";  
  217.     }     
  218. ?>

关键词: scanner , 代码收藏 , php

上一篇: 上演社工
下一篇: 代理中的“中间人”攻击

相关文章
访客评论
#1
回复 meister 2007-11-18, 20:08:32
我的博客刚开播,想跟贵站点做个交换连接
博客名:小迈's Blog
URL:http://www.color-wolf.com
贵站点连接已做好!
发表评论

评论内容 (必填):