没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
!
2022*CTF-Web
!
写在前⾯
XCTF国际赛系列⼀直不错,周末参与了下这次⽐赛,虽然没有Java但总体还是蛮有意思
这⾥没按题⽬顺序写,只是写了在我⼼中从上到下的排序,对有源码的题⽬做了备份
oh-my-lotto
链接: https://pan.baidu.com/s/1G53aYqIIbHGlowdWFhkKqw 提取码: oism
!
oh-my-lotto
⼼⽬中⽐较有趣的⼀题呗,重⽣之我是赌神
这是⼀个⾮预期,因为后⾯又上了个revenge,简单分析下题⽬,先看看docker内容,可以知
道⼤概的结构
version: "3"
services:
lotto:
! build:
! ! context: lotto/
! ! dockerfile: Dockerfile
! container_name: "lotto"
之后看看代码,这⾥⾯有三个路由,从短到长
⾸先result路由返回 /app/lotto_result.txt ⽂件内容结果
forecast 路由可以上传⼀个⽂件保存到 /app/guess/forecast.txt
app: !
! build:
! ! context: app/
! ! dockerfile: Dockerfile
! links:
! ! - lotto
! container_name: "app"
! ! !
! ports:
! ! - "8880:8080"
@app.route("/result", methods=['GET'])
def result():
! !if os.path.exists("/app/lotto_result.txt"):
! ! ! !lotto_result = open("/app/lotto_result.txt", 'rb').read().decode()
! !else:
! ! ! !lotto_result = ''
! !
! !return render_template('result.html', message=lotto_result)
@app.route("/forecast", methods=['GET', 'POST'])
def forecast():
! !message = ''
! !if request.method == 'GET':
! ! ! !return render_template('forecast.html')
! !elif request.method == 'POST':
! ! ! !if 'file' not in request.files:
! ! ! ! ! !message = 'Where is your forecast?'
! ! ! ! ! !
还有最关键的lotto路由(代码太多就不放完了),可以
!
如果预测的值与环境随机⽣成的相等就能获得flag
! ! ! !file = request.files['file']
! ! ! !file.save('/app/guess/forecast.txt')
! ! ! !message = "OK, I get your forecast. Let's Lotto!"
! ! ! !return render_template('forecast.html', message=message)
os.system('wget --content-disposition -N lotto')
@app.route("/lotto", methods=['GET', 'POST'])
def lotto():
!
! !elif request.method == 'POST':
! ! //看到flag从环境变量当中取出
! ! ! !flag = os.getenv('flag')
! ! ! !lotto_key = request.form.get('lotto_key') or ''
! ! ! !lotto_value = request.form.get('lotto_value') or ''
! ! ! !lotto_key = lotto_key.upper()
! ! ! !
! ! ! !if safe_check(lotto_key):
! ! ! ! ! !os.environ[lotto_key] = lotto_value
! ! ! ! ! !try:
! ! ! ! ! ! //从内⽹http://lotto当中获得随机值
! ! ! ! ! ! ! !os.system('wget --content-disposition -N lotto')
! ! ! ! ! ! ! !if os.path.exists("/app/lotto_result.txt"):
! ! ! ! ! ! ! ! ! !lotto_result = open("/app/lotto_result.txt",
'rb').read()
! ! ! ! ! ! ! !else:
! ! ! ! ! ! ! ! ! !lotto_result = 'result'
! ! ! ! ! ! ! !if os.path.exists("/app/guess/forecast.txt"):
其中内⽹的lotto页⾯可以看到就是随机⽣成20个40以内随机数并返回
同时对于我们能控制的环境变量也有过滤 safe_check ,那像p⽜之前提到的直接RCE就不⾏
了
! ! ! ! ! ! ! ! ! !forecast = open("/app/guess/forecast.txt",
'rb').read()
! ! ! ! ! ! ! !else:
! ! ! ! ! ! ! ! ! !forecast = 'forecast'
! ! ! ! ! ! ! !if forecast == lotto_result:
! ! ! ! ! ! ! ! ! !return flag
@app.route("/")
def index():
! !lotto = []
! !for i in range(1, 20):
! ! ! !n = str(secrets.randbelow(40))
! ! ! !lotto.append(n)
! !
! !r = '\n'.join(lotto)
! !response = make_response(r)
! !response.headers['Content-Type'] = 'text/plain'
! !response.headers['Content-Disposition'] = 'attachment;
filename=lotto_result.txt'
! !return response
if __name__ == "__main__":
! !app.run(debug=True, host='0.0.0.0', port=80)
def safe_check(s):
! !if 'LD' in s or 'HTTP' in s or 'BASH' in s or 'ENV' in s or 'PROXY' in
s or 'PS' in s:
! ! ! !return False
! !return True
剩余17页未读,继续阅读
资源评论
武恩赐
- 粉丝: 56
- 资源: 332
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功