miniL_ctf

挖个坑,等复盘,最近实验太多了

web

checkin -CBC字节翻转攻击&kali-padbuster

进入页面,抓包,目的是伪造token使自己身份成为vip,给出了源码,加密是AES-CBC加密
现学了go的gin框架,AES加密,然后没做出来…..
赛后复盘
看了看wp,可以用kali里现成的工具padbuster
原文来自: kali工具使用中文说明书

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
:~# 破坏者
+-----
---------------------------------------+
| PadBuster - v0.3.3 |
| Brian Holyfield - Gotham 数字科学 |
|

|
+--------------------------------------------+
使用:padBuster.pl URL EncryptedSample BlockSize [选项]
其中: URL = 目标 URL(如果适用,还有查询字符串)
EncryptedSample = 您要测试的加密值。必须
也存在于 URL、PostData 或 Cookie 中
BlockSize = 算法使用的块大小
选项:
-auth [用户名:密码]:HTTP 基本身份验证
-bruteforce:对第一个块执行蛮力
-ciphertext [Bytes]:中间字节的密文(十六进制编码)
-cookies [HTTP Cookies]: Cookies (name1=value1; name2=value2)
-encoding [0-4]:样本的编码格式(默认0)
0=Base64,1=下十六进制,2=上十六进制
3=.NET UrlToken,4=WebSafe Base64
-encodedtext [编码字符串]:要加密的数据(编码)
-error [错误字符串]:填充错误消息
-headers [HTTP 标头]:自定义标头 (name1::value1;name2::value2)
-interactive:提示确认解密字节
-intermediate [Bytes]:密文的中间字节(十六进制编码)
-log:生成日志文件(创建文件夹 PadBuster.DDMMYY)
-noencode:不对负载进行 URL 编码(默认编码)
-noiv:样本不包括 IV(解密第一个块)
-plaintext [String]:要加密的纯文本
-post [发布数据]:HTTP 发布数据字符串
-prefix [Prefix]:附加到每个样本的前缀字节(编码)
-proxy [地址:端口]:使用 HTTP/S 代理
-proxyauth [用户名:密码]:代理身份验证
-resume [Block Number]:在这个block number处恢复
-usebody:使用响应正文内容进行响应分析阶段
-verbose:要详细
-veryverbose:非常详细(仅限调试)

密码学的一点科普

密码学的科普

块加密: 就是把密文分成块,再加密(不够的补全)
ECB: 最早的加密,由于所有的分组的加密方式都一致,因此难以抵挡统计分析攻击,易被破解
CBC: 每个明文块先与前一个密文块进行异或后,再进行加密,每个密文块都依赖于它前面的所有明文块。同时,为了保证每条消息的唯一性,在第一个块中需要使用初始化向量IV(第一明文块M1加密的时候,因为前面没有加密的密文,所以需要与一个初始化向量(IV)进行XOR(异或))
OFM: 是先用块加密器生成密钥流(Keystream),然后再将密钥流与明文流异或得到密文流,解密是先用块加密器生成密钥流,再将密钥流与密文流异或得到明文,由于异或操作的对称性所以加密和解密的流程是完全一样的

填充模式:
ZeroPadding,数据长度不对齐时使用0填充,否则不填充。
PKCS7Padding,假设数据长度需要填充n(n>0)个字节才对齐,那么填充n个字节,每个字节都是n;如果数据本身就已经对齐了,则填充一块长度为块大小的数据,每个字节都是块大小。
PKCS5Padding,PKCS7Padding的子集,块大小固定为8字节。
由于使用PKCS7Padding/PKCS5Padding填充时,最后一个字节肯定为填充数据的长度,所以在解密后可以准确删除填充的数据,而使用ZeroPadding填充时,没办法区分真实数据与填充数据,所以只适合以\0结尾的字符串加解密

针对CBC的字节翻转攻击

链接
理解了CBC加密的过程后,想想解密怎么搞,就是翻转攻击了:
CBC解密的过程
从密文中提取出IV,然后将密文分组。
使用密钥对第一组的密文解密,然后和IV进行xor得到明文。
使用密钥对第二组密文解密,然后和2中的密文xor得到明文。
重复2-3,直到最后一组密文。

前一块Ciphertext用来产生下一块明文,如果我们改变前一块Ciphertext中的一个字节,然后和下一块解密后的密文xor,就可以得到一个不同的明文,而这个明文是我们可以控制的。也就是通过改变上一组的密文,来改变本组的明文
这个文章讲得不错: 链接
具体: 比如要改变第二个块明文的某个字节,就把第一个密文的对应字节改了,然后,再把iv改了(所以iv是可以控制的吗….因为iv是随机生成的,而且我们可见,那自然是可以改变的…)

sql注入-根据sql版本特性进行注入

主要问题出在闭合上,构造的的payload不知道为什么在环境里无法回显
进入页面查看源码,注释里给了查询语句,可以知道表名: select * from users where username=’$username’ and password=’$password’;

#、– 、–+、/**/都过滤了,无错误回显,sleep也过滤了,但是可以堆叠注入
当时想到的是利用’'注释引号,然后进行布尔注入,但是,在构造好了payload并检查后,发现无论如何都不回显,就很疑惑
于是尝试自己搭sql环境试试,我寻思搭个sql环境肯定能找到好的教程吧…然后csdn里的教程不负众望的让我搭建失败了,然后就摆烂了….
自己构建的不知道为毛不回显的payload:

1
select * from users where username='\' and password=' || username=admin;insert into users \'; 

wp思路:
注释符可以用%00代替(我当时闭合时是用insert into 闭合的,不知道为什么出错了)
先盲注出版本8.0.26,搜到此版本新特性table可以用来注入(怎么搜的,这也太吊了? )

payload:

1
2
3
username=\
password=|| ("a","a","a")<(table users);%00
获取sql版本: 8.0
1
2
3
4
username=\
password= ||ascii(mid(username,1,1))=num;%00
这个mid盲注没见过....
可以爆出username和password.....(不对啊,我记得当时ascii明明被屏蔽了来着,于是还在想怎么用别的方式进行盲注....)

include

token是简单的base64转码,转了是php序列化后的字符码,然后把里面的Tourist改成Lteam就行了
O:4”User”:1:{s:9:”usergroup”;s:7:”Tourist”;}

转了之后就是文件上传漏洞了,没有任何检查可以直接上传,然后蚁剑连就能看到flag


miniL_ctf
https://bl4zygao.github.io/2022/05/11/miniL-ctf/
Author
bl4zy
Posted on
May 11, 2022
Licensed under