header('content-type:text/html;charset=gbk') set_time_limit(0);//시간 초과 방지 /** * * php 디렉토리 스캐닝 모니터링 강화 버전 * * @version 1.0 * 사용하기 전에 다음 변수를 수동으로 설정해야 합니다 * **/ /*===================== 프로그램 구성 ============ = ========*/ $pass="test";//비밀번호 설정 $jkdir="."; //스캐닝을 모니터링할 디렉터리를 설정합니다. ', 위의 첫 번째 수준 디렉터리는 '..'입니다. 절대 경로를 설정할 수도 있습니다. 뒤에 슬래시를 추가하지 마세요. 기본값은 현재 디렉터리입니다. $logfilename="./m.log"; //로그를 저장할 경로를 설정하세요. 어디에나 배치할 수 있습니다. $exclude=array('data','images');//디렉터리 제외 $danger='eval|cmd|passthru| gzuncompress';//트로이 목마 파일이 있는지 확인하기 위해 find에 위험한 기능을 설정합니다. $suffix='php|inc';//검사할 파일의 접미사를 설정합니다 /*===== ================ 구성 끝 ======================*/ $filename= $_GET['filename']; $check=$_GET[ 'check']; $jumpoff=false $url = $_SERVER['PHP_SELF']; end(explode('/',$url)); $ jump="{$thisfile}|".implode('|',$exclude) $jkdir_num=$file_num=$danger_num=0 ; define('M_PATH',$jkdir); 정의('M_LOG',$logfilename) if ($check=='check') { $safearr = 폭발("|",$jump); $start_time(true); safe_check($jkdir) $end_time=microtime(true); $start_time;$file_num=$file_num-$jkdir_num; $message= "파일 수:".$file_num $message.= "폴더 수:".$jkdir_num; >$message.= "의심스러운 파일 수:".$danger_num; $message.= "실행 시간:".$total; echo $message; $_GET['m']=="del") Delete();// 파일 삭제 처리 //파일 내용 읽기 if(isset($_GET['readfile'])){ //뷰 비밀번호를 출력하고, 비밀번호 확인이 맞는 후 파일 내용을 출력 if (empty($_POST['passchack'])){ echo"
. " pass"
" " /label>"
. " "
. ""
."";
종료
}elseif(isset($_POST['passchack'])&& $_POST['passchack']==$pass){
$code=file_get_contents($_GET['readfile']) ;
echo"";
종료;
}else{
종료;
}
}else{
record_md5(M_PATH);
if(file_exists(M_LOG)){
$log = unserialize(file_get_contents(M_LOG)) ;
}else{
$log = array();
if( $_GET['savethis']==1){
//현재 파일 md5를 로그 파일로 저장
@unlink(M_LOG)
file_put_contents(M_LOG,serialize($file_list)); 🎜>echo "저장이 완료되었습니다! 돌아가려면 클릭하세요 ";
exit;
}
if(empty($log)){
echo "아직 로그 파일이 생성되지 않았습니다! [현재 저장]을 클릭하면 로그 파일이 생성됩니다! ";
}else{
if($file_list==$log){
echo "이 폴더에는 변경 사항이 없습니다!";
}else{
if(count($file_list) > 0 ){
foreach($file_list as $file => $md5){
if(!isset($log [$file])){
echo "새 파일: ".$file." "." 생성 시간: " . date("Y-m-d H:i:s",filectime($file))." 수정 시간: ".date("Y-m-d H:i:s",filemtime($file))." 소스 코드 삭제< /a> ; ";
}else{
if($log[$file] != $md5){
echo "파일 수정: ".$file." "." 생성 시간: ".date("Y-m-d H:i:s",filectime($file))." ("Y-m-d H:i:s",filemtime($file))." 소스 코드 unset($log[$file]); }else{ unset($log[$file]) } } } if(count($log)>0){
foreach($log as $file => $md5){
echo "파일 삭제: ".$file." ";
}
}
}
}
}
}
//md5 계산
function Record_md5($jkdir){
global $file_list,$exclude
if(is_dir($jkdir)){
$file =scandir ($jkdir);
foreach($file as $f){
if($f!='.' && $f!='..' && !in_array($f, $exclude) ){
$path = $jkdir.'/'.$f;
if(is_dir($path)){
Record_md5($path)
}else{
$file_list [$ path]=md5_file($path);
}
}
}
}
}
function Safe_Check($jkdir)//파일 트래버스
{
global $danger ,$suffix ,$jkdir_num ,$file_num ,$danger_num
) 또는 die('폴더가 존재하지 않습니다.')
while ($file=$hand-> ;read())
{
$filename=$jkdir.'/'.$file
if (!$jumpoff) {
if(Jump($filename))continue; > }
if(@is_dir($filename) && $file != '.' && $file!= '..'&& $file!='./..')
{ $jkdir_num ; 🎜> Safe_Check($filename)
}
if (preg_match_all ("/.($suffix)/i",$filename,$out))
{
$str= '';
$fp = @fopen($filename,'r')or die('권한 없음')
while(!feof($fp))
{
$str . = fgets($fp,1024);
}
fclose($fp)
if( preg_match_all ("/($danger)[rnt]{0,}([[(])/i ",$str,$out))
{
echo "의심스러운 파일: {$filename} " ." 생성 시간: ".date("Y-m-d H:i:s",filectime($filename))." 수정 시간: ".date("Y-m-d H:i:s",filemtime($filename))." 코드 보기 삭제 ";
$danger_num ;
}
}
$file_num ;
}
}
function Edit()//의심스러운 파일 보기
{
global $filename;
$filename = str_replace("..","",$filename); $filename;
$content = "";
if(is_file($file))
{
$fp = fopen($file,"r")or die('권한 없음') ;
$content = fread($fp,filesize($file));
fclose($fp)
$content = htmlspecialchars($content)
echo "rn"
exit() >}
함수 삭제()//파일 삭제
{ global $filename,$pass
if(empty($_POST['passchack'])){
echo "
. " pass"
" " > . " "
" "
. ."";
종료
}elseif(isset($_POST['passchack'])&&$_POST['passchack']==$pass){
(is_file($filename))?($mes=unlink($filename)?' 삭제 성공 ':'삭제 권한 보기 실패'):'';
echo $mes;
exit()
}else{
echo '비밀번호가 잘못되었습니다! ';
종료;
}
}
function Jump($file)//파일 건너뛰기
{
global $jump,$safearr
if($jump ! = '')
{
foreach($safearr as $v)
{
if($v=='') continue
if( eregi($v,$file ) ) true를 반환합니다.
}
}
false를 반환합니다.
}
?>
[파일 변경 사항 보기]< ; /a>| [현재 파일 지문 저장] |[ 의심스러운 파일 검사]
코드 복사