首页 > 解决方案 > 在 SQL SELECT 查询中包含字符串是什么意思

问题描述

如果提出的问题很简单而且过于冗长,我深表歉意

我一直在研究 SQL 注入攻击的基础知识,在某个时候,我读到验证 UNION SQL 注入攻击中特定字段的数据类型的一种潜在方法是对我们发出的请求进行某些更改到目标服务器。

使用的软件是 BurpSuite,目标是网站https://portswigger.net上的一个实践实验室。被告知类别字段易受攻击,并且对该类别的查询返回两个字段,因此将以下“代码”附加到我们发送给服务器的 HTTPS GET 消息的类别部分,以尝试了解第一个字段的数据类型

...?category=Gift'+UNION+SELECT+'abc',NULL+FROM+table_that_contains_target_information--

根据实验室的手册,我们对该'abc',NULL部分所做的是验证“table_that_contains_target_information”中的第一个字段是否为字符串/varchar 类型。正如我在实验室中检查的那样,这似乎有效并有助于确定该特定字段的数据类型,因为如果第一个字段的数据类型不是字符串/varchar,我会收到内部服务器错误。

但是,稍后,当在通用数据库上执行查询以检查该'abc',NULL部分在通用 SELECT 查询中的作用时,得到的结果有些不同。一般数据库问题可用于在https://www.w3schools.com/mysql上学习 SQL 。它有一个名为“客户”的表,其中包含多个字段。我知道第一个字段是一个整数(通过使用 information_schema.columns 进行验证),其余的是 varchars。对于上下文,在 Customers 表中,CustomerID 是一个整数字段,而 CustomerName 是一个 varchar 字段。我在服务器上运行了以下查询

|-------This part is the original query-------||This is our inserted code to find out information about the database|
SELECT CustomerID, CustomerName FROM Customers UNION SELECT 'abc',NULL FROM Customers

免责声明:我的意图不是对数据库造成任何伤害,只是为了学习一些 SQL

根据我从实验室手册中学到的内容,我应该得到某种错误,对吧?因为我正在以不道德的黑客可能采用的方法检查字段的数据类型。但是,我得到的只是原始查询的结果和一个带有值“abc”的额外记录,第二个字段为 NULL。

我试图阅读有关 SQL 中 SELECT 查询的文档,但据我所知,其中大多数都讲述了一般的SELECT * FROM table_nameSELECT column_name, other_column_name FROM table_name. 我找不到任何关于SELECT 'abc' FROM table_name.

谁能解释一下这里发生了什么?SELECT 'abc' FROM table_name只是给我一个带有'abc'的额外记录吗?如果是这样,那么为什么在https://portswigger.net的实验室中使用相同的查询来验证数据类型,并且它似乎在那里发挥了作用。

感谢您提前回答!

标签: mysqlselectpenetration-testing

解决方案


推荐阅读