>  기사  >  백엔드 개발  >  PHP 웹 트로이 목마 스캐너

PHP 웹 트로이 목마 스캐너

WBOY
WBOY원래의
2016-07-25 08:42:181870검색
  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"; //로그를 저장할 경로를 설정하세요. 어디에나 배치할 수 있습니다.
  16. $exclude=array('data','images');//디렉터리 제외
  17. $danger='eval|cmd|passthru| gzuncompress';//트로이 목마 파일이 있는지 확인하기 위해 find에 위험한 기능을 설정합니다.
  18. $suffix='php|inc';//검사할 파일의 접미사를 설정합니다
  19. /*===== ================ 구성 끝 ======================*/
  20. $filename= $_GET['filename'];
  21. $check=$_GET[ 'check'];
  22. $jumpoff=false
  23. $url = $_SERVER['PHP_SELF']; end(explode('/',$url));
  24. $ jump="{$thisfile}|".implode('|',$exclude)
  25. $jkdir_num=$file_num=$danger_num=0 ;
  26. define('M_PATH',$jkdir);
  27. 정의('M_LOG',$logfilename)
  28. if ($check=='check')
  29. {
  30. $safearr = 폭발("|",$jump);
  31. $start_time(true);
  32. safe_check($jkdir)
  33. $end_time=microtime(true); $start_time;$file_num=$file_num-$jkdir_num;
  34. $message= "파일 수:".$file_num
  35. $message.= "폴더 수:".$jkdir_num; >$message.= "의심스러운 파일 수:".$danger_num;
  36. $message.= "실행 시간:".$total;
  37. echo $message; $_GET['m']=="del") Delete();// 파일 삭제 처리
  38. //파일 내용 읽기
  39. if(isset($_GET['readfile'])){
  40. //뷰 비밀번호를 출력하고, 비밀번호 확인이 맞는 후 파일 내용을 출력
  41. if (empty($_POST['passchack'])){
  42. echo"
    "
  43. . "
  44. " " /label>"
  45. . " "
  46. . ""
  47. ."";
  48. 종료
  49. }elseif(isset($_POST['passchack'])&& $_POST['passchack']==$pass){
  50. $code=file_get_contents($_GET['readfile']) ;
  51. echo"";
  52. 종료;
  53. }else{
  54. 종료;
  55. }
  56. }else{
  57. record_md5(M_PATH);
  58. if(file_exists(M_LOG)){
  59. $log = unserialize(file_get_contents(M_LOG)) ;
  60. }else{
  61. $log = array();
  62. if( $_GET['savethis']==1){
  63. //현재 파일 md5를 로그 파일로 저장
  64. @unlink(M_LOG)
  65. file_put_contents(M_LOG,serialize($file_list)); 🎜>echo "저장이 완료되었습니다! 돌아가려면 클릭하세요";
  66. exit;
  67. }
  68. if(empty($log)){
  69. echo "아직 로그 파일이 생성되지 않았습니다! [현재 저장]을 클릭하면 로그 파일이 생성됩니다! ";
  70. }else{
  71. if($file_list==$log){
  72. echo "이 폴더에는 변경 사항이 없습니다!";
  73. }else{
  74. if(count($file_list) > 0 ){
  75. foreach($file_list as $file => $md5){
  76. if(!isset($log [$file])){
  77. echo "새 파일: ".$file.""." 생성 시간: " . date("Y-m-d H:i:s",filectime($file))." 수정 시간: ".date("Y-m-d H:i:s",filemtime($file))." 소스 코드삭제< /a> ;
    ";
  78. }else{
  79. if($log[$file] != $md5){
  80. echo "파일 수정: ".$file.""." 생성 시간: ".date("Y-m-d H:i:s",filectime($file))." ("Y-m-d H:i:s",filemtime($file))." 소스 코드
  81. unset($log[$file]);
  82. }else{
  83. unset($log[$file])
  84. }
  85. }
  86. }
  87. if(count($log)>0){
  88. foreach($log as $file => $md5){
  89. echo "파일 삭제: ".$file."
    ";
  90. }
  91. }
  92. }
  93. }
  94. }
  95. }
  96. //md5 계산
  97. function Record_md5($jkdir){
  98. global $file_list,$exclude
  99. if(is_dir($jkdir)){
  100. $file =scandir ($jkdir);
  101. foreach($file as $f){
  102. if($f!='.' && $f!='..' && !in_array($f, $exclude) ){
  103. $path = $jkdir.'/'.$f;
  104. if(is_dir($path)){
  105. Record_md5($path)
  106. }else{
  107. $file_list [$ path]=md5_file($path);
  108. }
  109. }
  110. }
  111. }
  112. }
  113. function Safe_Check($jkdir)//파일 트래버스
  114. {
  115. global $danger ,$suffix ,$jkdir_num ,$file_num ,$danger_num
  116. ) 또는 die('폴더가 존재하지 않습니다.')
  117. while ($file=$hand-> ;read())
  118. {
  119. $filename=$jkdir.'/'.$file
  120. if (!$jumpoff) {
  121. if(Jump($filename))continue; > }
  122. if(@is_dir($filename) && $file != '.' && $file!= '..'&& $file!='./..')
  123. { $jkdir_num ; 🎜> Safe_Check($filename)
  124. }
  125. if (preg_match_all ("/.($suffix)/i",$filename,$out))
  126. {
  127. $str= '';
  128. $fp = @fopen($filename,'r')or die('권한 없음')
  129. while(!feof($fp))
  130. {
  131. $str . = fgets($fp,1024);
  132. }
  133. fclose($fp)
  134. if( preg_match_all ("/($danger)[rnt]{0,}([[(])/i ",$str,$out))
  135. {
  136. echo "의심스러운 파일: {$filename}" ." 생성 시간: ".date("Y-m-d H:i:s",filectime($filename))." 수정 시간: ".date("Y-m-d H:i:s",filemtime($filename))." 코드 보기 삭제
    ";
  137. $danger_num ;
  138. }
  139. }
  140. $file_num ;
  141. }
  142. }
  143. function Edit()//의심스러운 파일 보기
  144. {
  145. global $filename;
  146. $filename = str_replace("..","",$filename); $filename;
  147. $content = "";
  148. if(is_file($file))
  149. {
  150. $fp = fopen($file,"r")or die('권한 없음') ;
  151. $content = fread($fp,filesize($file));
  152. fclose($fp)
  153. $content = htmlspecialchars($content)
  154. echo "rn"
  155. exit() >}
  156. 함수 삭제()//파일 삭제
  157. { global $filename,$pass
  158. if(empty($_POST['passchack'])){
  159. echo "
    "
  160. . "
  161. " " > . " "
  162. " "
  163. . ."";
  164. 종료
  165. }elseif(isset($_POST['passchack'])&&$_POST['passchack']==$pass){
  166. (is_file($filename))?($mes=unlink($filename)?' 삭제 성공 ':'삭제 권한 보기 실패'):'';
  167. echo $mes;
  168. exit()
  169. }else{
  170. echo '비밀번호가 잘못되었습니다! ';
  171. 종료;
  172. }
  173. }
  174. function Jump($file)//파일 건너뛰기
  175. {
  176. global $jump,$safearr
  177. if($jump ! = '')
  178. {
  179. foreach($safearr as $v)
  180. {
  181. if($v=='') continue
  182. if( eregi($v,$file ) ) true를 반환합니다.
  183. }
  184. }
  185. false를 반환합니다.
  186. }
  187. ?>
  188. [파일 변경 사항 보기]< ; /a>|[현재 파일 지문 저장]|[ 의심스러운 파일 검사]
코드 복사

PHP, 웹


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.