前言
这是一个 SQL 注入笔记,其中包含了很多常用的payload,涵盖了 5 种最流行的数据库及其衍生产品(MySQL、PostgreSQL、MSSQL/SQL Server、Oracle、SQLite)。
某些payload包含占位符,这些占位符在使用前需要被替换为具体的值。占位符以<>表示,并且使用大写字母,例如。替换时需替换整个占位符(包括<>)。
避免使用 OR(OR 1=1)
除了打 CTF之外,其他情况都要避免使用涉及 or 表达式的注入(例如 ’ or 1=1 --),除非只能用or。
原因:
- 登录绕过不稳定
“OR 1=1” 在某些情况下可以绕过登录验证,但其效果并不稳定。通常是期望 SQL 查询返回一行匹配的数据(例如用户名和密码都正确)。如果使用 “OR 1=1”,查询可能会返回多行数据(例如整个user表),这可能导致目标拒绝登录请求。例如,查询 SELECT * FROM users WHERE username = ‘’ OR 1=1 AND password = ‘’ 会返回所有用户,但如果目标只在查询返回单行时才允许登录,这种方法就会失效。相比之下,使用其他方法(如注释掉密码检查部分并配合有效用户名)可能更可靠,即 “OR 1=1” 的通用性不足。
- 可能导致数据库崩溃
在某些场景(如搜索功能)中注入 “OR 1=1” 会导致数据库返回表中的所有行。如果数据库表非常大,这种操作可能会引发性能问题,甚至导致数据库过载或系统崩溃。
- 数据操作风险高
当 “OR 1=1” 用于 UPDATE 或 DELETE 语句时,可能会意外修改或删除大量数据。例如,在重置密码的场景中,注入 “OR 1=1” 可能会导致所有用户的密码都被更改,而不仅仅是目标用户。这种操作可能引发数据丢失或损坏,风险极高。
安全的 or payload
常用的测试方法
以下是一个简单通用的方法,用于发现基本的 SQL 注入漏洞,通过逐步操作来检测是否存在 SQL 注入。
第一步:尝试使用单引号让原有的 SQL 语句报错
首先,我们需要在某个有效的输入值中注入单引号(')或双引号("),以尝试让目标本身的sql语句报错。例如:
-
假设有一个搜索功能,搜索关键词 fuck 返回 23 个结果。
-
在搜索关键词后附加单引号,变为 fuck’,然后提交。
-
如果结果变为 0 个(或者直接报错),说明 SQL 语句可能因为我们插入了单引号而发生改变。注意:这也可能是因为 fuck’ 本身是一个无效的搜索词,但后续步骤可以帮助我们确认。
第二步:尝试修复目标的sql语句检查是否恢复原始响应
可以尝试用以下方法替换注入的单引号,看看是否能恢复到原始响应(即 23 个结果)。依次尝试以下替换:
-
将 fuck’ 替换为 fuck’ '(单引号后加空格和另一个单引号)
-
将 fuck’ 替换为 fuck’||’
-
将 fuck’ 替换为 fuck’+’
-
将 fuck’ 替换为 fuck’ AND ‘1’='1
-
将 fuck’ 替换为 fuck’ – -
如果某个替换后的搜索词(如 fuck’ ')再次返回 23 个结果,说明原始响应被恢复了,就表示这个搜索功能很可能存在 SQL 注入。
第三步:处理整数值的情况
如果以上方法都无法恢复原始响应,可能是因为我们注入的字段是一个整数值(而不是字符串)。在这种情况下,尝试以下方法:
-
将 fuck’ 替换为 fuck – -
-
将 fuck’ 替换为 fuck AND 1=1
-
将 fuck’ 替换为 fuck AND 1=1 – -
同样,如果某个替换后的搜索词恢复了原始响应(23 个结果),则说明可能存在 SQL 注入。
第四步:确认 SQL 注入漏洞
为了进一步确认是否存在 SQL 注入,可以尝试以下方法:
方法 1:尝试 UNION 方法
-
构造一个 UNION 注入 payload,例如 fuck’ UNION SELECT 1,2,3 – -。
-
如果返回结果异常(例如有额外的数据或有明显的数据库报错),则可以确定存在sql注入。
方法 2:注入布尔值 payload
-
构造两个布尔值 payload:
-
fuck’ AND ‘1’='1(应该返回原始响应,即 23 个结果)
-
fuck’ AND ‘1’='0(应该返回 0 个结果)
-
如果结果符合预期(第一个 payload 返回 23 个结果,第二个返回 0 个结果),则基本上可以确认存在 SQL 注入漏洞。
识别数据库
一旦通过上面的方法发现了sql注入,可以通过下面这些payload来识别到底是什么数据库。
注释
注释语法可用于在 SQL 语句中添加注释,可以用于注释位于注入语句后的那些原本的内容,以及绕过某些过滤。需要注意"–“注释需要在”–"后加上空格才有效,而 /*comment*/
是行内注释。
字符串连接
这些函数/操作符可用于将两个或多个字符串连接在一起。
子字符串
这些函数可以用来选择一个字符串的子字符串。START 值应设置为 1(而不是 0),以便从第一个字符开始提取子字符串。还包括无逗号的版本,用于绕过某些 WAF(Web 应用防火墙)或过滤机制。
最后
从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。
因为入门学习阶段知识点比较杂,所以我讲得比较笼统,大家如果有不懂的地方可以找我咨询,我保证知无不言言无不尽,需要相关资料也可以找我要,我的网盘里一大堆资料都在吃灰呢。
干货主要有:
①1000+CTF历届题库(主流和经典的应该都有了)
②CTF技术文档(最全中文版)
③项目源码(四五十个有趣且经典的练手项目及源码)
④ CTF大赛、web安全、渗透测试方面的视频(适合小白学习)
⑤ 网络安全学习路线图(告别不入流的学习)
⑥ CTF/渗透测试工具镜像文件大全
⑦ 2023密码学/隐身术/PWN技术手册大全
扫码领取