将SQL以内的完整结果集转换成String(HSQLDB)
Convert complete result set into String within SQL (HSQLDB)
作为安全代码课程的一部分,我获得了一个易受攻击的 Java 系统,其中使用字符串连接等构建查询。以下是我必须 SQL 注入以检索登录数据的相应代码行:
String comment;
int articleID;
//...
stmt.executeUpdate("INSERT INTO comment (text, article_id) VALUES ('" + comment + "', " + articleId + ")");
comment
可以设置为任何文本,它只是从文本框中读取纯文本。因此,我考虑将文本框文本设置为 SELECT
语句,读取完整的登录数据(table user
有列 login
和 password
):
' || (SELECT login || password FROM user) || '
总体上应导致查询
INSERT INTO comment (text, article_id) VALUES ('' || (SELECT login || password FROM user) || '', 4)
然而,这会导致
org.hsqldb.HsqlException: cardinality violation
问题:
我假设这是因为 (SELECT login || password FROM user)
不是单个字符串,而是一个结果集,因此可能无法使用 ||
.
连接
是否有可能将完整的结果集转换为一个字符串,使其可以在这种 SQL 注入场景中使用(标准 SQL / SQL HSQLDB)?
你是对的,因为显然不止一个用户,并且从 SELECT.
返回多行
您可以将 LIMIT 1
添加到 SELECT 以获得第一行。您还可以从内部 SELECT 创建一个字符串数组。请参阅指南。
在 HSQLDB 中,每个数据库用户对 table 都有单独的访问权限。在实际部署中,插入注释的用户甚至看不到包含密码的 table 的存在,更不用说 select 了。
作为安全代码课程的一部分,我获得了一个易受攻击的 Java 系统,其中使用字符串连接等构建查询。以下是我必须 SQL 注入以检索登录数据的相应代码行:
String comment;
int articleID;
//...
stmt.executeUpdate("INSERT INTO comment (text, article_id) VALUES ('" + comment + "', " + articleId + ")");
comment
可以设置为任何文本,它只是从文本框中读取纯文本。因此,我考虑将文本框文本设置为 SELECT
语句,读取完整的登录数据(table user
有列 login
和 password
):
' || (SELECT login || password FROM user) || '
总体上应导致查询
INSERT INTO comment (text, article_id) VALUES ('' || (SELECT login || password FROM user) || '', 4)
然而,这会导致
org.hsqldb.HsqlException: cardinality violation
问题:
我假设这是因为 (SELECT login || password FROM user)
不是单个字符串,而是一个结果集,因此可能无法使用 ||
.
是否有可能将完整的结果集转换为一个字符串,使其可以在这种 SQL 注入场景中使用(标准 SQL / SQL HSQLDB)?
你是对的,因为显然不止一个用户,并且从 SELECT.
返回多行您可以将 LIMIT 1
添加到 SELECT 以获得第一行。您还可以从内部 SELECT 创建一个字符串数组。请参阅指南。
在 HSQLDB 中,每个数据库用户对 table 都有单独的访问权限。在实际部署中,插入注释的用户甚至看不到包含密码的 table 的存在,更不用说 select 了。