前言

最近做了一个ctf,里面碰到了一道web-crypro的题(你说你考的是crypro关我web什么事)。当时没有做出来,现在复盘。也是因为看了神仙writeup才有这个能力

ctf

这是bsidessf举办的一场ctf,他们的官网如下:
https://bsidessf.org/
题目的主界面如下:

也没有其他功能,尝试登陆,登陆成功:

这里无论什么账号密码都可以登陆。
登陆后提示现实我们需要设置is_admin的值为1,这里is_admin默认值为0,我们尝试修改,再次登陆

发现并没有成功,看来不是该前端能解决的(这都能解决也对不起它的分值)。
尝试抓包,发下如下两个可疑包:


分析其功能,就是在登陆的时候发送请求会返回一个名为user的cookie数据,然后再用cookie进行验证,就会的到之前的登录后的界面。
看来这道题的问题就出在了user这个数据上了。
尝试着把user的值拿出来放到加解密的网站,未果;再放入自己珍藏的脚本中,还是未果!!!
对它的仅有了解就是它的位数是32的倍数!
emmmmmmmmmmmmmm。。。。
这里我学到了一个好的思路:
任何一个数据点,都可以用错误的数据去尝试
尝试更改user值,就改一个数字,看会出现什么情况:


果然,出现了信息。
分析得到user信息是通过加密得到的json数据。
json数据应该是这样的:
{"first_name":"root","last_name":"root","is_admin":0}
更改一位数据只影响一部分数据,应该是AES(ECB)加密。
AES(ECB)加密是先分组,再用密钥进行分别加密。在这里由于user的值为32的倍数,猜测分组值为32。尝试更改第33位的值:

发现32位加密字符串对应16位源字符串。
这样我们就可以自定义加密字符了。
根据题目提示,我们需要将is_admin设置为1,那么我们的源字符串应该为:
{"first_name":"root","last_name":"root","is_admin":1}
按照分组规则,剩下的字符串应该为n":1}
尝试将剩下缺少部分用0补齐:n":1}00000000000
再用注册功能加密:

得到payload字符串:2fd57d817569589a9f068267ac906cf1
再替换掉原本字符串的后32位,发送:

简直了,你们能再丧心病狂点吗,这里都要过滤。
尝试绕过,未果。
那么就只有不引入过滤字符了。
在这里,我们尝试将is_admin值之前的数据凑够64位,这样,我们的payload就只有1这个数值,不会存在过滤符号,这样我们的user源数据应为:
{"first_name":"root","last_name":"rootqqqqqqqqqqqqq","is_admin":1.0000000000000}
经过构造payload,得到加密payload,得flag:


CTF      crypto

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

常见解析漏洞 上一篇
thinkphp5.0-1远程代码执行漏洞分析 下一篇