BUUCTF [BSidesCF 2019] Mixer
考点:
- 图解分组密码五大工作模式
- ECB模式加密拆解构造
启动环境:
页面提示需要提升权限,并且提到了cookie
,输入框中还有不能输入的is_admin
属性
修改前端,使其值等于1
:
<input type="text" class="name" disabled="1" value="1">
随意输入First name
与Last name
查看回显:
提示了需要以admin
身份登陆,并将is_admin
设置为1
,使用BurpSuite抓取数据包:
使用Repeater发送后,获得回显:
其存在Set-Cookie
字样,将回显页面刷新,重新抓取数据包:
得到了其Cookie:
user=263b220db546fce7fa8f2ff161f836c51beb4a501c28b01d69dfcba62631bfd6a1f3ec4b16eeb7039c044a87d3206ecb15fd49a93d10d8c3917b024cd534c17b; rack.session=BAh7B0kiD3Nlc3Npb25faWQGOgZFVEkiRWFmNDg5NzQ1YjM0MjUxMmFkNzc0%0AMWYzZTE5YzI3ODEzNDgyMmRlOTA1OGJiYjM2Y2M1MjA2NjFkOGZiYzUwODYG%0AOwBGSSIMYWVzX2tleQY7AEYiJY9KXebdt%2FZ1upUj4nMb%2FBNDIPff8k5riHuK%0AJqBZHv0U%0A--b23edaf66d480964e13a229e4f409d8754a94835
因为其提示和rack.session
无关,所以尝试修改user
的前三位为111
,查看回显:
成功得到报错内容,因为改动了开头,所以只有后半部分是完整的,相同方式获取前面的内容,也就是修改偏后方的三位为111
,得到回显:
完整的user
解密为:
{"first_name":"first","last_name":"last","is_admin":0}
查阅资料:图解分组密码五大工作模式
本题也就是每块内容被分成固定的大小块单独加密,推测为ECB模式,若是CBC模式,修改前面内容,后面内容会变成乱码。
ECB加密是16
位一组,每组相互独立,加密后每组为32位,尝试整块替换,并且在json中1.00 == 1
首先构造被加密的字符串:
{"first_name":"A1.00000000000000","last_name":"last","is_admin":0}
可以将字符串拆分为5
组,也就是:
# 第一组
{"first_name":"A
# 第二组
1.00000000000000
# 第三组
","last_name":"l
# 第四组
ast","is_admin":
# 第五组
0}
将加密后的第二组放到第四组的后面,构成:
"is_admin":1.00000000000000
完成了构造,那么就需要加密后的cookie
,因为没有加密所需的key
,所以通过原页面完成,构造登陆内容:
first name = A1.00000000000000
last name = last
提交表单后,获取到user
的值:
b20e97737c12bfa4aa4b2426c48527681bf69e842fec030ee35bcfe578e91b1157a3a96575f74f2ab7b289a3e4da30f32c85e2383de1b089993d200a66e2faa4fed061c9eaac7b3a19b1399cd05010cf
前四组不用动,也就是到128
前,将32
到64
位作为第二组内容取出,并拼接至第四组后,使用Python3:
s = "b20e97737c12bfa4aa4b2426c48527681bf69e842fec030ee35bcfe578e91b1157a3a96575f74f2ab7b289a3e4da30f32c85e2383de1b089993d200a66e2faa4fed061c9eaac7b3a19b1399cd05010cf"
res = s[:128] + s[32:64] + s[128:]
print(res)
得到构造好的flag:
b20e97737c12bfa4aa4b2426c48527681bf69e842fec030ee35bcfe578e91b1157a3a96575f74f2ab7b289a3e4da30f32c85e2383de1b089993d200a66e2faa41bf69e842fec030ee35bcfe578e91b11fed061c9eaac7b3a19b1399cd05010cf
将其替换到user
中:
发送数据包,得到flag: