什么是 SQL 注入?
SQL 注入是一种常见的网络攻击手段,攻击者通过在用户输入中插入恶意的 SQL 代码,从而控制或破坏目标数据库。通常,这种漏洞存在于应用程序对用户输入未进行充分过滤和处理的情况下。
SQL 注入的存在位置
SQL 注入漏洞可能出现在任何与用户输入交互的地方,包括但不限于:
- 表单输入字段
- URL 参数
- Cookies
- HTTP 头信息
SQL 注入的分类
-
根据是否有回显:
- 盲注:无直接回显,通过布尔逻辑或时间延迟等方式推断。
- 有回显注入:直接返回错误信息,或通过联合查询等方式返回结果。
- 报错注入
- 联合注入
-
根据输入的类型:
- 数字型注入
- 字符型注入
常用的 SQL 注入函数
- 报错函数:
updatexml()
,extractvalue()
,convert()
,floor()
,exp()
- 聚合函数:
group_concat()
,concat()
- 睡眠函数:
sleep()
,benchmark()
举例子:(具体用法跳转:SQL注入报错注入函数[通俗易懂]-腾讯云开发者社区-腾讯云)
-
报错函数:
?id=1' or updatexml(0,concat(0x7e,select database()),1)'SELECT extractvalue(null, 1' and extractvalue(1,concat(0x7e,user(),0x7e,database())) # SELECT convert((SELECT database()) USING utf8); SELECT floor(rand()*2); SELECT exp(~(SELECT * FROM (SELECT 1 UNION SELECT 2)t));
-
聚合函数:
SELECT group_concat(column_name) FROM information_schema.columns WHERE table_name='users'; SELECT concat(username, password) FROM users;
-
睡眠函数:
SELECT sleep(5); -- 延迟 5 秒 SELECT benchmark(1000000, md5('test')); -- 测试函数
如何判断页面是否存在 SQL 注入
- 在 URL 或抓包数据中发现参数的地方,可尝试输入
'
,''
等特殊字符,观察回显是否不同。某些页面可能直接报错。 - 对字符型输入,可以尝试:
如果返回结果不同,则可能存在 SQL 注入。' AND 1='1' -- 返回结果正常 ' AND 1='2' -- 返回结果异常
- 使用
1=1a
测试:- 对于字符型输入:返回 true,因为数据库会将
1a
解释为1
。 - 对于数字型输入:返回 false,因为
1a
会被视为非法数字。
- 对于字符型输入:返回 true,因为数据库会将
如何判断数据库类型
-
通过端口扫描:
常见数据库端口:- MySQL - 3306
- Oracle - 1521
- PostgreSQL - 5432
- Redis - 6379
- MSSQL - 1433
- MongoDB - 27017
-
通过技术栈搭配判断:
- MySQL 通常与 Java/PHP 搭配。
- MSSQL 通常与 IIS 搭配。
-
观察页面回显:
- 有回显:使用直接注入方式。
- 无回显:使用布尔注入。
- 如果布尔注入无明显区别:尝试时间盲注。
常见的 SQL 注入 bypass 方式
传送门:Sql注入bypass的示例分析 • Worktile社区
-
编码绕过:
- 将 payload 进行 URL 编码、双重编码、Base64 编码、ASCII编码等方式进行传输,绕过简单的过滤规则。
-
空格绕过:
- 使用注释符号(如
/**/
)、替换空格为括号、换行符或其它特殊字符。
- 使用注释符号(如
-
大小写绕过:
- 将 SQL 关键字的大小写混合使用,如
sElEcT
、UnIoN
等,绕过字面过滤。
- 将 SQL 关键字的大小写混合使用,如
-
逻辑绕过:
- 使用布尔表达式、函数、字符拼接等方式,如
1 OR 1=1
、1' OR '1'='1
。
- 使用布尔表达式、函数、字符拼接等方式,如
-
异构语句绕过:
- 将注入语句拆分成多行、使用重复关键字、加入无关子查询等方式。
-
使用字符集绕过:
- 利用数据库特定的字符集、编码方式(如 UTF-7)进行绕过。
-
双写符号绕过:
- 将单引号、双引号
-
防御 SQL 注入的方式
- 使用预编译语句(Prepared Statements): 确保 SQL 语句在执行前已经被参数化,不允许用户输入直接嵌入 SQL 语句。
- 加装waf。
- 输入验证与过滤: 对所有用户输入进行严格的验证和过滤。确保输入只能包含预期的字符和格式。可以使用正则表达式或者黑名单的方式。
- 最小化数据库权限: 只授予应用程序最小化的数据库访问权限,尽可能限制其对数据库的操作权限。
- 使用框架内置的防护机制
印象最深的几个sql注入?
关键字:绕过+提权+sqlmap高级用法(编码)+伪静态
场景1:发现一个伪静态页面》绕过》获取账号密码》登陆博客后台》上传一句话木马文件》getshell 》提升权限 》上传免杀cs》权限维持》隧道建立》nps代理》内网扫描资产》内网数据库弱口令扫描出50000+医院名单
场景2: sqlmap进行base64编码操作》绕过签名机制》跑了900多张很多表》过滤有password字段的表》登陆数据库》udf提权》内网扩大伤害