当前位置:首页 >  IDC >  服务器 >  正文

服务器又被挂WebShell?让AI写扫描脚本,按特征揪出一句话木马

 2026-09-01 11:31  来源: 互联网   我来投稿 撤稿纠错

  一键部署OpenClaw

 网站被入侵后清理了一遍,过几天又发现新马。原因多半是清理不彻底——只删了明面上的文件,藏在图片里、伪装成正常库文件的WebShell没揪出来。人工逐个文件看?几千个文件看到眼瞎。让AI写个扫描脚本,按特征全盘扫一遍,是效率最高的做法。

先想清楚WebShell长什么样。一句话木马的核心特征:执行代码的危险函数(eval、assert、system、exec、shell_exec、passthru)+ 接收外部输入($_POST、$_REQUEST、$_GET、$_COOKIE)+ 常见变形(base64_decode、str_rot13、字符串拼接、create_function)。光查扩展名没用——攻击者会把马改成.jpg、.png甚至没有扩展名。所以扫描要按内容特征来。

把特征告诉AI,让它写扫描脚本。提示词里明确:扫描目录、要匹配的特征、输出要求。下面这个Python脚本就是典型的AI产物,你只要理解它的思路——正则匹配高危函数组合,命中就打印文件路径和行号。

<pre style="background-color:#282c34;color:#abb2bf;padding:16px 20px;border-radius:8px;overflow-x:auto;font-family:Consolas,'Courier New',monospace;font-size:14px;line-height:1.7;margin:16px 0;-webkit-overflow-scrolling:touch;"><code style="font-family:inherit;"><span style="color:#7f848e;font-style:italic"># webshell_scan.py —— 按内容特征扫描上传目录</span>
import os, re

