ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

渗透测试必学:HTTP协议核心机制与抓包改包实战拆解

渗透测试必学:HTTP协议核心机制与抓包改包实战拆解 1. 为什么搞渗透必须先啃透HTTP协议先说结论不管你是刚开始学安全测试还是已经能跑通几个漏洞利用工具HTTP协议都是躲不开的一道坎。我做安全这行也有十年了带过的新人不少凡是基础扎实的几乎都有一个共同点——能把HTTP协议的报文结构、交互流程、状态码含义讲得明明白白。而凡是上来就急着学注入、学越权、学抓包改包的往往会在后面某个环节被一个小小的请求头问题卡死回头补课的成本远高于当初慢慢啃协议。HTTP协议全称是HyperText Transfer Protocol超文本传输协议它是Web世界里最基础的通信语言。浏览器和服务器之间怎么打招呼、怎么传数据、怎么告诉对方“你请求的内容不存在”或者“你没权限访问”全靠这套规则来约定。而渗透测试的本质说白了就是“理解正常业务是怎么跑的然后找办法让它跑出非预期的结果”。不理解正常流程你连从哪里下手都不知道更别提判断哪些异常是漏洞、哪些异常只是服务器的正常反应。平时大家说得最多的几个词——抓包、改包、重放、参数污染、会话伪造底层全部围绕HTTP协议展开。抓包抓的就是HTTP报文改包改的就是请求行、请求头、请求体里的字段重放就是把一个合法的HTTP请求原封不动再发一次然后观察服务器的反应。所以我把HTTP协议称为“渗透测试的地基”你想在这个行业走远一点这块地基就得打得够深。这篇文章的内容定位是给准备入门安全测试、或者已经入门但HTTP基础还不牢的朋友做一次完整的HTTP协议拆解。我尽量不写废话从协议本身的原理讲到实际排查中的坑全部是能直接拿来用的硬货。学完你至少能具备两个能力第一看到任意一个HTTP请求包能快速说清楚每个部分的作用和风险点第二自己动手构造HTTP请求的时候知道该改哪里、不该改哪里以及改完以后预期看到什么现象。2. HTTP协议的核心机制先搞清楚它到底是怎么工作的2.1 请求-响应模型一问一答的“点餐”模式HTTP协议的工作模式特别像你去餐厅点菜。你坐下以后服务员过来你告诉他想吃什么这是请求服务员把菜单传到后厨后厨做好菜再由服务员端到你面前这是响应。整个过程中永远是你先开口餐厅才会回话不存在餐厅莫名其妙先给你端一盘菜的情况。这套机制用专业术语讲叫做请求-响应模型。客户端通常是浏览器或者是安全测试工具发起一个请求服务器处理这个请求然后返回一个响应。一来一回一次完整的HTTP交互就算结束了。这里面有两个非常关键的特点和渗透测试关系极大。第一个特点是HTTP协议本身是无状态的。什么叫无状态就是服务器默认“不记得”你。你第一次请求一个页面服务器返回给你你紧接着第二次请求同一个页面服务器完全不知道这是同一个人干的。它对每一次请求都当作全新来访者处理不会因为你们刚刚聊过就对你特别关照。这个设计早年是为了让服务器处理压力小一些毕竟互联网早期页面比较简单不需要记太多东西。但到了今天我们需要登录购物网站、需要保持登录状态、需要把商品加进购物车这些功能全都依赖“服务器记得你是谁”。怎么办后人就在HTTP协议之上加了一层机制叫做会话跟踪最常见的实现方式就是Cookie。关于Cookie的知识点我后面会专门展开它是安全测试里非常高频的一个考察点。第二个特点是报文结构是纯文本的。也就是说你在网络上传输的HTTP数据包即便不经过任何解密直接看也是能读懂的英文和符号不是二进制乱码。这对安全测试来说是天大的好消息意味着你可以用任何文本编辑器、任何抓包工具直接看到请求和响应的完整内容不需要去做额外的解码工作。你后面学抓包、学构造恶意请求大量工作就是在和这些纯文本字段打交道。2.2 HTTP的“传输管道”TCP和端口别只盯着应用层学HTTP协议的时候很多人会忽略一个问题HTTP它自己其实不负责把数据从一台机器搬到另一台机器。它只是一个“约定用语”的协议真正干搬运活的是它底层的TCP协议。你可以这么理解HTTP是写在货物包装盒上的说明文字而TCP是那辆负责把盒子运到目的地的卡车。没有卡车包装盒写得再漂亮也没用。这套分层体系就是我们常说的TCP/IP四层模型。从上往下依次是应用层、传输层、网络层、网络接口层。HTTP属于应用层TCP属于传输层IP属于网络层。每一层各司其职上层的数据封装好后交给下层传输下层收到数据后再一层层解封装递给上层。这个封装和解封装的过程在你用抓包工具看数据的时候体现得特别明显——你看到的Hex数据区里前面的几十个字节是TCP头、IP头再往后才是真正的HTTP内容。HTTP默认工作在TCP的80端口HTTPS默认工作在TCP的443端口。什么叫端口你可以把它理解成服务器上的一扇门。一台服务器可能同时运行着Web服务、邮件服务、数据库服务它们靠不同的端口区分开。客户端请求Web页面的时候会主动连接服务器的80端口建立TCP连接然后在这条连接上发送HTTP请求。提示做安全测试时判断目标端口是否开放、是什么服务这属于信息收集阶段的基本功。你连目标开没开80、443都不知道后面的测试就无从谈起。端口扫描工具Nmap在默认情况下做的就是这件事但它的底层原理其实也依赖TCP协议的三次握手机制。有兴趣的可以顺着这个方向深入研究。2.3 HTTP的版本演进安全和性能往往是博弈HTTP协议从1991年的0.9版本发展到今天的HTTP/3中间经历了几个重要版本。很多新手觉得版本只是数字区别不重要但在实际测试中版本差异会直接影响你的测试手段和漏洞判断。HTTP/1.0和HTTP/1.1是早些年绝对的主流。HTTP/1.1在1997年发布引入了持久连接也叫Keep-Alive允许在同一个TCP连接上连续发送多个请求不用每请求一次就重新建立连接性能提升巨大。它也是目前许多老系统、内网系统仍然在用的版本。从安全测试角度看HTTP/1.1的请求报文结构是最经典的绝大多数教材和工具都以它为例。HTTP/2在2015年正式标准化引入了二进制分帧、多路复用、头部压缩、服务器推送等新特性。它最大的变化是传输的数据不再是你熟悉的纯文本格式而是被切分成一个个二进制帧。这给抓包工具带来了麻烦——你直接看网络上抓到的字节流是乱码必须靠工具解析还原成可读的HTTP语义。目前互联网上主流站点基本都支持HTTP/2特别是Google系的服务很早就是HTTP/2的坚定推行者。安全测试里如果遇到HTTP/2目标Burp Suite这类工具是可以自动解析的你不需要手动去拼二进制帧但你要知道它底层机制和HTTP/1.1不同某些针对HTTP/1.1的注入或走私手法不一定适用。HTTP/3则更进一步把底层的TCP换成了基于UDP实现的QUIC协议主要目标是降低连接建立的延迟。就目前的安全测试场景而言多数工具的兼容性还在完善中遇到HTTP/3目标的概率相对低一些。但作为基础了解至少要知道有这么回事。我的观点是当前阶段你把HTTP/1.1的报文结构、请求方法、头部字段、状态码吃透已经能覆盖90%以上的渗透测试基础场景。HTTP/2和HTTP/3的很多新机制是在HTTP/1.1的地基之上做的优化核心语义没有变别被版本吓住。3. 请求报文拆解从请求行开始逐字节看门道一次完整的HTTP请求由三个部分组成请求行、请求头、请求体。响应的结构则是状态行、响应头、响应体。两边结构是对称的也好记。这三个部分之间的关系用实话说就像你填一张快递单请求行是“我要寄什么、寄给谁”的摘要请求头是“重量多少、要不要保价、装什么箱子”的附加说明请求体是“箱子里面真正装的东西”。快递单没写清楚摘要分拣员看不懂附加说明写错快递可能损坏箱子里装的东西才是收件人真正关心的。3.1 请求行方法、URL、版本的三元组请求行是整个请求的第一行也是信息量最集中、安全测试中修改频率最高的一行。它由三个部分组成用空格隔开。以这样一个请求行为例POST /api/v1/login HTTP/1.1第一部分是请求方法这里是POST。第二部分是请求URI也就是你想让服务器处理哪个资源这里是/api/v1/login。第三部分是HTTP版本这里是HTTP/1.1。请求方法是整个请求行里最值得花时间研究的。HTTP协议标准的请求方法有这么几个GET请求获取服务器上的某个资源比如打开一个页面、获取一张图片。GET请求的参数通常放在URL里也就是问号后面的部分例如GET /search?qhttpprotocol HTTP/1.1。因为参数在URL里可见所以它不适合传输敏感信息。POST向服务器提交数据比如登录时提交用户名密码、发表一篇文章。POST请求的参数放在请求体里URL上看不到但这仅仅意味着“不是显式可见”不代表它更安全。抓包一样看得到。PUT向服务器上传一个资源语义是把请求体里的内容整体替换到指定URI上。在实际业务中如果有接口开放了PUT方法且没有做权限校验攻击者可能利用它直接“覆盖”服务器上的文件这是一个非常严重的安全隐患。DELETE请求删除指定URI的资源。听起来危险实际业务中开放DELETE方法且无鉴权的案例也确实出现过测试时如果看到一个陌生的接口支持DELETE值得警惕。HEAD和GET很像但服务器只返回响应头不返回响应体。它常用于探测一个资源是否存在、服务器是什么类型。安全测试的信息收集阶段HEAD方法很好用因为返回的数据量小效率高。OPTIONS询问服务器支持哪些请求方法。这个在测试中常用于探测目标服务器的“能力边界”有些服务器配置不当会把PUT、DELETE这些危险方法也罗列出来这就是一个明显的风险信号。TRACE用于回显客户端发送的请求主要用于诊断但因为存在跨站追踪攻击的风险正规服务器通常会禁用。这里必须说明一点HTTP协议规范定义了这些方法但服务器支不支持、业务怎么用是开发人员代码里决定的。安全测试时你真正需要关心的是“目标服务器实际开放了哪些方法”以及这些方法能否被滥用。请求URI部分在安全测试里频繁出现两类关注点。第一类是路径遍历比如请求GET /../../etc/passwd HTTP/1.1目的是绕过访问控制去读服务器上的任意文件。这类测试能否成功取决于服务器对URI的处理逻辑后面我会举例展开。第二类是参数注入所有跟在问号后面的键值对都可能成为注入点比如?id1就可能存在SQL注入?page2可能存在越权访问。实操心得新手刚学抓包改包时我建议你先别急着改参数而是花几天时间把正常访问一个网站时抓到的一堆请求逐条拆开看。看请求行里的方法和URI是什么看请求头里带了哪些字段看哪些字段是浏览器自动加的哪些是网站业务自定义的。等你把“正常的”看吐了你再改一个参数对比反应你会对协议理解产生质变。这比我讲一千句话都管用。3.2 请求头容易被忽略的“元信息”里藏着一堆攻击面请求头是请求行下面的一系列键值对行每行格式是字段名: 值。它的作用是向服务器传递关于请求本身、客户端环境、内容格式等元信息。光看名字你可能觉得它只是些补充说明但在我眼里请求头是安全测试中信息量排第二的富矿。下面这些请求头是高频出现的每个都值得你记住Host必选字段表示请求要发送到的主机名和端口号。服务器处理多个域名时就是靠Host字段来区分该把请求路由到哪个虚拟主机上。安全测试里有个经典场景叫Host头攻击当服务器错误信任Host字段时攻击者可以把它改成任意值从而造成密码重置链接劫持、缓存污染等问题。User-Agent客户端的身份标识浏览器类型、版本、操作系统信息都在里面。服务器经常根据User-Agent判断客户端类型然后返回不同的内容。安全测试里它常被用来“伪装”但更值得关注的是有些服务器会依据User-Agent做安全策略比如拦截某些老版本浏览器你要是改一个陌生的UA可能会触发它的异常检测。Referer表示当前请求是从哪个页面跳转过来的。服务器有时用它做防盗链有时用它做CSRF防御的判断依据。但我要强调Referer并不是一个可靠的鉴权因素因为它可以随意伪造。测试时如果看到某个接口只用Referer做校验这是一个值得深入测试的点。Cookie携带客户端保存的会话标识或业务信息。服务器靠它识别用户身份。安全测试里Cookie是重头戏——Session ID是不是可预测、有没有加HttpOnly属性、是不是固定不变全都值得测。Content-Type表示请求体的媒体类型。这个字段我在下面讲请求体时会单独展开它是POST请求里安排参数格式的关键也是文件上传、解析绕过等漏洞的多发地。Content-Length请求体的字节长度。服务器会根据这个值来读取请求体内容。安全测试中如果手动修改了请求体但没有同步修改Content-Length服务器可能报错或者截断数据这是一个非常常见的踩坑点。Accept客户端声明自己能接受的响应内容类型。服务器会参考这个字段决定返回什么格式的数据。测试时如果看到接口支持返回JSON又支持返回XML那这个接口很可能存在XXEXML外部实体注入的测试空间。Authorization用于HTTP身份认证常见的有Basic认证和Bearer Token认证。Basic认证是把用户名密码用Base64编码后放在这个字段里注意Base64不是加密它只是编码抓包看到Authorization字段里那一串“dXNlcjpwYXNz”之类的东西解码后直接就是明文密码。X-Forwarded-For代理服务器转发请求时用来记录客户端的真实IP。这个字段是可以由客户端自己伪造的很多早期的业务系统用它来做IP白名单校验结果被一个简单的请求头伪造直接绕过。你数一下上面随便一个字段拎出来都能延伸出至少一类安全测试场景。所以我为什么反复强调HTTP协议是基础因为你连Host头污染和X-Forwarded-For伪造的原理都搞不清楚你写了半天漏洞报告可能连漏洞是怎么被利用的都说不出个所以然。3.3 请求体与POST的几种编码格式解析绕不过去请求体不是每个请求都有。GET请求一般没有请求体参数都在URL里POST请求通常有请求体用于提交数据。而请求体的格式不只有一种最常见的是下面三种它们直接由Content-Type请求头决定这个对应关系必须记牢。第一种application/x-www-form-urlencoded。这是HTML表单默认的提交格式也是遇到最多的。它的特点是提交的数据以键值对形式排列用连接键和值用连接并且会对特殊字符做URL编码比如空格变成%20汉字变成多个%XX字节。举个例子一个登录请求的请求体可能是这样usernameadminpassword123456remember1这种格式安全测试你最常打交道因为SQL注入、XSS这类经典漏洞很多就是在这些参数值里做文章的。第二种multipart/form-data。这种格式主要用于文件上传比如你上传头像、上传附件。它的特点是请求体被一个随机生成的边界标记boundary分割成多个部分每个部分有自己的Content-Disposition标明了字段名、文件名以及内容的类型。一个简化的上传请求体会像这样------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; namefile; filenametest.jpg Content-Type: image/jpeg [这里是文件的二进制内容] ------WebKitFormBoundary7MA4YWxkTrZu0gW--注意边界标记是--加上一串随机字符每部分内容前面要空一行。这个格式看着繁琐但你在抓包工具里改起来其实很方便——改文件名、改Content-Type、改文件内容都是文件上传漏洞测试里的标准操作。第三种application/json。这是前后端分离架构兴起后最常见的格式请求体是一段JSON字符串{username:admin,password:123456}相比于表单格式JSON格式的结构更清晰但也给安全测试带来了一个老问题服务器如果直接用JSON里的键值对去拼SQL或拼接命令注入效果往往比表单格式更隐蔽。而且一些WAF对JSON格式的内容解析不完整存在绕过空间。注意修改请求体之后一定要确认Content-Length是否同步更新。很多抓包工具比如Burp Suite在你修改了请求体后会自动重算Content-Length但某些情况下你手动改包后它不会自动刷新会导致请求一直发不出去或者被服务器判定为异常。这个细节是我带新人时反复强调的高频问题十个人里有八个会在这一开始踩坑。4. 响应报文拆解状态码和响应头都是“情报”请求发出去了服务器会返回一个响应。响应的结构也有三部分状态行、响应头、响应体。如果说请求报文的重点是“我该怎么问”那响应报文的重点就是“我该怎么判断答案”。4.1 状态码三位的“判决书”每个数字都有含义状态行里最重要的就是那个三位数字的状态码。它告诉客户端这次的请求服务器到底处理成什么样了。状态码按第一位数字分为五类1xx信息性状态码。服务器收到了请求正在处理但还没有最终结论。实际业务中很少遇到可能在长连接切换协议时出现。2xx成功状态码。请求被成功处理了。最典型的是200 OK表示一切正常201 Created表示资源创建成功通常出现在POST新增数据的接口里204 No Content表示成功但响应体为空常见于删除操作的接口。3xx重定向状态码。表示服务器让你去别的地方拿资源。301 Moved Permanently是永久重定向302 Found是临时重定向浏览器拿到302后会根据响应头里的Location字段自动跳转到新地址。安全测试里关注302有两个原因一是很多登录接口用302实现跳转判断登录成功与否要看跳转目标二是存在开放重定向漏洞攻击者可以让用户从合法站点跳到钓鱼站。4xx客户端错误状态码。请求有问题。400 Bad Request表示请求格式错误通常是你改包改坏了401 Unauthorized表示未认证你需要提供账号密码或Token403 Forbidden表示服务器理解你的请求但你没有权限访问这是鉴权失败最常见的标志404 Not Found表示资源不存在但注意有些接口在权限不足时故意返回404来隐藏真实资源的存在。5xx服务器错误状态码。500 Internal Server Error是服务器内部错误通常意味着程序抛了未捕获的异常这恰恰是安全测试里最值得兴奋的现象——它说明服务器在处理你的特殊输入时出现了逻辑问题往往离漏洞不远502 Bad Gateway是网关错误通常是反向代理后面的服务挂了503 Service Unavailable表示服务暂时不可用可能是过载或正在维护。我经常跟新人说一句话状态码不是你判断漏洞的唯一依据但它是最重要的“风向标”。比如你提交一个单引号响应从200变成500这几乎等同于服务器在告诉你你的输入触发了SQL相关的异常。反过来如果你改一堆参数响应全都是200但页面内容完全没变化那说明你的输入可能根本没到达业务逻辑层。4.2 响应头安全配置的“体检报告单”响应头里藏着服务器端对安全防护的态度是安全测试时绝对不要忽略的信息源。几个关键字段如下。Server直接暴露服务器的软件名称和版本号比如Server: nginx/1.18.0或者Server: Apache/2.4.29 (Ubuntu)。版本号一出来你就能去查这个版本有没有已知CVE漏洞这一条信息在校测试中能节省大量时间。X-Powered-By标识后端技术栈比如X-Powered-By: PHP/7.4或者X-Powered-By: Express。它和Server一样是信息收集阶段的直接线索。Set-Cookie服务器让客户端保存Cookie的指令。每次响应里出现一个Set-Cookie都值得留意。一个是它的值看起来是否随机、是否有规律另一个是它后面跟的属性标志——HttpOnly属性表示Cookie不能被JavaScript读取能有效降低XSS窃取会话的风险Secure属性表示只在HTTPS连接下才发送SameSite属性用来限制跨站请求中携带Cookie是CSRF防护的重要机制。有些老系统的Cookie没有这些属性这就是潜在的安全隐患。Strict-Transport-SecurityHSTS告诉浏览器强制使用HTTPS访问并且有效期是多少。如果一个网站在HTTP和HTTPS之间切换不顺畅或者根本没有HSTS头那它可能存在中间人劫持的测试面。Content-Security-PolicyCSP内容安全策略用于限制页面可以加载和执行哪些资源。CSP配置不当是XSS利用里的常见难点如果服务器启用了宽松或错误的CSP攻击者的注入脚本才有执行空间。Access-Control-Allow-Origin跨域资源共享里的关键头指定哪些来源的页面可以跨域访问本接口。如果这个值配置成*星号意味着任意网站都能跨域读取这个接口的响应。假如这个接口返回的是用户手机号、身份证这类敏感信息那问题就很严重了。我建议你做安全测试时拿到响应头先不要急着关掉养成逐项扫一遍的习惯。很多敏感信息泄露漏洞不需要复杂的注入技术光靠响应头里的字段就能直接发现并出报告。4.3 响应体编码、注释和调试信息里常有意外收获响应体是服务器真正返回给你的内容可能是HTML页面、JSON数据、一份文件或者一个错误码。响应体的安全价值在于“字里行间”。第一类值得关注的是注释和调试信息。开发人员经常把SQL语句、文件路径、内部IP地址写在HTML注释里比如!-- 查询语句: SELECT * FROM users WHERE id1 --或者!-- 调试模式请勿删除 --。这些对安全测试都是免费的情报。第二类是错误信息。很多框架的默认错误页会暴露出详细的堆栈信息、数据库版本、操作系统路径比如一个未处理的SQL异常页面直接打印出完整的SQL语句和报错位置这意味着你几乎拿到了半个后门钥匙。如果你在测试时看到类似关键字样式的冗长错误页面别急着报告“服务器报错”先仔细看它报了什么可能是SQL错误、反序列化错误、文件路径错误每一种都对应不同的利用方向。第三类是编码与字符集。有些页面返回的数据是GBK编码、UTF-16编码或者做了Base64编码、URL编码。你如果直接用可视化视图去读往往看到一堆乱码误以为数据异常。实际上这是响应体的编码方式问题。抓包工具通常会自动识别但如果识别错了你可以手动切换编码查看原始内容。实操心得我测试一个站点的时候拿到响应体第一件事不是看页面效果而是先看它的原始报文把里面所有注释、隐藏字段、JS文件路径都过一遍。这些地方藏着的信息往往要比你在页面上看到的“正常内容”有价值得多。5. 从HTTP协议出发安全测试的重头戏在哪里5.1 抓包改包你每天都在和协议打交道讲到这一步终于要落到实际操作了。渗透测试里最日常的操作就是抓包和改包而这两件事的核心引擎就是对HTTP协议的理解。抓包工具有很多主流的包括Burp Suite浏览器代理抓包、Fiddler、Charles以及命令行下常用的Curl。Burp Suite应该算安全测试领域的事实标准。它的工作原理很简单它在你本机起一个代理服务浏览器和它之间走一边它和目标服务器之间走另一边。你在浏览器里访问目标网站请求先到BurpBurp再转发给服务器服务器的响应先回BurpBurp再转给你浏览器。你在Burp的界面里看到的就是这个转发过程中被“截停”的完整HTTP报文。改包就是在截停之后、转发之前动手修改报文内容。你可以把GET改成POST可以把User-Agent改成一个不存在的值可以把请求体的SQL注入payload塞进去也可以把Cookie里的Session ID换成一个伪造的值。每一次修改都是在对协议规则做测试。这里有个很重要的概念Burp是一个HTTP协议的“中间商”它只在协议层做转发不做任何业务逻辑判断。所以你改包时只要改动后的请求仍然符合HTTP协议规范它就会原样转给服务器。至于服务器能不能识别那是服务器的事情Burp不管。这也是为什么它被称为“万能改包器”——协议本身允许的它都允许。新手刚上手抓包时最容易遇到的一个问题是为什么打开Burp以后浏览器访问不了任何网站了因为浏览器把流量交给了Burp的代理但Burp默认的CA证书没有被系统信任HTTPS连接就会失败。你需要把Burp的证书导入到系统或浏览器的受信任证书库里。这个过程每个版本略有差异但核心逻辑是一样的让本机信任Burp这个“中间人”。提示你在公司或学校环境里做安全测试之前一定要先确认测试授权。本机搭建的靶场、CTF练习环境、有书面授权的授权测试这些都是可以安心动手的范畴。没有授权就去测试别人的系统那不是安全研究那是一条有法律风险的路这一条我强调多少遍都不为过。5.2 参数操纵每一处用户输入都可能成为突破口HTTP协议里凡是能被客户端控制并发送到服务器的数据安全上都称之为“用户输入”。用户输入的范围比你想的广——不只是登录框里输入的密码URL路径、请求头、Cookie、请求体里的所有参数全都是用户输入。参数操纵的基本流程是识别参数修改参数观察反应。举个例子一个查询订单的接口GET /order/query?id1001 HTTP/1.1id就是用户输入。你把它改成1002、1003如果响应里出现了其他人的订单信息这就是一个典型的越权漏洞IDOR。这个漏洞的形成原因是服务器没有校验“当前登录用户”和“订单归属用户”是否一致与你改的协议本身没有复杂关系纯粹是业务逻辑问题。而HTTP协议在这里扮演的角色是“通道”——它保证了你的请求能到达业务处理逻辑剩下的事就要看业务代码怎么处理了。参数操纵里一个非常重要的分支是注入类攻击。SQL注入、命令注入、XSS本质上都属于“用户输入被当成代码或指令执行”的问题。以最简单的SQL注入为例服务器如果在拼接SQL语句时没有使用参数化查询而是直接把请求体里的字符串拼进去SELECT * FROM users WHERE username admin AND password 123456如果攻击者把password修改为 OR 11拼接后的语句就变成SELECT * FROM users WHERE username admin AND password OR 11因为11永远为真整个WHERE条件就变成了永真条件攻击者不需要知道密码也能登录。这个经典例子里HTTP协议的贡献只是“承载了payload”真正的原因是代码层面的SQL语句构造方式。所以学HTTP协议从来不是为了“协议本身”而是为了理解和操控这条“攻击面通道”。协议给你的是一张地图让你知道数据从哪里进来、经过哪些环节、最终到达哪里然后你才能决定在哪个节点上做手脚。5.3 协议层面的边界问题请求走私与解析差异有些漏洞的根源是协议规范本身的模糊地带它们的利用思路也更有意思。我说两个具有代表性的一个是请求走私HTTP Request Smuggling一个是参数污染HPP。这类内容对于刚入门的朋友可能稍微有些深但我觉得了解了能帮你打开视野HTTP协议并非铁板一块不同实现之间是存在“理解偏差”的。请求走私的核心原理是前端代理服务器和后端服务器对同一个HTTP请求边界的认定不一致。HTTP/1.1协议允许在一个请求头里同时指定Content-LengthCL和Transfer-EncodingTE但对于同时出现两者时该以哪个为准协议规范没有完全说死。这就给了攻击者钻空子的空间你给前端代理看的请求可能是一个完整的请求但到了后端由于解析规则不同它会认为你是两个请求其中那个“多出来”的请求就成了被走私进去的请求。走私成功后攻击者可以劫持其他用户的请求、绕过前端WAF、进行缓存投毒危害相当大。参数污染HPP则更基础一些。它利用的是同一个参数名出现多次时不同服务器选择保留不同值的行为差异。比如请求?page1page2有的服务器取第一个值有的取第二个值有的把两个值都取出来拼接成列表。安全测试时你可以利用这种差异让WAF检查到的是安全值而业务逻辑使用的是攻击值从而绕过防护。这些高级玩法对于入门期来说不必深究但你需要建立起一个信念HTTP协议不是你脑子里那本静态的教科书它是一个被无数软件用各自的实现去解释的规则集合规则的缝隙里就是安全研究者和攻击者常年的战场。6. 抓包排错的常见问题直接照着抄就行这一节是我这些年带新人实际过程中沉淀下来的排错清单。每个问题都是真实发生过的每个解法也都是验证过有效的你可以把它当速查表用。6.1 场景一HTTPS证书报错抓不到443端口的内容现象打开Burp或Fiddler的代理后浏览器所有HTTPS网站打不开页面提示“您的连接不是私密连接”或证书错误。原因抓包工具为了解密HTTPS流量会以自己的CA证书替换服务器的证书本机不信任这个替换证书于是报错。解法把抓包工具的证书安装到操作系统的受信任根证书颁发机构列表。Burp的证书导出路径一般是http://burp下载后导入即可。安装完证书后重启浏览器这个问题基本九成能解决。避坑有些浏览器比如新版Chrome在启动时会使用自己的证书库而不是系统证书库这时还需要把证书导入到浏览器证书管理器中。另外HTTPS抓包默认就是“中间人解密”如果目标APP做了证书固定Certificate Pinning即使你装了抓包证书它也只会显示乱码或直接拒绝通信这叫“应用层反抓包”不是协议问题需要配合相关绕过技术但那就是另一个大话题了。6.2 场景二请求发出去了服务器一直回400 Bad Request现象手动改包后服务器直接返回400说请求格式错误但请求看起来好像没改错。原因大概率是请求头的格式不符合HTTP协议规范。常见的有三种一是行尾用了错误的换行符HTTP要求用CRLF回车换行也就是\r\n你如果用了\n某些严格的服务器会直接拒收二是改了Content-Length但长度算错三是请求头字段里有中文字符没有做编码处理。解法先用抓包工具的“自动修复”功能试试Burp里面按快捷键CtrlShiftU可以自动规范化请求如果还不行拿原始请求对照差异逐行检查再不行换一个工具比如直接用Curl重新构造请求排查看是不是工具本身的问题。6.3 场景三URL里的中文乱码接口识别不了现象请求参数中携带中文服务器返回乱码或者找不到资源。原因HTTP协议要求URL里的非ASCII字符必须经过百分号编码Percent-Encoding你直接在URL里写中文服务器无法确定解码方式自然出错。解法在抓包工具或构造请求时把中文用工具编码成UTF-8的百分号形式。比如“张三”编码后是%E5%BC%A0%E4%B8%89。大多数开发工具都提供URLEncode/URLDecode功能Burp的Decoder模块就能干这个。6.4 场景四状态码是200但响应内容是其他页面现象明明请求的是/admin但响应状态码是200页面内容却是首页。原因服务器做了统一入口的前端路由不管什么路径都返回同一个index.html由前端JS再根据URL去渲染不同页面。这在前后端分离架构里特别常见。处理这时候你就不应该只盯着HTTP响应看了得往前翻JS文件看前端路由是怎么定义的再根据路由去构造对应的API请求。这说明一个道理——HTTP响应只是第一层真实的数据交互逻辑往往藏在后续的异步请求里。6.5 场景五响应内容有乱码看起来像天书现象响应体里全是乱码或者出现一堆%XX之类的字符。原因两种可能。一是字符集不对服务器返回的是GBK编码你的工具按UTF-8解码就会乱码二是响应体被做了编码传输比如用Content-Encoding: gzip压缩过而工具没能自动解压。解法在工具里手动指定字符集Burp在Response的显示区域可以改编码或者手动做一次gzip解压。如果报文里看到了Content-Encoding: gzip你要知道这只是一个压缩传输技术不代表内容加密解压后一样是明文。7. 我给新手的HTTP协议学习路线按这个顺序走很多朋友问我怎么才能把HTTP协议学得又快又扎实。我给出一条路线不适合所有人但适合绝大多数想往安全测试方向走的初学者。第一步用浏览器开发者工具感受协议交互。打开任意网站的开发者工具F12切到Network标签刷新页面看每一个资源请求的Headers、Preview、Response。不需要改任何东西先看两天把“一个页面包含几十个HTTP请求”这件事从概念变成直观感受。第二步用Curl命令手动构造请求。Curl是命令行下的HTTP客户端支持自定义方法、自定义头、自定义请求体比浏览器更“赤裸”地接近协议本身。比如curl -v -X POST http://example.com/login -H Content-Type: application/x-www-form-urlencoded -d usernameadminpassword123456加上-v参数后Curl会把你发送的请求头和接收的响应头全部打印出来这是熟悉协议报文格式的绝佳方式。第三步学Burp Suite的基础抓包改包。把代理配好证书装好开始截停每一次请求练习修改请求头和请求体观察响应变化。这一步是检验前两步学了多少的关键改包能改出预期的结果你就真正上手了。第四步找一个本地靶场系统做系统性测试。推荐DVWADamn Vulnerable Web Application或者Pikachu这类专门用于安全学习的靶场在本地搭建好按照里面的模块去练习SQL注入、XSS、CSRF等漏洞测试。从一个HTTP请求出发到发现漏洞、确认漏洞、形成报告把全流程跑通一遍。第五步回头再精读HTTP协议规范RFC 7230系列。前面四步你已经有大量实操手感了此时再去读RFC很多之前困惑的边界场景、厂商实现差异一看就明白了。有一定实操基础再读规范效率远比一开始就去读要高。这条路线的核心逻辑是先用起来再学规则最后读规范。和传统的“先把三百页教材背完再上手”完全不同更适合有动手欲望的人。写到这里HTTP协议在渗透基础里的角色我已经尽量完整地拆过一遍了。这东西学了不会立刻让你变成漏洞挖掘大师但它是你后续所有进阶内容——从SQL注入到越权测试从请求走私到反序列化——的共同底色。我在实际工作中最深的体会是很多看似高深的漏洞利用手法追到根上就是一个HTTP字段或者一个解析逻辑没有处理好。反过来基本功扎实的人看到陌生接口时心里是有“联想库”的能根据报文特征快速定位应该往哪个方向测试。希望这篇文章能帮你把那个“联想库”的底子打牢一些。
返回列表