自己写的php木马webshell扫描器
因为前端时间服务器被放过 所以写了个webshell扫描器 呵呵 专杀php webshell 不管大马还是小马 包括一句话 现在放出代码来
<?php
/*===================== 程序配置 =====================*/
$dir='cms'; //设置要扫描的目录
$jumpoff=false;//设置要跳过检查的文件
$jump='safe.php|g'; //设置要跳过检查的文件或者文件夹 $jumpoff=false 时此设置有效
$danger='eval|cmd|passthru';//设置要查找的危险的函数 以确定是否木马文件
$suffix='php|inc';//设置要扫描文件的后缀
$dir_num=0;
$file_num=0;
$danger_num=0;
/*===================== 配置结束 =====================*/
extract (GetHttpVars());
if ($m=="edit") Edit();
if ($m=="del") Delete();
if ($check=='check')
{ $safearr = explode("|",$jump);
$start_time=microtime(true);
safe_check($dir);
$end_time=microtime(true);
$total=$end_time-$start_time;
$file_num=$file_num-$dir_num;
$message= " 文件数:".$file_num;
$message.= " 文件夹数:".$dir_num;
$message.= " 可疑文件数:".$danger_num;
$message.= " 执行时间:".$total;
echo $message;
exit();
}
function GetHttpVars() {//全局变量
$superglobs = array(
'_POST',
'_GET',
'HTTP_POST_VARS',
'HTTP_GET_VARS');
$httpvars = array();
foreach ($superglobs as $glob) {
global $$glob;
if (isset($$glob) && is_array($$glob)) {
$httpvars = $$glob;
}
if (count($httpvars) > 0)
break;
}
return $httpvars;
}
function Safe_Check($dir)//遍历文件
{
global $danger ,$suffix ,$dir_num ,$file_num ,$danger_num;
) or die('文件夹不存在') ;
while ($file=$hand->read() )
{
$filename=$dir.'/'.$file;
if (!$jumpoff) {
if(Jump($filename))continue;
}
if(@is_dir($filename) && $file != '.' && $file!= '..'&& $file!='./..')
{ $dir_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)[ \r\n\t]{0,}([\[\(])/i",$str,$out))
{
echo "<font color='green' style='font-size:14px'>可疑文件:{$filename}</font>
<a href='?m=edit&filename=$filename' target='_blank'><u>查看代码</u></a>
<a href='?m=del&filename=$filename' target='_blank'>删除</u></a><br>";
$danger_num++;
}
}
$file_num++;
}
}
function Edit()//查看可疑文件
{
global $filename;
$filename = str_replace("..","",$filename);
$file = $filename;
$content = "";
if(is_file($file))
{
$fp = fopen($file,"r")or die('没有权限');
$content = fread($fp,filesize($file));
fclose($fp);
$content = htmlspecialchars($content);
}
echo "<textarea name='str' style='width:100%;height:450px;background:#cccccc;'>$content</textarea>\r\n";
exit();
}
function Delete()//删除文件
{
global $filename;
(is_file($filename))?($mes=unlink($filename)?'删除成功':'删除失败 查看权限'):'';
echo $mes;
exit();
}
function Jump($file)//跳过文件
{
global $jump,$safearr;
if($jump != '')
{
foreach($safearr as $v)
{
if($v=='') continue;
if( eregi($v,$file) ) return true ;
}
}
return false;
}
?>
<form action="" >
<input type="submit" value="开始检测" />
<input type="hidden" name="check" value="check"/>
</form>
如何弄成工具啊
Re: 自己写的php木马webshell扫描器
看了你写的这个 webshell 扫描器,思路挺清晰的——通过正则匹配危险函数来定位可疑文件,还附带查看和删除功能,对于快速排查服务器上的 PHP 后门确实很方便。目录跳过滤、后缀设置这些配置也考虑到了实际使用场景。 不过也要留个心,代码里用 `extract(GetHttpVars())` 直接覆盖全局变量,如果直接放到服务器上运行,可能会被攻击者利用参数注入来绕过检查或者执行恶意操作。另外删除功能没有做身份验证,如果被别人调用可能会误删文件。建议使用前做一些安全加固,比如加个密码验证或者限制访问 IP。 总体来说,自己动手写工具解决问题很实用,谢谢分享。Re: 自己写的php木马webshell扫描器
楼主分享的这个扫描器挺实用的,代码结构清晰,能扫描目录下的 PHP 文件,检查危险函数并支持查看和删除可疑文件。自己动手写工具解决实际问题,这种分享精神很棒。 不过有几个小地方可以留意一下: - `Safe_Check` 函数开头少了一个 `if(!$hand = @opendir($dir))` 判断前的代码看起来不太完整,可能复制时漏了。 - 用了 `extract(GetHttpVars())`,如果 `$m` 和 `$check` 来自 GET/POST 的话,要注意安全风险,建议改用更严格的过滤。 - 正则匹配危险函数时,现在只检查 `eval|cmd|passthru`,实际还有 `system`、`shell_exec`、`exec`、`popen` 等常见危险函数,可以按需添加。 总体已经很好用了,感谢分享!Re: 自己写的php木马webshell扫描器
感谢分享!自写工具排查 webshell 很有实战价值,代码结构清晰,对于刚入门安全的朋友来说也能快速理解扫描思路。提个小建议:`Safe_check` 函数里 `opendir` 似乎少了一行赋值代码,目前第6行的 `) or die('文件夹不存在')` 前面没有 `$hand = @opendir($dir)`,可能会导致脚本报错。另外 `$jumpoff` 为 `false` 时才启用跳过列表,判断逻辑那里可能跟预期相反,可以再检查一下。整体上扫描思路很实用,赞一个!
页:
[1]