首頁  >  文章  >  後端開發  >  PHP Web木馬掃描器

PHP Web木馬掃描器

WBOY
WBOY原創
2016-07-25 08:42:181874瀏覽
  1. header('content-type:text/html;charset=gbk');
  2. set_time_limit(0);//防止逾時
  3. /**
  4. *
  5. * php目錄掃描監控增強版
  6. *
  7. * @version 1.0
  8. *
  9. 以下幾個變數使用前需要手動設定
  10. *
  11. **/
  12. /*===================== 程式設定================ =======*/
  13. $pass="test";//設定密碼
  14. $jkdir="."; //設定監控掃描的目錄,目前目錄為'.',上一級目錄為'..',也可以設定絕對路徑,後面不要加斜杠,預設為目前目錄
  15. $logfilename="./m.log";//設定儲存log的路徑,可以放置在任意位置
  16. $exclude=array('data','images');//排除目錄
  17. $danger='eval|cmd|passthru|gzuncompress';//設定要查找的危險的函數以確定是否木馬檔案
  18. $suffix='php|inc';//設定要掃描檔案的後綴
  19. /*===================== 設定結束=====================*/
  20. $filename=$_GET['filename'];
  21. $check=$_GET[' check'];
  22. $jumpoff=false;
  23. $url = $_SERVER['PHP_SELF'];
  24. $thisfile = end(explode('/',$url));
  25. $jump ="{$thisfile}|".implode('|',$exclude);
  26. $jkdir_num=$file_num=$danger_num=0;
  27. define('M_PATH',$jkdir);
  28. define>define('M_PATH',$jkdir);
  29. define ('M_LOG',$logfilename);
  30. if ($check=='check')
  31. {
  32. $safearr = explode("|",$jump);
  33. $start_time=microtime( true);
  34. safe_check($jkdir);
  35. $end_time=microtime(true);
  36. $total=$end_time-$start_time;
  37. $file_num=$file_num-$jkdir_num; $message= " 檔案數:".$file_num;
  38. $message.= " 資料夾數:".$jkdir_num;
  39. $message.= " 可疑檔案數:".$danger_num;
  40. $ message.= " 執行時間:".$total;
  41. echo $message;
  42. }else{
  43. if ($_GET['m']=="del") Delete();//處理檔案刪除
  44. //讀取檔案內容
  45. if(isset($_GET['readfile'])){
  46. //輸出檢視密碼,密碼校驗正確以後輸出檔案內容
  47. if( empty($_POST['passchack'])){
  48. echo"
    "
  49. . "
  50. . " "
  51. . "
  52. "
  53. . " "
  54. . "
  55. "
  56. ."";
  57. exit;
  58. }elseif(isset($_POST['passchack'])&&$_POST['passchack']==$ pass){
  59. $code=file_get_contents($_GET['readfile']);
  60. echo"";
  61. exit;
  62. }else{
  63. exit;
  64. }
  65. }else{
  66. record_md5(M_PATH);
  67. if(file_exists(M_LOG)){
  68. $log = unserialize(file_get_contents(M_LOG));
  69. } array();
  70. }
  71. if($_GET['savethis']==1){
  72. //儲存目前檔案md5到日誌檔案
  73. @unlink(M_LOG);
  74. file_put_contents(M_LOG,serialize($file_list));
  75. echo "保存成功!點擊返回";
  76. exit;
  77. }
  78. if(empty($log)){
  79. echo "目前還沒有建立日誌檔案!點選[儲存目前]建立日誌檔! ";
  80. }else{
  81. if($file_list==$log){
  82. echo "本資料夾沒有做過任何改動!";
  83. }else{
  84. if(count($file_list) > 0 ){
  85. foreach($file_list as $file => $md5){
  86. if(!isset($log[$ file])){
  87. echo "新增檔案:".$file.""." 建立時間:".date("Y-m-d H:i:s",filectime($file))." 修改時間:".date("Y-m-d H:i:s",filemtime($file))." 原始碼刪除
    ";
  88. }else{
  89. if($log[$file] != $md5){
  90. echo "修改檔案:".$file." a>"." 建立時間:".date("Y-m-d H:i:s",filectime($file))." 修改時間:".date("Y-m-d H:i:s",filemtime($file) )." 原始碼
    ";
  91. unset($log[$file]);
  92. }else{
  93. unset($log[$file]);
  94. }
  95. }
  96. }
  97. }
  98. if(count($log)>0){
  99. foreach ($log as $file => $md5){
  100. echo "刪除檔案:".$file."
    ";
  101. }
  102. }
  103. }
  104. }
  105. }
  106. }
  107. //計算md5
  108. function record_md5($jkdir){
  109. glo $file1 ,$exclude;
  110. if(is_dir($jkdir)){
  111. $file=scandir($jkdir);
  112. foreach($fileas $f){
  113. if($f!=' .' && $f!='..' && !in_array($f, $exclude)){
  114. $path = $jkdir.'/'.$f;
  115. if(is_dir($path)) {
  116. record_md5($path);
  117. }else{
  118. $file_list[$path]=md5_file($path);
  119. }
  120. }
  121. }
  122. }
  123. }
  124. function Safe_Check($jkdir)//遍歷檔案
  125. {
  126. global $danger ,$suffix ,$jkdir_num ,$file_num ,$danger_num
  127. while ($file=$hand->read())
  128. {
  129. $filename=$jkdir.'/'.$file;
  130. if ( !$jumpoff) {
  131. if(Jump($filename))continue;
  132. }
  133. if(@is_dir($filename) && $file != '.' && $file!= '..' && $file!='./..')
  134. { $jkdir_num ;
  135. Safe_Check($filename);
  136. }
  137. if (preg_match_all ("/.($suffix)/i", $filename,$out))
  138. {
  139. $str='';
  140. $fp = @fopen($filename,'r')or die('沒有權限');
  141. while(!feof($fp))
  142. {
  143. $str .= fgets($fp,1024);
  144. }
  145. fclose($fp);
  146. if( preg_match_all (" /($danger)[ rnt]{0,}([[(])/i",$str,$out))
  147. {
  148. echo "可疑檔案:{$filename}"." 建立時間:".date("Y-m-d H:i:s",filectime($filename))." 修改時間:".date( "Y-m-d H:i:s",filemtime($filename))." 查看程式碼 刪除
    ";
  149. $danger_num ;
  150. }
  151. }
  152. $danger_num ;
  153. }
  154. }
  155. $ file_num ;
  156. }
  157. }
  158. function Edit()//查看可疑檔案
  159. {
  160. global $filename;
  161. $filename = str_replace("..","",$ filename);
  162. $file = $filename;
  163. $content = "";
  164. if(is_file($file))
  165. {
  166. $fp = fopen($file,"r" )or die('沒有權限');
  167. $content = fread($fp,filesize($file));
  168. fclose($fp);
  169. $content = htmlspecialchars($content);
  170. }
  171. echo "rn";
  172. exitititity ();
  173. }
  174. function Delete()//刪除檔案
  175. { global $filename,$pass;
  176. if(empty($_POST['passchack'])){
  177. echo "
    "
  178. . "
  179. . " "
  180. . "
  181. "
  182. . " "
  183. . "
  184. "
  185. ." "; exit; }elseif(isset($_POST['passchack'])&&$_POST['passchack']==$pass){
  186. (is_file($filename))?($mes=unlink($filename)?'刪除成功':'刪除失敗檢視權限'):'';
  187. echo $mes;
  188. exit();
  189. }else{
  190. echo '密碼錯誤! ';
  191. exit;
  192. }
  193. }
  194. function Jump($file)//跳過檔案
  195. {
  196. global $jump,$safearr;
  197. if($jump != '')
  198. {
  199. foreach($safearr as $v)
  200. {
  201. if($v=='') continue;
  202. if( eregi($v,$file ) ) return true ;
  203. }
  204. }
  205. return false;
  206. }
  207. ?>
  208. [查看檔案變更] |[儲存目前文件指紋]|[掃描可疑文件]
複製程式碼

PHP, Web


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn