在 SQL 注入 (SQL Injection) 攻击中,渗透测试工程师通过操纵用户输入的数据来修改应用程序的 SQL 查询,从而绕过认证、访问敏感数据、修改数据库等。SQL 注入攻击通常依赖于不同的数据提交方式,具体取决于应用程序如何接收用户输入并构造 SQL 查询。以下是 SQL 注入攻击中常见的数据提交方式,以及如何利用这些方式进行攻击。
常见的 SQL 注入数据提交方式
-
GET 请求中的 URL 参数
-
POST 请求中的表单数据
-
Cookie 数据
-
HTTP 请求头
-
文件上传字段
1. GET 请求中的 URL 参数
GET 请求通常用于从服务器获取数据,URL 中包含查询参数。在 SQL 注入攻击中,攻击者通过在 URL 查询参数中注入恶意 SQL 代码,来操控后台数据库。
示例:
攻击者在 URL 的查询字符串中注入恶意的 SQL 语句:
GET /search?q=' OR 1=1 -- HTTP/1.1
Host: example.com
在这个例子中,q
参数的值被替换为 ' OR 1=1 --
,这是一个经典的 SQL 注入 payload。--
是 SQL 中的注释符号,它会让数据库忽略后面的查询部分,从而可能绕过认证或获取所有数据。
注入点:
-
URL 查询参数(例如:
/search?q=
,/login?username=
等)。
防御措施:
-
使用 预编译语句 或 参数化查询,防止直接拼接用户输入。
-
对用户输入进行严格验证和过滤。
2. POST 请求中的表单数据
POST 请求通常用于提交表单数据(如登录表单、注册表单)。在 SQL 注入攻击中,攻击者通过修改表单字段的数据来提交恶意 SQL 代码。
示例:
假设一个网站的登录表单提交数据:
POST /login HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 35
username=admin&password=' OR 1=1 --
在这个例子中,攻击者在 password
字段中注入了 SQL 注入 payload ' OR 1=1 --
,试图绕过登录验证。
注入点:
-
登录表单(如:
username
、password
字段)。 -
注册表单、搜索表单等。
防御措施:
-
使用 参数化查询 或 ORM(对象关系映射)来防止 SQL 注入。
-
对表单字段进行输入验证、过滤和限制。
3. Cookie 数据
在许多 web 应用中,Cookie 存储了会话信息、认证信息等。攻击者可以通过修改或伪造 Cookie 数据,注入恶意的 SQL 代码,进一步发起 SQL 注入攻击。
示例:
假设有一个应用通过 Cookie 来存储 user_id
,并使用该 ID 生成 SQL 查询:
GET /profile HTTP/1.1
Host: example.com
Cookie: user_id=1 OR 1=1
如果应用程序没有正确过滤或验证 user_id
,攻击者就可以通过伪造 Cookie 中的 user_id
值来发起 SQL 注入。
注入点:
-
存储在 Cookie 中的用户标识符或会话 ID。
防御措施:
-
对 Cookie 数据进行验证和过滤。
-
使用 安全的会话管理,避免使用可预测的 ID 或将敏感信息直接存储在 Cookie 中。
4. HTTP 请求头中的数据
HTTP 请求头也可能包含用户输入(例如,User-Agent
、Referer
、Authorization
等),这些数据可能会被应用程序处理并插入到 SQL 查询中。如果应用没有正确过滤这些请求头的数据,攻击者可以利用这些字段进行 SQL 注入。
示例:
攻击者可以通过篡改 HTTP 请求头,尝试注入 SQL 注入 payload。
GET /search HTTP/1.1
Host: example.com
User-Agent: ' OR 1=1 --
在这个例子中,攻击者通过篡改 User-Agent
字段注入恶意的 SQL 查询。
注入点:
-
User-Agent
头、Referer
头等。
防御措施:
-
对 HTTP 请求头进行严格的输入验证。
-
使用安全的库和框架,防止直接将请求头的数据插入到 SQL 查询中。
5. 文件上传字段中的数据
在一些应用程序中,文件上传功能可能不经过充分的验证,攻击者可以上传包含恶意脚本或恶意 SQL 代码的文件,利用该功能进行 SQL 注入攻击。
示例:
假设应用程序允许用户上传文件,并且文件名没有经过充分验证。攻击者可以上传一个恶意文件名,如:
evil.php; DROP TABLE users;
如果服务器没有妥善处理这个文件名,攻击者可能会通过 SQL 注入删除数据库中的表格。
注入点:
-
文件上传字段(例如,上传文件的
filename
字段)。
防御措施:
-
对上传的文件进行类型和内容验证。
-
不允许上传可执行脚本(如 PHP 文件)。
-
对文件名进行适当的清理和规范化。
常见的 SQL 注入 Payload 示例
在渗透测试中,渗透测试工程师会使用各种 SQL 注入 payload 来检测漏洞。常见的 SQL 注入 payload 包括:
-
经典的 SQL 注入:
' OR 1=1 --
-
注入式登录绕过:
' OR 'a'='a
-
基于时间的盲注:
' OR IF(1=1, SLEEP(5), 0) --
-
联合查询注入:
' UNION SELECT null, username, password FROM users --
-
堆叠查询(多个查询):
' ; DROP TABLE users --
这些 payload 用于检查应用程序是否对用户输入的数据进行了正确的处理和过滤。
总结:
-
GET 请求中的 URL 参数。
-
POST 请求中的表单数据。
-
Cookie 数据。
-
HTTP 请求头。
-
文件上传字段。