SECCON Quals 2016 – biscuiti-writeup

2016-12-17 12:04:55来源:作者:Veneno's Blog人点击

比较有意思的一个关于密码学的web,比赛当时在厦门跟队友面基,当时太累,回宾馆也没细看,今天又研究了下:)

很友好地给了源码,在源码中我们很容易可以发现三个点:

cookie是CBC加密的,必然存在一些漏洞。 存在一个sql注入

首先看源码:

显然在这里有一个sqli绕过登录,看下auth函数:

很明了嘛,直接veneno' union select 'admin','1就可以登录,但是我们会发现query里是没有isadmin的,也就是就算我们绕过也拿不到flag,心痛:(

下面就是利用CBC的padding oracle attack去构造一个符合要求的cookie,这时候看下cookie的生成方式:

而在CBC中,初始化向量IV与明文(第一组明文)XOR后,再经过运算得到的结果作为新的IV,用于下一分组(分组2),如果迭代下去。每一组的明文长度就是16,我们随意生成一个,解密后是这个样子:

a:2:{s:4:"name";s:6:"Veneno";s:7:"isadmin";N;}SúCŒC€ER­fèië Ó

那么我们把它分为16个字节一组:

a:2:{s:4:"name";s:6:"Veneno";s:7:"isadmin";N;}SúCŒC€ER­fèië Ó

而我们现在是想让isadmin为1,也就是: s:7:"isadmin";b:1;

现在想一下,我们可以控制的点貌似只有name那里,那么怎么修改,如果直接修改肯定是不现实的,因为你过不了mac校验,那么我们想的是,我们如果了一个地方的内容,同时不会影响后面的内容不就好了,于是就变成了下面这个样子:

a:2:{s:4:"name";s:6:"Venenoxxxxxxxxxxxxxxxxxxxxx";s:7:"isadmin";N;}SúCŒC€ER­fèië Ó

go on。我们最后想要的结果是这个样子:

P1=>a:2:{s:4:"name";P2=>s:6:"VenenoxxxxP3=>xxxxxxxxxxxxxxxxP4=>";s:7:"isadmin";P5=>b:1;}new233333

这样我们可以控制的地方就很明了了:)

P1 => a:2:{s:4:"name"; -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa (C1)P2 => s:26:"Venenoxxxx -> bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb (C2)P3'=> magic_value_here -> cacacacacacacacacacacacacacacaca (C3')P4 => ";s:7:"isadmin"; -> dadadadadadadadadadadadadadadada (C4')P5 => N;}<PAD__PKCS#7> -> eaeaeaeaeeaeaeaeaeaeaeaeaeaeaeae (C5')我们想要的:P5'=> b:1;}new233333 -> <_dont_know_the_correct_cipher_> (C5', NEW MAC)

那么C3'是多少,我们可以这样算:

P3' = magic_value_here = P5' ^ C4 ^ C2 = 'b:1;}<NEW___PAD>' ^ C4 ^ C2C3' = Encrypt(P3' ^ C2) = Encrypt(P5' ^ C4 ^ C2 ^ C2) = Encrypt(P5' ^ C4) = C5'

这样是很明了了,根据

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台