作为安全代码类(class)的一部分,我获得了一个易受攻击的 Java 系统,其中使用字符串连接等方式构建查询。以下是我必须通过 SQL 注入(inject)来检索登录数据的相应代码行:
String comment;
int articleID;
//...
stmt.executeUpdate("INSERT INTO comment (text, article_id) VALUES ('" + comment + "', " + articleId + ")");
comment
可以设置为任何文本,它只是从文本框中读取纯文本。因此,我考虑将文本框文本设置为 SELECT
语句,读取完整的登录数据(表 user
具有列 login
和 密码
):
' || (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 注入(inject)场景(在适用于 HSQLDB 的标准 SQL/SQL 中)的方式?
最佳答案
您是对的,因为显然有多个用户,并且 SELECT 返回了多行。
您可以将 LIMIT 1
添加到 SELECT 来获取第一行。您还可以从内部 SELECT 创建字符串数组。请参阅指南。
在 HSQLDB 中,每个数据库用户对表都有单独的访问权限。在实际部署中,插入注释的用户甚至不会看到包含密码的表的存在,更不用说从中进行选择了。
关于java - 在 SQL 中将完整结果集转换为字符串 (HSQLDB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36237970/