miniL_ctf
挖个坑,等复盘,最近实验太多了
web
checkin -CBC字节翻转攻击&kali-padbuster
进入页面,抓包,目的是伪造token使自己身份成为vip,给出了源码,加密是AES-CBC加密
现学了go的gin框架,AES加密,然后没做出来…..
赛后复盘
看了看wp,可以用kali里现成的工具padbuster
原文来自: kali工具使用中文说明书
1 |
|
密码学的一点科普
块加密: 就是把密文分成块,再加密(不够的补全)
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 |
|
wp思路:
注释符可以用%00代替(我当时闭合时是用insert into 闭合的,不知道为什么出错了)
先盲注出版本8.0.26,搜到此版本新特性table可以用来注入(怎么搜的,这也太吊了? )
payload:
1 |
|
1 |
|
include
token是简单的base64转码,转了是php序列化后的字符码,然后把里面的Tourist改成Lteam就行了
O:4”User”:1:{s:9:”usergroup”;s:7:”Tourist”;}
转了之后就是文件上传漏洞了,没有任何检查可以直接上传,然后蚁剑连就能看到flag