natas(28-34)(终章)

本文介绍了natas系列挑战中28至34关的解决过程,涉及ECB加密模式的攻击、SQL注入等技术。作者通过分析源码和尝试不同payload,揭示了如何利用ECB加密的特性构造SQL注入,以及在后续关卡中利用Perl语言的特性进行命令注入和文件上传漏洞的利用,最终成功过关。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值