当前位置:首页 > PHP教程 > php应用 > 列表

php网站被挂木马后的修复方法总结

发布:smiling 来源: PHP粉丝网  添加日期:2021-04-24 14:18:55 浏览: 评论:0 

这篇文章主要介绍了php网站被挂木马后的修复方法,总结分析了Linux与Windows系统上木马的查杀方法,并给出了一个完整的木马查找工具实例,需要的朋友可以参考下。

本文实例总结了php网站被挂木马后的修复方法。分享给大家供大家参考。具体方法如下:

在linux中我们可以使用命令来搜查木马文件,到代码安装目录执行下面命令,代码如下:

find ./ -iname "*.php" | xargs grep -H -n "eval(base64_decode"

搜出来接近100条结果,这个结果列表很重要,木马都在里面,要一个一个文件打开验证是否是木马,如果是,马上删除掉

最后找到10个木马文件,存放在各种目录,都是php webshell,功能很齐全,用base64编码

如果你在windows中查找目录直接使用windows文件搜索就可以了,可以搜索eval或最近修改文件,然后如果是dedecms我们要查看最新dedecms漏洞呀然后修补。

下面给个php木马查找工具,直接放到你站点根目录,代码如下:

  1. <?php 
  2. /**************PHP Web木马扫描器************************/ 
  3. /* [+] 作者: alibaba */ 
  4. /* [+] MSN: weeming21@hotmail.com */ 
  5. /* [+] 首发: t00ls.net , 转载请注明t00ls */ 
  6. /* [+] 版本: v1.0 */ 
  7. /* [+] 功能: web版php木马扫描工具*/ 
  8. /* [+] 注意: 扫描出来的文件并不一定就是后门, */ 
  9. /* 请自行判断、审核、对比原文件。*/ 
  10. /* 如果你不确定扫出来的文件是否为后门,*/ 
  11. /* 欢迎你把该文件发给我进行分析。*/ 
  12. /*******************************************************/ 
  13. ob_start(); 
  14. set_time_limit(0); 
  15. $username = "t00ls"//设置用户名 
  16. $password = "t00ls"//设置密码 
  17. $md5 = md5(md5($username).md5($password)); 
  18. $version = "PHP Web木马扫描器v1.0"
  19.  
  20. PHP Web 木马扫描器 
  21. $realpath = realpath('./'); 
  22. $selfpath = $_SERVER['PHP_SELF']; 
  23. $selfpath = substr($selfpath, 0, strrpos($selfpath,'/')); 
  24. define('REALPATH'str_replace('//','/',str_replace('\','/',substr($realpath, 0, strlen($realpath) - strlen($selfpath))))); 
  25. define('MYFILE'basename(__FILE__)); 
  26. define('MYPATH'str_replace('\', '/', dirname(__FILE__)).'/'); 
  27. define('MYFULLPATH'str_replace('\', '/', (__FILE__))); 
  28. define('HOST'"http://".$_SERVER['HTTP_HOST']); 
  29. ?> 
  30. <html> 
  31. <head> 
  32. <title><?php echo $version?></title> 
  33. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
  34. <style> 
  35. body{margin:0px;} 
  36. body,td{font: 12px Arial,Tahoma;line-height: 16px;} 
  37. a {color: #00f;text-decoration:underline;} 
  38. a:hover{color: #f00;text-decoration:none;} 
  39. .alt1 td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#f1f1f1;padding:5px 10px 5px 5px;} 
  40. .alt2 td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#f9f9f9;padding:5px 10px 5px 5px;} 
  41. .focus td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#ffffaa;padding:5px 10px 5px 5px;} 
  42. .head td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#e9e9e9;padding:5px 10px 5px 5px;font-weight:bold;} 
  43. .head td span{font-weight:normal;} 
  44. </style> 
  45. </head> 
  46. <body> 
  47. <?php 
  48. if(!(isset($_COOKIE['t00ls']) && $_COOKIE['t00ls'] == $md5) && !(isset($_POST['username']) && isset($_POST['password']) && (md5(md5($_POST['username']).md5($_POST['password']))==$md5))) 
  49. echo '<form id="frmlogin" name="frmlogin" method="post" action="">用户名: <input type="text" name="username" id="username" /> 密码: <input type="password" name="password" id="password" /> <input type="submit" name="btnLogin" id="btnLogin" value="登陆" /></form>'
  50. elseif(isset($_POST['username']) && isset($_POST['password']) && (md5(md5($_POST['username']).md5($_POST['password']))==$md5)) 
  51. setcookie("t00ls"$md5, time()+60*60*24*365,"/"); 
  52. echo "登陆成功!"
  53. header( 'refresh: 1; url='.MYFILE.'?action=scan' ); 
  54. exit(); 
  55. else 
  56. setcookie("t00ls"$md5, time()+60*60*24*365,"/"); 
  57. $setting = getSetting(); 
  58. $action = isset($_GET['action'])?$_GET['action']:""
  59.  
  60. if($action=="logout"
  61. setcookie ("t00ls""", time() - 3600); 
  62. Header("Location: ".MYFILE); 
  63. exit(); 
  64. if($action=="download" && isset($_GET['file']) && trim($_GET['file'])!=""
  65. $file = $_GET['file']; 
  66. ob_clean(); 
  67. if (@file_exists($file)) { 
  68. header("Content-type: application/octet-stream"); 
  69. header("Content-Disposition: filename="".basename($file)."""); 
  70. echo file_get_contents($file); 
  71. exit(); 
  72. ?> 
  73. <table border="0" cellpadding="0" cellspacing="0" width="100%"
  74. <tbody><tr class="head"
  75. <td><?php echo $_SERVER['SERVER_ADDR']?><span style="float: right; font-weight:bold;"><?php echo "<a href='http://www.t00ls.net/'>$version</a>"?></span></td> 
  76. </tr> 
  77. <tr class="alt1"
  78. <td><span style="float: right;"><?=date("Y-m-d H:i:s",mktime())?></span> 
  79. <a href="?action=scan">扫描</a> | 
  80. <a href="?action=setting">设定</a> | 
  81. <a href="?action=logout">登出</a> 
  82. </td> 
  83. </tr> 
  84. </tbody></table> 
  85. <br> 
  86. <?php 
  87. if($action=="setting"
  88. if(isset($_POST['btnsetting'])) 
  89. $Ssetting = array(); 
  90. $Ssetting['user']=isset($_POST['checkuser'])?$_POST['checkuser']:"php | php? | phtml"
  91. $Ssetting['all']=isset($_POST['checkall'])&&$_POST['checkall']=="on"?1:0; 
  92. $Ssetting['hta']=isset($_POST['checkhta'])&&$_POST['checkhta']=="on"?1:0; 
  93. setcookie("t00ls_s"base64_encode(serialize($Ssetting)), time()+60*60*24*365,"/"); 
  94. echo "设置完成!"
  95. header( 'refresh: 1; url='.MYFILE.'?action=setting' ); 
  96. exit(); 
  97. ?> 
  98. <form name="frmSetting" method="post" action="?action=setting"
  99. <FIELDSET style="width:400px"
  100. <LEGEND>扫描设定</LEGEND> 
  101. <table width="100%" border="0" cellspacing="0" cellpadding="0"
  102. <tr> 
  103. <td width="60">文件后缀:</td> 
  104. <td width="300"><input type="text" name="checkuser" id="checkuser" style="width:300px;" value="<?php echo $setting['user']?>"></td> 
  105. </tr> 
  106. <tr> 
  107. <td><label for="checkall">所有文件</label></td> 
  108. <td><input type="checkbox" name="checkall" id="checkall" <?php if($setting['all']==1) echo "checked"?>></td> 
  109. </tr> 
  110. <tr> 
  111. <td><label for="checkhta">设置文件</label></td> 
  112. <td><input type="checkbox" name="checkhta" id="checkhta" <?php if($setting['hta']==1) echo "checked"?>></td> 
  113. </tr> 
  114. <tr> 
  115. <td>&nbsp;</td> 
  116. <td> 
  117. <input type="submit" name="btnsetting" id="btnsetting" value="提交"
  118. </td> 
  119. </tr> 
  120. </table> 
  121. </fieldset> 
  122. </form> 
  123. <?php 
  124. else 
  125. $dir = isset($_POST['path'])?$_POST['path']:MYPATH; 
  126. $dir = substr($dir,-1)!="/"?$dir."/":$dir
  127. ?> 
  128. <form name="frmScan" method="post" action=""
  129. <table width="100%%" border="0" cellspacing="0" cellpadding="0"
  130. <tr> 
  131. <td width="35" style="vertical-align:middle; padding-left:5px;">扫描路径:</td> 
  132. <td width="690"
  133. <input type="text" name="path" id="path" style="width:600px" value="<?php echo $dir?>"
  134. &nbsp;&nbsp;<input type="submit" name="btnScan" id="btnScan" value="开始扫描"></td> 
  135. </tr> 
  136. </table(www.jb51.net)> 
  137. </form> 
  138. <?php 
  139. if(isset($_POST['btnScan'])) 
  140. $start=mktime(); 
  141. $is_user = array(); 
  142. $is_ext = ""
  143. $list = ""
  144.  
  145. if(trim($setting['user'])!=""
  146. $is_user = explode("|",$setting['user']); 
  147. if(count($is_user)>0) 
  148. foreach($is_user as $key=>$value
  149. $is_user[$key]=trim(str_replace("?","(.)",$value)); 
  150. $is_ext = "(.".implode("($|.))|(.",$is_user)."($|.))"
  151. if($setting['hta']==1) 
  152. $is_hta=1; 
  153. $is_ext = strlen($is_ext)>0?$is_ext."|":$is_ext
  154. $is_ext.="(^.htaccess$)"
  155. if($setting['all']==1 || (strlen($is_ext)==0 && $setting['hta']==0)) 
  156. $is_ext="(.+)"
  157.  
  158. $php_code = getCode(); 
  159. if(!is_readable($dir)) 
  160. $dir = MYPATH; 
  161. $count=$scanned=0; 
  162. scan($dir,$is_ext); 
  163. $end=mktime(); 
  164. $spent = ($end - $start); 
  165. ?> 
  166. <div style="padding:10px; background-color:#ccc">扫描: <?php echo $scanned?> 文件| 发现: <?php echo $count?> 可疑文件| 耗时: <?php echo $spent?> 秒</div> 
  167. <table width="100%" border="0" cellspacing="0" cellpadding="0"
  168. <tr class="head"
  169. <td width="15" align="center">No.</td> 
  170. <td width="48%">文件</td> 
  171. <td width="12%">更新时间</td> 
  172. <td width="10%">原因</td> 
  173. <td width="20%">特征</td> 
  174. <td>动作</td> 
  175. </tr> 
  176. <?php echo $list?> 
  177. </table> 
  178. <?php 
  179. ob_flush(); 
  180. ?> 
  181. </body> 
  182. </html> 
  183. <?php 
  184. function scan($path = '.',$is_ext){ 
  185. global $php_code,$count,$scanned,$list
  186. $ignore = array('.''..' ); 
  187. $replace=array(" ","n","r","t"); 
  188. $dh = @opendir( $path ); 
  189. while(false!==($file=readdir($dh))){ 
  190. if( !in_array( $file$ignore ) ){ 
  191. ifis_dir"$path$file" ) ){ 
  192. scan("$path$file/",$is_ext); 
  193. else { 
  194. $current = $path.$file
  195. if(MYFULLPATH==$currentcontinue
  196. if(!preg_match("/$is_ext/i",$file)) continue
  197. if(is_readable($current)) 
  198. $scanned++; 
  199. $content=file_get_contents($current); 
  200. $contentstr_replace($replace,"",$content); 
  201. foreach($php_code as $key => $value
  202. if(preg_match("/$value/i",$content)) 
  203. $count++; 
  204. $j = $count % 2 + 1; 
  205. $filetime = date('Y-m-d H:i:s',filemtime($current)); 
  206. $reason = explode("->",$key); 
  207. $url = str_replace(REALPATH,HOST,$current); 
  208. preg_match("/$value/i",$content,$arr); 
  209. $list.=" 
  210. <tr class='alt$j' onmouseover='this.className="focus";' onmouseout='this.className="alt$j";'
  211. <td>$count</td> 
  212. <td><a href='$url' target='_blank'>$current</a></td> 
  213. <td>$filetime</td> 
  214. <td><font color=red>$reason[0]</font></td> 
  215. <td><font color=#090>$reason[1]</font></td> 
  216. <td><a href='?action=download&file=$current' target='_blank'>下载</a></td> 
  217. </tr>"; 
  218. //echo $key . "-" . $path . $file ."(" . $arr[0] . ")" ."<br />"; 
  219. //echo $path . $file ."<br />"; 
  220. break
  221. closedir$dh ); 
  222. function getSetting() 
  223. $Ssetting = array(); 
  224. if(isset($_COOKIE['t00ls_s'])) 
  225. $Ssetting = unserialize(base64_decode($_COOKIE['t00ls_s'])); 
  226. $Ssetting['user']=isset($Ssetting['user'])?$Ssetting['user']:"php | php? | phtml | shtml"
  227. $Ssetting['all']=isset($Ssetting['all'])?intval($Ssetting['all']):0; 
  228. $Ssetting['hta']=isset($Ssetting['hta'])?intval($Ssetting['hta']):1; 
  229. else 
  230. $Ssetting['user']="php | php? | phtml | shtml"
  231. $Ssetting['all']=0; 
  232. $Ssetting['hta']=1; 
  233. setcookie("t00ls_s"base64_encode(serialize($Ssetting)), time()+60*60*24*365,"/"); 
  234. return $Ssetting
  235. function getCode() 
  236. return array
  237. '后门特征->cha88.cn'=>'cha88.cn'
  238. '后门特征->c99shell'=>'c99shell'
  239. '后门特征->phpspy'=>'phpspy'
  240. '后门特征->Scanners'=>'Scanners'
  241. '后门特征->cmd.php'=>'cmd.php'
  242. '后门特征->str_rot13'=>'str_rot13'
  243. '后门特征->webshell'=>'webshell'
  244. '后门特征->EgY_SpIdEr'=>'EgY_SpIdEr'
  245. '后门特征->tools88.com'=>'tools88.com'
  246. '后门特征->SECFORCE'=>'SECFORCE'
  247. '后门特征->eval("?>'=>'eval(('|")?>', 
  248. '可疑代码特征->system('=>'system('
  249. '可疑代码特征->passthru('=>'passthru('
  250. '可疑代码特征->shell_exec('=>'shell_exec('
  251. '可疑代码特征->exec('=>'exec('
  252. '可疑代码特征->popen('=>'popen('
  253. '可疑代码特征->proc_open'=>'proc_open'
  254. '可疑代码特征->eval($'=>'eval(('|"|s*)\$', 
  255. '可疑代码特征->assert($'=>'assert(('|"|s*)\$', 
  256. '危险MYSQL代码->returns string soname'=>'returnsstringsoname'
  257. '危险MYSQL代码->into outfile'=>'intooutfile'
  258. '危险MYSQL代码->load_file'=>'select(s+)(.*)load_file'
  259. '加密后门特征->eval(gzinflate('=>'eval(gzinflate('
  260. '加密后门特征->eval(base64_decode('=>'eval(base64_decode('
  261. '加密后门特征->eval(gzuncompress('=>'eval(gzuncompress('
  262. '加密后门特征->eval(gzdecode('=>'eval(gzdecode('
  263. '加密后门特征->eval(str_rot13('=>'eval(str_rot13('
  264. '加密后门特征->gzuncompress(base64_decode('=>'gzuncompress(base64_decode('
  265. '加密后门特征->base64_decode(gzuncompress('=>'base64_decode(gzuncompress('
  266. '一句话后门特征->eval($_'=>'eval(('|"|s*)\$_(POST|GET|REQUEST|COOKIE)', 
  267. '一句话后门特征->assert($_'=>'assert(('|"|s*)\$_(POST|GET|REQUEST|COOKIE)', 
  268. '一句话后门特征->require($_'=>'require(('|"|s*)\$_(POST|GET|REQUEST|COOKIE)', 
  269. '一句话后门特征->require_once($_'=>'require_once(('|"|s*)\$_(POST|GET|REQUEST|COOKIE)', 
  270. '一句话后门特征->include($_'=>'include(('|"|s*)\$_(POST|GET|REQUEST|COOKIE)', 
  271. '一句话后门特征->include_once($_'=>'include_once(('|"|s*)\$_(POST|GET|REQUEST|COOKIE)', 
  272. '一句话后门特征->call_user_func("assert"'=>'call_user_func(("|')assert("|')'
  273. '一句话后门特征->call_user_func($_'=>'call_user_func(('|"|s*)\$_(POST|GET|REQUEST|COOKIE)', 
  274. '一句话后门特征->$_POST/GET/REQUEST/COOKIE[?]($_POST/GET/REQUEST/COOKIE[?]'=>'$_(POST|GET|REQUEST|COOKIE)[([^]]+)](('|"|s*)\$_(POST|GET|REQUEST|COOKIE)[', 
  275. '一句话后门特征->echo(file_get_contents($_POST/GET/REQUEST/COOKIE'=>'echo(file_get_contents(('|"|s*)\$_(POST|GET|REQUEST|COOKIE)', 
  276. '上传后门特征->file_put_contents($_POST/GET/REQUEST/COOKIE,$_POST/GET/REQUEST/COOKIE'=>'file_put_contents(('|"|s*)\$_(POST|GET|REQUEST|COOKIE)[([^]]+)],('|"|s*)\$_(POST|GET|REQUEST|COOKIE)', 
  277. '上传后门特征->fputs(fopen("?","w"),$_POST/GET/REQUEST/COOKIE['=>'fputs(fopen((.+),('|")w('|")),('|"|s*)\$_(POST|GET|REQUEST|COOKIE)[', 
  278. '.htaccess插马特征->SetHandler application/x-httpd-php'=>'SetHandlerapplication/x-httpd-php'
  279. '.htaccess插马特征->php_value auto_prepend_file'=>'php_valueauto_prepend_file'
  280. '.htaccess插马特征->php_value auto_append_file'=>'php_valueauto_append_file' 
  281. );//www.phpfensi.com 
  282. ?> 

希望本文所述对大家基于php的网站安全建设有所帮助。

Tags: php网站挂木马

分享到: