1.总结
1. SQL注入原理
-
参数未经过滤: 应用程序直接将用户输入拼接到SQL查询中,而没有进行适当的验证和过滤。
-
动态SQL构造: 使用字符串拼接等方式构造SQL语句,而不是使用参数化查询。
-
权限提升: 攻击者可能通过注入获得更高的数据库访问权限。
-
执行任意SQL: 成功注入后,攻击者可以执行几乎任何SQL命令,包括读取、修改或删除数据。
-
利用数据库特性: 攻击者可能利用数据库的特定功能(如存储过程、系统表等)来扩大攻击范围。
2. SQL注入常用函数及含义
-
UNION: 合并两个SELECT语句的结果集,常用于获取额外的数据列。
-
CONCAT(): 连接字符串,用于构造复杂的查询或输出。
-
SUBSTRING(): 提取字符串的一部分,常用于逐字符提取数据。
-
ASCII(): 返回字符的ASCII码值,用于字符比较和盲注。
-
SLEEP(): 导致查询暂停指定的秒数,用于基于时间的盲注。
-
BENCHMARK(): 重复执行表达式,用于基于时间的注入。
-
LOAD_FILE(): 读取服务器上的文件内容,可能导致敏感信息泄露。
-
GROUP_CONCAT(): 将组中的字符串连接成一个字符串,用于一次性获取多行数据。
-
HEX()和UNHEX(): 用于编码和解码数据,绕过某些过滤。
-
IF(): 条件判断,常用于布尔型盲注。
3. SQL注入防御手段
-
参数化查询: 使用预编译语句和参数化查询,将SQL语句与数据分开。
-
输入验证: 对所有用户输入进行严格的类型检查、长度限制和格式验证。
-
最小权限原则: 为应用程序使用的数据库账户分配最小必要的权限。
-
存储过程: 使用安全配置的存储过程来封装数据库操作。
-
转义特殊字符: 对特殊字符进行转义处理,防止它们被解释为SQL语法。
-
WAF (Web Application Firewall): 部署WAF来检测和阻止SQL注入尝试。
-
错误信息处理: 避免向用户显示详细的数据库错误信息。
-
ORM框架: 使用成熟的ORM (对象关系映射)框架,它们通常内置了防SQL注入机制。
-
定期安全审计: 对代码和数据库进行定期的安全审计和渗透测试。
-
输入输出编码: 确保在不同上下文中正确编码输入和输出数据。
4. SQL注入常用绕过WAF的方法
-
大小写混用: 例如将
SELECT
写成SeLeCt
。 -
注释插入: 使用内联注释(
/**/
)来分割关键字。 -
编码技术: 使用URL编码、十六进制编码或Unicode编码。
-
等价函数替换: 使用不同但功能相同的函数,如用
SUBSTR
替代SUBSTRING
。 -
空白字符变换: 使用制表符、换行符等代替空格。
-
字符串拼接: 将敏感关键字分割,如
CONCAT('SEL','ECT')
。 -
整数溢出: 利用整数溢出来构造特定的值。
-
HTTP头注入: 通过HTTP头(如User-Agent)注入SQL代码。
-
多阶注入: 将注入过程分为多个步骤,每步都不触发WAF规则。
-
使用特殊字符: 利用一些不常用的SQL语法或特殊字符。
-
时间延迟: 使用基于时间的技术来推断注入结果,避免直接输出。
-
二次注入: 将恶意输入存储在数据库中,在后续操作中触发。
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的手工注入的步骤
识别注入点
-
参数探测: 检查URL参数、表单字段、HTTP头等可能的输入点。
-
错误触发: 尝试插入特殊字符(如
'
,"
,)
,--
,#
等)来触发数据库错误。 -
响应分析: 观察应用程序的响应,寻找可能泄露数据库信息的错误消息。
2. 确定数据库类型
-
版本查询: 使用数据库特定的函数,如MySQL的
@@version
, SQL Server的@@SERVERNAME
。 -
语法测试: 尝试不同数据库特有的语法,观察响应。
-
错误信息分析: 通过错误消息推断数据库类型。
3. 注入技术选择
-
联合查询注入(UNION Based)
-
错误注入(Error Based)
-
布尔盲注(Boolean Based)
-
时间盲注(Time Based)
-
堆叠查询(Stacked Queries)
4. 信息收集
-
数据库名: 尝试获取当前数据库名。
-
表名列举: 使用信息模式或系统表查询所有表名。
-
列名获取: 针对感兴趣的表,获取其列名。
-
数据提取: 从目标表和列中提取实际数据。
5. 权限提升 (如果可能)
-
当前用户检查: 确定当前数据库用户及其权限。
-
管理员账户探测: 尝试识别和访问高权限账户。
-
系统命令执行: 在某些情况下,尝试执行操作系统命令。
6. 高级技术应用
-
二次注入: 利用存储在数据库中的注入载荷。
-
带外通道(Out-of-band): 使用DNS或HTTP请求获取数据。
-
编码与绕过: 使用各种编码技术绕过防御措施。
7. 数据后处理
-
结果解码: 如果数据被编码,进行必要的解码。
-
数据清理: 移除无关数据,整理提取的信息。
-
结果验证: 验证获取的数据的准确性和完整性。
8. 漏洞确认与报告
-
影响评估: 评估漏洞的严重程度和潜在影响。
-
复现步骤: 记录详细的复现步骤。
-
修复建议: 提供针对性的安全加固建议。
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