GYCTF2020-NodeGame
参考博客:
https://blog.csdn.net/qq_61209261/article/details/125778820
https://blog.csdn.net/weixin_46081055/article/details/119982707
https://www.anquanke.com/post/id/241429
首先打开网页
发现两个链接,一个查看源码,一个文件上传页面。
先看源码,代码审计
1 | |
路由功能:
/:会包含/template目录下的一个pug模板文件并用pub模板引擎进行渲染
/source:回显源码
/file_upload:限制了只能由127.0.0.1的ip将文件上传到uploads目录里面,所以需要进行ssrf。并且我们可以通过控制mimetype进行目录穿越,从而将文件上传到任意目录。
/core:通过q向内网的8081端口传参,然后获取数据再返回外网,并且对url进行黑名单的过滤,但是这里的黑名单可以直接用字符串拼接绕过。
1
思路:利用SSRF伪造本地ip进行文件上传, 上传一个pug模板文件到/template目录下,这个pug模板文件中含有将根目录里的flag包含进来的代码,然后用?action=来包含该文件,就可读取到flag
在文件上传处抓包
对抓取到的文件上传的数据包进行删除Cookie,并将Host、Origin、Referer等改为本地地址、Content-Type改为 ../template 用于目录穿越(注意Content-Length也需要改成变化后的值),然后编写以下利用脚本:
1 | |
加密也可以用另一种方法
1 | |
上传pug成功之后,访问?action=[pug的名字] (好像pug不久就会清除掉)
关于pug
上传的pug,不止有includ文件的方法
1 | |
还有通过拼接 命令执行
1 | |
1. 漏洞背景
(1) 目标代码的关键限制
javascript
1 | |
- 关键点:
req.connection.remoteAddress是 TCP 层的真实 IP,无法通过 HTTP 头(如X-Forwarded-For)伪造。 - 问题:攻击者如何绕过这个限制?
(2) 另一个漏洞点(SSRF)
javascript
1 | |
- 这里存在 SSRF,因为
q参数可控,可以构造任意 HTTP 请求。
2. 攻击原理:SSRF + 请求走私
(1) 目标
- 通过
/core的 SSRF 漏洞,让服务器自己向/file_upload发起一个 “走私请求”。 - 由于这个请求是服务器 自己发给自己 的,
req.connection.remoteAddress会是127.0.0.1,从而绕过 IP 检查。
(2) 攻击步骤
构造一个“畸形”的 SSRF 请求,使其被解析成 两个HTTP请求:
- 第一个请求:
GET /core?q=...(触发 SSRF)。 - 第二个请求:
POST /file_upload( smuggled 请求,用于上传文件)。
- 第一个请求:
利用 CRLF 注入 让后端误解析:
http
1 | |
%0d%0a是\r\n的 URL 编码,用于伪造 HTTP 协议的分隔符。
后端服务器的解析过程:
前端服务器(如 Nginx) 可能认为这是一个普通的
GET /core请求。后端服务器(Node.js) 由于解析不严格,可能会拆分成:
http
GET /core?q=HTTP/1.1 Host: 127.0.0.1 POST /file_upload HTTP/1.1 Host: 127.0.0.1 Content-Type: multipart/form-data ...- 第一个请求:
GET /core?q=HTTP/1.1(无用)。 - 第二个请求:
POST /file_upload( smuggled 请求,IP 是127.0.0.1)。
- 第一个请求:
结果:
/file_upload的req.connection.remoteAddress是127.0.0.1(因为是服务器自己发的请求)。- 绕过 IP 限制,成功上传恶意文件。
3. 为什么能绕过 IP 检查?
req.connection.remoteAddress是 TCP 层的真实 IP:- 如果攻击者直接访问
/file_upload,IP 是他们的公网 IP(如123.123.123.123),会被拦截。 - 但如果请求是 服务器自己发给自己(通过 SSRF + 走私),IP 就是
127.0.0.1,符合检查条件。
- 如果攻击者直接访问
- 关键点:
- 请求走私让后端认为 smuggled 请求 (
POST /file_upload) 是 来自本地 的。 - 这是 协议层欺骗,比单纯改 HTTP 头(如
X-Forwarded-For)更底层,无法被简单防御。
- 请求走私让后端认为 smuggled 请求 (
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。