SCAN_DIR = <span style="color:#98c379">&quot;/var/www/html/uploads&quot;</span>
<span style="color:#7f848e;font-style:italic"># 高危特征:危险函数 + 可变参数/编码变形</span>
patterns = [
re.<span style="color:#61afef">compile</span>(r<span style="color:#98c379">&#x27;(eval|assert)\s*\(\s*\$_(POST|REQUEST|GET|COOKIE)&#x27;</span>, re.I),
re.<span style="color:#61afef">compile</span>(r<span style="color:#98c379">&#x27;(system|exec|shell_exec|passthru|popen)\s*\(\s*\$_(POST|REQUEST|GET|COOKIE)&#x27;</span>, re.I),
re.<span style="color:#61afef">compile</span>(r<span style="color:#98c379">&#x27;base64_decode\s*\(\s*[&quot;\&#x27;]&#x27;</span>, re.I),
re.<span style="color:#61afef">compile</span>(r<span style="color:#98c379">&#x27;@\s*(eval|assert)\s*\(&#x27;</span>, re.I),
re.<span style="color:#61afef">compile</span>(r<span style="color:#98c379">&#x27;create_function\s*\(&#x27;</span>, re.I),
]

<span style="color:#c678dd">for</span> root, dirs, files in os.<span style="color:#61afef">walk</span>(SCAN_DIR):
<span style="color:#c678dd">for</span> f in files:
path = os.path.<span style="color:#61afef">join</span>(root, f)
<span style="color:#c678dd">try</span>:
with <span style="color:#61afef">open</span>(path, <span style="color:#98c379">&#x27;rb&#x27;</span>) <span style="color:#c678dd">as</span> fp:
data = fp.<span style="color:#61afef">read</span>()
except <span style="color:#e6c07b">Exception</span>:
<span style="color:#c678dd">continue</span>
<span style="color:#7f848e;font-style:italic"># 跳过真正的图片文件</span>
<span style="color:#c678dd">if</span> data[:<span style="color:#d19a66">3</span>] == b<span style="color:#98c379">&#x27;\xff\xd8\xff&#x27;</span> <span style="color:#c678dd">or</span> data[:<span style="color:#d19a66">8</span>] == b<span style="color:#98c379">&#x27;\x89PNG\r\n\x1a\n&#x27;</span>:
<span style="color:#c678dd">continue</span>
<span style="color:#c678dd">try</span>:
text = data.<span style="color:#61afef">decode</span>(<span style="color:#98c379">&#x27;utf-8&#x27;</span>, errors=<span style="color:#98c379">&#x27;ignore&#x27;</span>)
except <span style="color:#e6c07b">Exception</span>:
<span style="color:#c678dd">continue</span>
<span style="color:#c678dd">for</span> i, pat in <span style="color:#61afef">enumerate</span>(patterns):
m = pat.<span style="color:#61afef">search</span>(text)
<span style="color:#c678dd">if</span> m:
line = text[:m.<span style="color:#61afef">start</span>()].<span style="color:#61afef">count</span>(<span style="color:#98c379">&#x27;\n&#x27;</span>) + <span style="color:#d19a66">1</span>
<span style="color:#c678dd">print</span>(f<span style="color:#98c379">&quot;[!] {path}:{line} 命中特征{i+1}: {m.group()[:60]}&quot;</span>)
<span style="color:#c678dd">break</span></code></pre>

扫描结果要人工复核,AI写的特征正则可能有误报——比如某些正常代码里也有base64_decode(微信支付回调验签就常用)。命中列表拿出来,逐个打开看上下文,确认是马再删。删之前先备份,万一误删了正常文件还有退路。

另外两个维度别漏:一是文件修改时间,入侵时间点之后被改动的文件全部重点查;二是上传目录的权限,WebShell多半是从上传漏洞进来的,扫完马顺手把上传目录的脚本执行权限禁了(Nginx下location配置deny php),不然明天还会有一批新马等你扫。

<pre style="background-color:#282c34;color:#abb2bf;padding:16px 20px;border-radius:8px;overflow-x:auto;font-family:Consolas,'Courier New',monospace;font-size:14px;line-height:1.7;margin:16px 0;-webkit-overflow-scrolling:touch;"><code style="font-family:inherit;"><span style="color:#7f848e;font-style:italic"># Nginx:uploads目录禁止执行PHP(WebShell最常见入口)</span>
location ~ ^/uploads/.*\.(php|php5|phtml|asp|aspx|jsp|cgi|pl)$ {
deny all;
<span style="color:#c678dd">return</span> <span style="color:#d19a66">403</span>;
}

<span style="color:#7f848e;font-style:italic"># 定时扫描(每天凌晨4点)</span>
<span style="color:#d19a66">0</span> <span style="color:#d19a66">4</span> * * * python3 /root/webshell_scan.py &gt;&gt; /<span style="color:#c678dd">var</span>/log/webshell_scan.log <span style="color:#d19a66">2</span>&gt;&amp;<span style="color:#d19a66">1</span></code></pre>

申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!

相关标签
服务器安全

相关文章

  • 被CC打挂之前先做这三步:SYN Flood内核参数调优实战

    SYNFlood的原理一句话:攻击者狂发TCP握手第一个包(SYN),但不回第三次握手的ACK,服务器傻等,半连接队列被占满,正常用户的握手请求进不来,表现为网站打不开但机器负载并不高。这种攻击成本极低,一个脚本就能打,站长几乎人人会遇到。先确认是不是这个病:ss-s看一眼,或者netstat-an

  • 服务器一开机就有爆破记录?SSH 加固三步走,把扫描者挡在门外

    随便找台开了22端口的服务器看下日志,lastb命令刷出来一屏又一屏的失败登录,全是脚本在扫弱口令。密码登录是当前云主机被打穿的头号入口,加固只需三步,半小时搞定,收益却是终身的。第一步,改用密钥登录。本机生成密钥对,公钥放到服务器:#本机生成(一路回车,或设个口令更稳)ssh-keygen-ted

    标签:
    服务器安全
  • 别只会tail:用awk五分钟从访问日志揪出异常IP

    服务器被打了、被采集了、被扫描了,证据全在access.log里躺着。多数人的操作是tail-f盯屏幕,看完一千行记住的没几条。日志分析的正确姿势是聚合统计,awk就是干这个的,装都不用装。第一件事,统计访问量最高的前二十个IP,看有没有异常大户。#取访问量Top20的IPawk'{print$1}

    标签:
    服务器安全
  • 选择服务器托管应该注意哪些?

    托管服务提供商通常会提供硬件、软件和网络设施供您使用,使您免于投资和进行这些方面的管理。这些服务通常分为共享托管、虚拟私有服务器(VPS)和独立服务器。共享托管服务允许您和其他客户共享同一服务器资源,而VPS和独立服务器则允许您独占硬件资源,以便您可以更好地控制您的配置和安全。在选择托管服务提供商时

    标签:
    服务器安全
  • 国外服务器哪家好?

    至于为什么选择美国的,当然是技术和资源比较好了。

热门排行

信息推荐