Wireshark实战:从HTTP流量中快速定位SQL注入与WebShell攻击痕迹
2026/7/4 18:19:59 网站建设 项目流程

1. 项目概述:从海量流量中嗅探攻击的“气味”

做安全分析或者运维排查,最头疼的莫过于面对一个几GB甚至几十GB的pcap抓包文件,里面混杂着海量的正常业务流量和可能的攻击流量。就像在一座嘈杂的菜市场里,要精准地听出某个角落里两个人在密谋什么。Wireshark就是我们的“超级耳朵”和“翻译器”,但光有工具不够,更重要的是知道听什么、怎么听。今天要聊的,就是如何利用Wireshark,在HTTP这个最普遍的应用层协议流量里,快速定位那些不怀好意的“黑客攻击痕迹”。这不是一个基础操作教程,而是一套基于实战经验的、从攻击者视角和防御者视角双重出发的狩猎思路。

HTTP协议因其明文(或部分明文)传输的特性,成为了攻击者最常利用的通道之一,SQL注入、WebShell上传、敏感信息泄露、暴力破解等攻击都依赖它。我们的目标,就是教会你如何像老练的猎人一样,通过流量中的异常“气味”——比如异常的请求方法、畸形的参数、不合逻辑的响应状态码、可疑的通信模式——来快速缩小排查范围,锁定攻击行为。我会附上一个精心构造的pcap文件,里面模拟了多种常见的Web攻击流量,你可以用它来练手,验证文中的分析技巧。

2. 核心思路:建立攻击痕迹的“特征画像”

在开始具体操作前,我们必须先建立正确的分析思路。漫无目的地浏览数据包是效率最低下的做法。高效的分析,始于对攻击行为的“特征画像”的深刻理解。我们需要思考:一次成功的攻击,在HTTP流量层会留下哪些必然或可能的行为特征?我将这些特征归纳为四个维度:协议异常、内容异常、时序异常和上下文异常。

2.1 协议异常:不守规矩的“访客”

HTTP协议有其标准规范,攻击流量往往首先在协议层面露出马脚。

  • 非标准HTTP方法:除了常见的GET、POST、HEAD、PUT、DELETE,攻击者可能使用PROPFINDCOPYMOVE等WebDAV方法进行探测或利用,或者使用DEBUGTRACE等方法测试服务器配置。更隐蔽的,是在POST请求体中伪装,但请求行却使用GET /admin.php?cmd=system('whoami')这种将参数放在URL中的方式,试图绕过某些WAF规则。
  • 畸形的URL与头部:过长的URL(尝试缓冲区溢出)、包含大量../的路径穿越(/../../../etc/passwd)、URL编码混乱或双重编码(%252e%252e%252f)、头部字段缺失(如缺少Host)、头部字段重复或包含特殊字符(如换行符\r\n注入)。
  • 状态码与内容长度不匹配:一个HTTP 200 OK的响应,却伴随着极小的Content-Length(如几个字节),这可能是一个攻击成功的“盲注”响应(仅返回真假标志)。反之,一个403 Forbidden或404 Not Found的响应,却有着异常大的响应体,可能包含了服务器的详细错误信息,泄露了路径、框架版本等敏感数据。

2.2 内容异常:负载中的“恶意代码”

