重邮毕业实习实训作业5

1.总结

1. SQL注入原理

  1. 参数未经过滤: 应用程序直接将用户输入拼接到SQL查询中,而没有进行适当的验证和过滤。

  2. 动态SQL构造: 使用字符串拼接等方式构造SQL语句,而不是使用参数化查询。

  3. 权限提升: 攻击者可能通过注入获得更高的数据库访问权限。

  4. 执行任意SQL: 成功注入后,攻击者可以执行几乎任何SQL命令,包括读取、修改或删除数据。

  5. 利用数据库特性: 攻击者可能利用数据库的特定功能(如存储过程、系统表等)来扩大攻击范围。

2. SQL注入常用函数及含义

  1. UNION: 合并两个SELECT语句的结果集,常用于获取额外的数据列。

  2. CONCAT(): 连接字符串,用于构造复杂的查询或输出。

  3. SUBSTRING(): 提取字符串的一部分,常用于逐字符提取数据。

  4. ASCII(): 返回字符的ASCII码值,用于字符比较和盲注。

  5. SLEEP(): 导致查询暂停指定的秒数,用于基于时间的盲注。

  6. BENCHMARK(): 重复执行表达式,用于基于时间的注入。

  7. LOAD_FILE(): 读取服务器上的文件内容,可能导致敏感信息泄露。

  8. GROUP_CONCAT(): 将组中的字符串连接成一个字符串,用于一次性获取多行数据。

  9. HEX()和UNHEX(): 用于编码和解码数据,绕过某些过滤。

  10. IF(): 条件判断,常用于布尔型盲注。

3. SQL注入防御手段

  1. 参数化查询: 使用预编译语句和参数化查询,将SQL语句与数据分开。

  2. 输入验证: 对所有用户输入进行严格的类型检查、长度限制和格式验证。

  3. 最小权限原则: 为应用程序使用的数据库账户分配最小必要的权限。

  4. 存储过程: 使用安全配置的存储过程来封装数据库操作。

  5. 转义特殊字符: 对特殊字符进行转义处理,防止它们被解释为SQL语法。

  6. WAF (Web Application Firewall): 部署WAF来检测和阻止SQL注入尝试。

  7. 错误信息处理: 避免向用户显示详细的数据库错误信息。

  8. ORM框架: 使用成熟的ORM (对象关系映射)框架,它们通常内置了防SQL注入机制。

  9. 定期安全审计: 对代码和数据库进行定期的安全审计和渗透测试。

  10. 输入输出编码: 确保在不同上下文中正确编码输入和输出数据。

4. SQL注入常用绕过WAF的方法

  1. 大小写混用: 例如将SELECT写成SeLeCt

  2. 注释插入: 使用内联注释(/**/)来分割关键字。

  3. 编码技术: 使用URL编码、十六进制编码或Unicode编码。

  4. 等价函数替换: 使用不同但功能相同的函数,如用SUBSTR替代SUBSTRING

  5. 空白字符变换: 使用制表符、换行符等代替空格。

  6. 字符串拼接: 将敏感关键字分割,如CONCAT('SEL','ECT')

  7. 整数溢出: 利用整数溢出来构造特定的值。

  8. HTTP头注入: 通过HTTP头(如User-Agent)注入SQL代码。

  9. 多阶注入: 将注入过程分为多个步骤,每步都不触发WAF规则。

  10. 使用特殊字符: 利用一些不常用的SQL语法或特殊字符。

  11. 时间延迟: 使用基于时间的技术来推断注入结果,避免直接输出。

  12. 二次注入: 将恶意输入存储在数据库中,在后续操作中触发。

2.sqli-labs通关前5关,并写出解题步骤,必须手工过关

一:

此时页面会产生报错。

通过UNION SELECT 或者 ORDER BY 语句可以发现字段数为 3 ,可显示位置为 2,3。尾部—+会被浏览器解释为— (空格),这在mysql里是注释。

获取数据库名

利用元数据表INFORMATION_SCHEMA获取数据库信息。

获取表名

获取字段名

获取数据

报错回显中有 ),说明需要闭合

需要闭合双引号。

成功报错了,但是有一个额外情况,那就是当我们查看字段3的时候它是这么一个情况,注意这里用的是1而不再是-1了,因为它压根儿就没返回任何username和password,只有个句子。

语句1:1’ and (length(database()))=8 –-+ 语句2:1’ and length(database())=8 –-+

我们从1猜测到8,发现等于8的时候成立了,返回了you are in

用语句判断第一个字母

语句:1' and ascii(substr(database(),1,1))=1#

用bp抓包,是115,然后查看115的ascii对照数值,是字母s,然后依次查找,最后得到数据库名称security

判断表的数量

语句:1' and (select count(*) from information_schema.tables where table_schema=database())=1 --+

3.总结SQLi的手工注入的步骤

识别注入点

  1. 参数探测: 检查URL参数、表单字段、HTTP头等可能的输入点。

  2. 错误触发: 尝试插入特殊字符(如 ', ", ), --, # 等)来触发数据库错误。

  3. 响应分析: 观察应用程序的响应,寻找可能泄露数据库信息的错误消息。

2. 确定数据库类型

  1. 版本查询: 使用数据库特定的函数,如MySQL的 @@version, SQL Server的 @@SERVERNAME

  2. 语法测试: 尝试不同数据库特有的语法,观察响应。

  3. 错误信息分析: 通过错误消息推断数据库类型。

3. 注入技术选择

  • 联合查询注入(UNION Based)

  • 错误注入(Error Based)

  • 布尔盲注(Boolean Based)

  • 时间盲注(Time Based)

  • 堆叠查询(Stacked Queries)

4. 信息收集

  1. 数据库名: 尝试获取当前数据库名。

  2. 表名列举: 使用信息模式或系统表查询所有表名。

  3. 列名获取: 针对感兴趣的表,获取其列名。

  4. 数据提取: 从目标表和列中提取实际数据。

5. 权限提升 (如果可能)

  1. 当前用户检查: 确定当前数据库用户及其权限。

  2. 管理员账户探测: 尝试识别和访问高权限账户。

  3. 系统命令执行: 在某些情况下,尝试执行操作系统命令。

6. 高级技术应用

  1. 二次注入: 利用存储在数据库中的注入载荷。

  2. 带外通道(Out-of-band): 使用DNS或HTTP请求获取数据。

  3. 编码与绕过: 使用各种编码技术绕过防御措施。

7. 数据后处理

  1. 结果解码: 如果数据被编码,进行必要的解码。

  2. 数据清理: 移除无关数据,整理提取的信息。

  3. 结果验证: 验证获取的数据的准确性和完整性。

8. 漏洞确认与报告

  1. 影响评估: 评估漏洞的严重程度和潜在影响。

  2. 复现步骤: 记录详细的复现步骤。

  3. 修复建议: 提供针对性的安全加固建议。

4.使用sqlmap通过或验证第六关

sqlmap -u "http://localhost/sqli-labs-master/Less-6/?id=1" --batch --dbs

发现数据库,继续探测表

sqlmap -u "http://localhost/sqli-labs-master/Less-6/?id=1" --batch -D security --tables

发现感兴趣的表,继续探测列

sqlmap -u "http://localhost/sqli-labs-master/Less-6/?id=1" --batch -D security -T users --columns

导出数据

sqlmap -u "http://localhost/sqli-labs-master/Less-6/?id=1" --batch -D security -T users -C username --dump

  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值