第五次作业

SQL注入原理

SQL注入(SQL Injection)是一种安全漏洞,攻击者通过在输入字段中插入恶意的 SQL 代码来操控数据库,窃取或篡改数据。其基本原理是利用应用程序在构建 SQL 查询时将用户输入直接嵌入到 SQL 语句中,使得攻击者能够执行非预期的 SQL 查询。

  工作原理:
用户输入:攻击者将恶意 SQL 代码嵌入到应用程序的输入字段中。
SQL 语句构建:应用程序将用户输入直接拼接到 SQL 查询中,而没有进行适当的验证或转义。
SQL 执行:恶意的 SQL 代码被数据库执行,导致数据泄露、篡改或删除等不安全操作

 SQL注入常用函数及含义

SELECT:用于从数据库中查询数据。例如:
     SELECT * FROM users WHERE username = 'admin';

2. `INSERT`:用于向数据库中插入新数据。例如:
   INSERT INTO users (username, password) VALUES ('admin', 'password123');

3. `UPDATE`:用于更新数据库中的数据。例如:
  
   UPDATE users SET password = 'newpassword' WHERE username = 'admin';
   

4. `DELETE`:用于删除数据库中的数据。例如:
   
   DELETE FROM users WHERE username = 'admin';
   

5. `UNION`:用于将两个或多个 `SELECT` 查询的结果集合并。例如:
   
   SELECT username FROM users UNION SELECT password FROM secrets;
   

6. OR`:用于逻辑判断。攻击者可以利用 `OR` 条件绕过身份验证。例如:
   
   SELECT * FROM users WHERE username = 'admin' OR '1'='1';
   

7. `--`:用于注释掉 SQL 语句的一部分。攻击者用来截断合法的 SQL 语句。例如:
   
   SELECT * FROM users WHERE username = 'admin' ;
   

8. `'`:用于结束字符串常量,攻击者可以利用这一点进行字符串注入。例如:
   
   SELECT * FROM users WHERE username = 'admin' AND password = '';
   

 SQL注入防御手段

1. 使用预编译语句(Prepared Statements):
   使用 SQL 预编译语句和参数化查询,可以避免用户输入直接插入到 SQL 语句中。
   例如,在 Java 中使用 `PreparedStatement`:
     PreparedStatement pstmt = connection.prepareStatement("SELECT * FROM users WHERE username = ?");
     pstmt.setString(1, username);
     ResultSet rs = pstmt.executeQuery();

2. 使用 ORM 框架:
   使用 Object-Relational Mapping(ORM)框架,如 Hibernate、Entity Framework,它们可以自动处理 SQL 注入问题。

3. 输入验证和过滤:
   对用户输入进行严格验证和过滤,确保只接受预期的输入格式。
   可以使用白名单来限制输入数据类型和范围。

4. 最小权限原则:
   数据库用户应仅具有执行应用程序所需操作的权限,减少权限可以减轻 SQL 注入的危害。

5. 错误处理:
   避免将数据库错误信息直接暴露给用户,防止攻击者获取数据库结构等敏感信息。

6. 安全配置:
   确保数据库和应用程序服务器的安全配置是最佳实践,禁用不必要的功能和服务。

SQL注入常用绕过 WAF(Web Application Firewall)的方法

1. 混淆 SQL 语法:
   攻击者可以通过添加注释、变更 SQL 关键字的大小写或使用不同的 SQL 语法来绕过 WAF 的规则。
   例如:`SELEct * FROM users -- ' WHERE username = 'admin';`

2. Unicode 编码:
   - 使用 Unicode 编码对 SQL 关键字进行编码,使其绕过 WAF 的检测。
   - 例如:`SELECT%20*%20FROM%20users`

3. 多重编码:
   使用不同的编码方式(如 URL 编码)对恶意字符进行编码。
   例如:`%27%20OR%201%3D1%20--`

4. 时间延迟:
   使用时间延迟注入(如 `SLEEP()` 函数)来检测漏洞存在。
   例如:`SELECT * FROM users WHERE username = 'admin' OR SLEEP(5)=0;`

5.使用非标准 SQL 语法:
   攻击者可以尝试使用非标准 SQL 语法来绕过 WAF 规则。
   例如:`1' AND 1=1 /*`

6. 拼接和注入:
   将 SQL 代码分段注入并拼接,以绕过基于模式匹配的 WAF 规则。
   例如:`' OR 1=1 -- ` 可能被拼接成 `username = '' OR 1=1 --`

7. 盲注:
  通过盲注(Blind SQL Injection)技术,利用应用程序的响应时间或错误信息来推测数据库结构。

8. 利用编码绕过:
   使用不同编码方式(如 Base64 编码)来传递恶意负载,绕过 WAF 的字符过滤。

通过综合使用这些防御手段,可以显著降低 SQL 注入攻击的风险。

sqli-labs通关前5关

输入?id=1'后发现存在sql注入

利用order查看字段数,可以得到字段数是3

判断回显位

获取数据库名

获取数据库表名

获取密码和用户名

第二关

首先判断注入类型

输入代码后判断为数字型

和上一关一样的方法判断字段数,经有判断得出为三

查看数据库

查看表

查看用户名和密码信息

第三关

判断注入类型

输入代码后判断类型为字符型

判断字符段为3

数据库表

用户名和密码

第四关

判断注入类型为字符型

判断字段数量为3

注入后查看用户名和密码

第五关

注入后发现不回显

获取数据名

获取表名

获取字段名

最后得到用户名和密码

总结SQLi的手工注入的步骤

手工注入 SQL 注入攻击的步骤通常包括:

1. 识别注入点:找到可以输入数据的字段或参数,如登录表单、URL 参数、搜索框等。

2. 测试注入:尝试注入简单的 SQL 语句,如 `' OR '1'='1` 来测试应用程序是否脆弱。

3. 确定注入类型:根据响应确认注入类型(错误基于、盲注、时间延迟等)。

4. 获取数据库信息:利用注入点获取数据库结构信息,如表名和列名。可以使用查询如 `UNION SELECT` 或 `information_schema.tables`。

5. 提取数据:提取数据库中的敏感数据,如用户凭证或其他信息。

6. 利用结果:根据获取的信息进一步攻击,如绕过认证、篡改数据或执行其他恶意操作。

7. 清理痕迹:如有需要,删除或隐藏注入的痕迹,以避免被发现。

使用sqlmap通过或验证第六关

查找注入点

查看表

查勘表中的数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值