这是攻击检测的核心,攻击载荷(Payload)就藏在请求或响应的内容里。

  • SQL注入特征:在请求参数中出现大量的单引号'、注释符--#/* */,以及UNIONSELECTFROMinformation_schemasleep()benchmark()等关键字。需要注意,这些关键字可能被分割、编码或混淆。
  • 命令注入与WebShell特征:参数中出现系统命令分隔符,如分号;、管道符|、反引号`&&||。以及常见的PHP函数如system()exec()shell_exec()eval()assert(),或连接WebShell的特定参数名,如cmdactionpasswordant等。
  • 目录遍历与文件包含:参数中包含../..\/etc/passwd/proc/self/environC:\windows\system32\drivers\etc\hosts等系统文件路径,或者php://inputfile://http://等伪协议。
  • 敏感信息泄露:在响应体中,直接出现了数据库连接字符串、API密钥、服务器绝对路径、堆栈跟踪信息、源代码片段等。

2.3 时序异常:反常的“对话节奏”

正常的用户交互和自动化攻击工具产生的流量模式存在显著差异。

  • 高速率请求:短时间内从同一个源IP向同一个目标路径(如/login.php)发起大量请求,这是典型的暴力破解或撞库攻击特征。
  • 规律性探测:以固定的时间间隔,对一批不存在的路径(如/admin//backup//phpmyadmin/)发起HEAD或GET请求,这是自动化扫描工具的行为。
  • 长连接下的持续交互:一个TCP连接建立后,持续了非常长的时间,并且有间歇性的、小的HTTP请求/响应交换,这可能是WebShell的交互会话或C2(命令与控制)服务器的心跳与指令传输。

2.4 上下文异常:格格不入的“访客背景”

将单个数据包放在整个通信流和网络环境中审视。

  • User-Agent异常:使用默认的、过时的、或明显是扫描器/漏洞利用工具的User-Agent,如sqlmap/1.7.0#devMozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)等。当然,高明的攻击者会伪装成普通浏览器。
  • 来源IP异常:流量来自不常见的国家、地区的IP段,或者来自已知的云服务器/VPS提供商(攻击者常用),且与正常业务用户IP段不符。
  • 内部横向移动:如果抓包点在内网,发现一台服务器(如Web服务器)在成功被入侵后,主动向内部其他服务器的敏感端口(如445、3389、22)发起连接,这是典型的横向移动迹象。

有了这四个维度的“特征画像”,我们再看Wireshark里的流量,就不再是一堆杂乱无章的文本,而是一幅有待解读的行为图谱。接下来,我们进入实战环节,看看如何用Wireshark的过滤器和功能,将这些特征快速筛选出来。

3. Wireshark实战:构建高效过滤与搜索策略

打开一个大型pcap文件,直接浏览是无意义的。我们必须利用Wireshark强大的显示过滤器和工具,像筛子一样层层过滤,逐步聚焦可疑流量。

3.1 第一层过滤:聚焦HTTP协议与关键会话

首先,我们需要从所有协议(TCP、UDP、ARP等)中,快速提取出HTTP流量。

  • 基础过滤:在显示过滤器栏输入http。这会显示所有Wireshark识别出的HTTP请求和响应数据包。这是我们的起点。
  • 关键对象追踪:在过滤出HTTP流量后,重点关注以下对象:
    • 异常状态码:使用过滤器http.response.code >= 400快速定位所有客户端或服务器错误。特别是500 Internal Server Error,可能暴露了注入攻击导致的数据库或应用错误。403 Forbidden404 Not Found的集中出现可能指向扫描行为。
    • 特定请求方法:使用http.request.method == “POST”http.request.method == “PUT”重点关注非GET请求,因为攻击载荷更可能藏在POST数据体中。也可以搜索非常用方法:http.request.method not in {“GET” “POST” “HEAD”}
    • 关键路径:如果你怀疑管理后台被攻击,可以使用http.request.uri contains “admin”http.request.uri contains “login”进行过滤。

注意:Wireshark默认只将标准端口(80, 443等)的流量识别为HTTP协议。如果Web服务运行在非标准端口(如8080),你需要右键TCP数据包 ->Decode As...-> 将当前或目标端口设置为HTTP协议,Wireshark才会正确解析。

3.2 第二层过滤:基于内容特征的深度筛查

当我们将范围缩小到一批可疑的HTTP会话后,就需要深入数据包内部,检查负载内容。

  • 字符串搜索(最常用):这是定位已知攻击特征的最快方法。按下Ctrl+F,选择“分组详情”和“字符串”,输入关键词进行搜索。例如:
    • 搜索union select找SQL注入。
    • 搜索eval(system(找命令执行或WebShell。
    • 搜索/etc/passwd..\找路径遍历。
    • 搜索password=Authorization: Basic找明文凭证。

    实操心得:字符串搜索时,注意切换“区分大小写”选项。有些攻击会使用大小写混淆(如UnIoN SeLeCt)来绕过简单的WAF规则。此时应关闭大小写敏感进行搜索。

  • 使用显示过滤器匹配负载内容:更精准的做法是使用http contains过滤器。例如:
    • http.request.uri contains “select”查找URI中包含select的请求。
    • http.file_data contains “<?php”查找HTTP数据体中包含PHP标签的内容(可能在上传WebShell)。
    • 这个过滤器的优势是能实时应用,并与其他过滤器组合,如http.request.method==”POST” && http.file_data contains “cmd=”

3.3 第三层分析:会话重组与文件导出

攻击者上传的WebShell、窃取的数据文件,往往以HTTP文件传输的形式存在。Wireshark可以重组会话并导出文件。

  • 跟踪TCP流:在任何一个HTTP数据包上右键,选择追踪流->TCP流。Wireshark会将整个TCP会话的请求和响应内容重组,并以ASCII(或EBCDIC, Hex Dump)形式在一个窗口显示。这里你可以清晰地看到一次完整的交互,对于分析WebShell的指令回显、文件上传内容至关重要。
  • 导出HTTP对象:点击菜单文件->导出对象->HTTP...。Wireshark会列出所有捕获到的HTTP传输的文件(如图片、JS、CSS、文档等)。你可以在这里直接看到文件名、内容类型和大小,并可以导出保存。这是寻找被上传的WebShell文件(如.jpg后缀的PHP木马)或被窃取文件的利器。重点关注异常的文件名、与网站类型不符的Content-Type(如一个图片URL却返回text/html),或者异常大的文件。

3.4 第四层关联:统计与端点分析

当怀疑存在扫描或暴力破解时,需要从宏观视角看流量模式。

  • 统计 -> 对话:点击菜单统计->对话。查看TCP或UDP标签页。这里按IP地址对列出了所有通信会话,并显示了数据包数、字节数。寻找那些与目标IP有大量、短小会话的源IP。例如,一个外部IP与你的服务器在短时间内建立了上百个TCP会话,但每个会话只交换了3-5个数据包(对应一次HTTP请求和响应),这极有可能是自动化扫描。
  • 统计 -> HTTP -> 请求序列:这个功能可以直观地看到每个主机对(客户端-服务器)的HTTP请求序列,有助于发现针对特定路径的集中访问。

通过这四层递进式的分析策略,我们就能从海量数据中,一步步抽丝剥茧,将可疑的流量会话孤立出来。下面,我们结合一个模拟的pcap文件,进行具体的案例剖析。

4. 案例实战:剖析一个多攻击场景的PCAP文件

(假设你已加载我提供的attack_trace.pcapng文件)。这个文件模拟了一个小型企业网站遭受的一系列常见攻击。让我们一步步拆解。

4.1 场景一:SQL注入攻击的痕迹

第一步:寻找异常状态码。应用过滤器http.response.code == 500。我们立刻发现几个来自IP192.168.1.100192.168.1.10的请求返回了500错误。

第二步:深入分析其中一个会话。选中一个500响应的数据包,追踪其TCP流(右键 -> 追踪流 -> TCP流)。在流内容窗口中,我们清晰地看到:

GET /product.php?id=1' AND '1'='1 HTTP/1.1 Host: victim.com ...

以及服务器的响应:

HTTP/1.1 500 Internal Server Error ... Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version...

结论:攻击者正在对product.phpid参数进行基于布尔逻辑的SQL注入测试。单引号'导致了SQL语法错误,服务器返回了详细的数据库错误信息,这属于“错误型注入”。攻击痕迹非常明显:异常的引号、SQL逻辑片段以及泄露数据库类型的错误响应。

4.2 场景二:WebShell上传与连接

第一步:筛选POST请求和大文件传输。应用过滤器http.request.method == “POST”。浏览列表,发现一个向/upload.php发起的POST请求,其Content-Typemultipart/form-data

第二步:检查上传内容。对这个数据包追踪TCP流。在流中,我们可以找到Content-Disposition: form-data; name=”file”; filename=”shell.jpg”,但紧接着的文件内容却以<?php @eval($_POST[‘cmd’]);?>开头。这是一个典型的图片马(将WebShell代码嵌入图片文件)。

第三步:寻找后续连接。在流窗口底部,将显示模式从“ASCII”切换到“原始数据”,可以更清楚地看到整个结构。关闭流窗口后,我们需要寻找攻击者后续连接这个WebShell的证据。使用过滤器http contains “cmd=”。我们发现来自同一攻击者IP (192.168.1.100) 对/uploads/shell.jpg发起了新的POST请求,请求体为cmd=whoami。追踪这个新会话的TCP流,可以看到服务器响应了www-data结论:攻击者成功上传了伪装成图片的WebShell,并通过POST参数cmd执行了系统命令,获得了回显。

4.3 场景三:敏感信息泄露与目录遍历

第一步:搜索敏感路径。在过滤器栏使用http.request.uri contains “etc”。我们发现一个请求:GET /../../../../etc/passwd HTTP/1.1

第二步:分析响应。追踪该请求的TCP流。服务器返回了状态码200 OK,并且响应体中完整列出了/etc/passwd文件的内容。结论:攻击者利用目录遍历漏洞成功读取了系统敏感文件。在流量中,异常的../序列和成功的200响应,共同构成了攻击证据。

4.4 场景四:暴力破解攻击

第一步:宏观统计。打开统计->对话->TCP标签页。按数据包数量排序。我们发现IP192.168.1.200与服务器192.168.1.10的会话数量异常多(比如200个),但每个会话的字节数都很小。

第二步:聚焦分析。对192.168.1.200应用过滤器ip.src == 192.168.1.200 && http。浏览请求,发现几乎全部是POST /login.php请求,且每个请求的CookieSession ID都不同,但表单数据中的用户名密码在不断变化。结论:这是典型的暴力破解攻击,攻击工具使用不同的会话标识来尝试大量用户名密码组合。其特征是:高频率、同路径、多会话、短内容。

通过这个综合案例,我们可以看到,不同类型的攻击在流量中留下的“痕迹”各有特点。SQL注入关注参数和错误响应;WebShell关注文件上传和后续的指令交互;信息泄露关注异常路径和成功响应;暴力破解则关注会话频率和模式。将这些分析技巧组合使用,就能构建起强大的HTTP流量威胁狩猎能力。

5. 高级技巧与排查心法

掌握了基本流程后,一些高级技巧和心法能让你事半功倍,并处理更隐蔽的攻击。

5.1 解密HTTPS流量

现代网站普遍使用HTTPS,这给流量分析带来了挑战。要解密HTTPS,你需要服务器的私钥。

  • 方法:在Wireshark中,进入编辑->首选项->Protocols->TLS。在(Pre)-Master-Secret log filename中,指定一个文件,然后在Web服务器(如Nginx, Apache)或客户端配置中,将TLS会话密钥导出到这个文件。Wireshark在加载pcap时,会用此文件解密对应的HTTPS流量,使其像HTTP一样可读。
  • 注意:这通常用于分析自己可控的测试环境或配合业务部门进行内部排查。无法解密未知服务器的HTTPS流量。

5.2 使用tshark进行自动化分析

对于需要批量分析大量pcap文件或集成到自动化流水线中的场景,Wireshark的命令行版本tshark是首选。

  • 示例命令
    # 提取所有HTTP请求的URL和源IP tshark -r attack_trace.pcapng -Y "http.request" -T fields -e ip.src -e http.request.uri # 统计每个源IP发起的HTTP请求数量(用于发现扫描源) tshark -r attack_trace.pcapng -Y "http.request" -T fields -e ip.src | sort | uniq -c | sort -nr # 搜索包含”union”的请求,并输出完整数据包详情 tshark -r attack_trace.pcapng -Y "http.request.uri contains \"union\"" -V
    通过编写脚本组合这些命令,可以实现自动化的攻击特征提取和报告生成。

5.3 心法:保持怀疑与关联上下文

  • “正常”的异常:攻击者会尽力伪装。一个User-Agent是正常Chrome浏览器的请求,其POST数据里可能藏着SQL注入。不要仅凭UA过滤。
  • 关注成功响应后的流量:一个成功的SQL注入攻击后,攻击者可能会紧接着发起一个LOAD_FILE()请求读取文件,或者尝试通过INTO OUTFILE写入WebShell。一个成功的登录后,攻击者可能会访问/admin/路径。将流量按时间线和会话关联起来看。
  • 结合其他协议:一次完整的攻击链可能涉及多种协议。例如,HTTP漏洞利用获取Shell后,攻击者可能通过DNS隧道外传数据(异常的、大量的TXT类型DNS查询),或通过ICMP隧道建立连接。在分析完HTTP后,不妨看看DNS和ICMP流量是否有异常。
  • 基线比对:如果你有正常业务时段的流量基线,可以将可疑时间段的流量特征(如访问的URL集合、各状态码比例、请求速率)与基线进行对比,更容易发现偏差。

6. 常见陷阱与排查实录

在实际操作中,你肯定会遇到各种困惑和问题。这里记录几个我踩过的坑和对应的解决方案。

问题1:过滤器语法正确,但什么也过滤不出来?

  • 可能原因A:协议端口问题。Wireshark默认只将80、8080等端口识别为HTTP。如果你的Web服务跑在8000端口,直接过滤http是无效的。你需要先使用tcp.port == 8000过滤,然后对其中一个数据包右键解码为...,将其设置为HTTP协议,或者使用更通用的过滤器tcp.port == 8000 and (tcp contains “GET” or tcp contains “POST” or tcp contains “HTTP/1.”)
  • 可能原因B:数据包不完整或损坏。如果TCP流不完整(缺少SYN/ACK或FIN/RST),Wireshark可能无法正确重组应用层协议。检查分析->专家信息,看看是否有大量“乱序”、“重传”、“丢包”的警告。
  • 排查步骤:先尝试一个最简单的过滤器,如ip.addr == [目标服务器IP],确认数据包存在。然后逐步增加条件。

问题2:追踪TCP流时,内容显示乱码或无法识别?

  • 可能原因:该流可能是加密的(HTTPS且未解密)、压缩的(如gzip编码),或者是非文本的二进制数据(如图片、加密文件)。
  • 解决方案:在TCP流窗口的左下角,尝试切换“显示数据为”的选项,从“ASCII”切换到“原始数据”或“C Arrays”。对于gzip压缩,Wireshark通常会自动解压显示。如果怀疑是自定义加密,则需要结合其他线索分析。

问题3:如何区分是自动化扫描还是真实用户的密集操作?

  • 关键区别点
    • 请求头:扫描器User-Agent往往比较固定或特殊;真实用户浏览器UA多样且新。
    • 请求路径:扫描器会系统性地访问/admin//phpmyadmin//backup/等常见路径;真实用户访问的路径符合业务逻辑。
    • 请求参数:扫描器发起的请求,其参数可能是测试用的Payload(如?id=1'),而真实用户参数是正常业务数据。
    • 会话连续性:真实用户的一个会话(同一TCP连接或同一Session ID)内,会有一系列有逻辑关联的请求(如首页->登录->个人中心);扫描器的会话通常短且孤立,请求之间无业务关联。
    • 时间规律:扫描请求间隔可能非常均匀(如每秒一次),而人工操作间隔不规则。

问题4:导出HTTP对象时,看不到疑似WebShell的文件?

  • 可能原因:攻击者可能使用了分块传输编码(Transfer-Encoding: chunked)或对Payload进行了多重编码,导致Wireshark的HTTP对象导出功能无法正确识别文件边界和内容。
  • 替代方案:找到上传请求的TCP流,手动将http.file_data部分(在流窗口中)复制出来,保存为文件。或者,使用tshark命令更精确地提取:tshark -r trace.pcap -Y “http.request.method==POST and http.request.uri contains ‘upload’” –export-objects http,./exported_files。然后去exported_files目录下仔细检查。

问题5:攻击者IP是伪造的或来自代理/ Tor网络怎么办?

  • 应对策略:在这种情况下,基于源IP的关联会失效。你需要更依赖行为特征目的特征。例如,无论来自哪个IP,只要对/wp-login.php发起高速率的POST请求,就是暴力破解行为。重点分析攻击的目标URL、使用的Payload、攻击的时间模式,将这些作为核心特征进行筛选和告警。

最后,我想说的是,流量分析是一门“经验科学”。看得越多,对正常流量和异常流量的“感觉”就越准。最好的学习方法,就是自己搭建一个靶场环境(如DVWA、WebGoat),用工具(如sqlmap, burpsuite)发起真实的攻击,同时用Wireshark抓包,然后对照着攻击工具发出的数据包和Wireshark里的记录,去理解每一个攻击向量在协议层面是如何体现的。我提供的那个pcap文件,就是基于这种思路构造的。多练几次,你就能形成自己的分析直觉,在真正的应急响应中,快速地从一片流量的海洋里,钓出那条危险的“鱼”。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询