natas28
这题是真的难,密码不懂的我真的有点懵逼,好在Q童鞋不嫌我问题弱智,很耐心的替我解答,在此祝TA恭喜发财!
这题打开之后什么都没有,源码也看不到了,只有一个搜索框,而搜索的是笑话库,根据提交的字符串,随机返回含有字符串的笑话。
POST提交明文,返回一个GET的url,值是明文与sql语句组合后被加密的内容,随便提交几个值,会发现解码(url和base64)后的长度相同,然后不知道怎么进行下去了。查看外网的wp,看了很久才理解了一些。
https://blog.anshumanonline.com/natas29/
http://s0hungry.com/2017/08/27/over-the-wire-natas28-security-puzzle/
http://alkalinesecurity.com/blog/ctf-writeups/natas-28-getting-it-wrong/
视频:
https://www.youtube.com/watch?v=qpC2sNcRj5o
这是一个ECB加密的攻击
ECB(Electronic Codebook,电码本)模式是分组密码的一种最基本的工作模式。在该模式下,待处理信息被分为大小合适的分组,然后分别对每一分组独立进行加密或解密处理。
由于所有分组的加密方式一致,明文中的重复内容会在密文中有所体现,因此难以抵抗统计分析攻击。
对于这种加密可以利用其分组的特性来针对组来攻击。
首先我们要知道它的分组大小,一般AES是要求16个字节为一块的,而ECB属于AES加密。我们可以对其进行验证,构造‘A’64的提交数据,对返回值解密后找到重复的部分(’\xf63\xe6\xb0_\x86b&\xb8c\x81q\x12\xb1\xc9+\xf63\xe6\xb0_\x86b&\xb8c\x81q\x12\xb1\xc9+\xf63\xe6\xb0_\x86b&\xb8c\x81q\x12\xb1\xc9+’),长度为48,重复部分为163。由此可知加密是以16个字符为一组的。
后台构造的sql语句大概类似于SELECT * FROM TABLE where content like “$_REQUEST”,我们需要绕过引号来构造sql注入。
因为POST提交的数据是在引号内的,所以是做不了文章的。所以只能考虑GET部分,它的内容是POST返回回来的完整sql语句,这就意味着存在修改的可能性。
我们希望将其修改成SELECT * FROM TABLE where content like “$_REQUEST” Union SELECT password FROM USERS #
sql是明文的话,就直接修改即可。虽然被加密了,但ECB有个特性就是各组之间独立无关的,这就需要插入的内容必须为完成的若干组,同时需要把前后不足一组的地方给补齐了。
所以我们思路为:使【SELECT * FROM TABLE where content like “$_REQUEST”】为独立整组,然后得到【Union SELECT * FROM USERS #】被ECB加密后的内容,插入其中即可。
现在需要找出前半部分缺少多少个字符为一整组,胖友给我解释的是:多次输入可以看到解码后的值,前42个字符是相同的,由于块长是16,42=10+16*2,所以前面缺少的字符是10。但本人比较愚笨,不是很能理解这种方式。
于是找到了另一种其他博主提供的方式:
之前构造’a’ * 64已经知道了’a’ * 16被ECB加密的内容STR(b64解密后的)
如果放入’a’ * (16 + b)时(b64解密后的)query中恰好出现了STR,那么就可以证明前半部分缺b个字符
因为此时b个’a’正好填补了之前的组,使得恰好有’a’ * 16被独立成组加密了。
b的取值范围为0-15,爆破可知得10
而且前半部分为3组48个字符。
这样就可以构造‘a’*(10-sql语句后部)就可以满足所需为整组了。这里的sql语句后部为两个字符(%’),它实际执行的是类似于“… WHERE joke_body LIKE’%{escaped_query}%’…”
提交后记下base64解码后的query。
下一步就是将我们的payload加密后的内容和前面进行拼接了。
我们添加的内容也需要是整组的,因此我们需要对payload进行添加字符(其实并没有影响,payload后面有注释符),提交’a’*10 +payload +offset
然后截取返回值base64解码后的第48个字符起(前三组),长度len(payload+offset)的字符,把截取部分插入到之前query的第48个字符后,提交即可。
脚本是网上大大提供的:
import base64
import requests
from urllib.request import quote, unquote
import re
#from pwn import *
natas_url = "http://natas28.natas.labs.o