作为安全代码课程的一部分,我被赋予了一个易受攻击的Java系统,其中查询是使用字符串连接建立的,依此类推。以下是我必须使用SQL注入来检索登录数据的相应代码行:
String comment;
int articleID;
//...
stmt.executeUpdate("INSERT INTO comment (text, article_id) VALUES ('" + comment + "', " + articleId + ")");
comment
可以设置为任何文本,它只是从文本框中读取纯文本。因此,我考虑将文本框文本设置为SELECT
语句,阅读完整的登录数据(表user
包含列login
和password
):
' || (SELECT login || password FROM user) || '
总体上应该导致查询
INSERT INTO comment (text, article_id) VALUES ('' || (SELECT login || password FROM user) || '', 4)
然而,这会导致
org.hsqldb.HsqlException:基数违规
问题:
我认为这是因为(SELECT login || password FROM user)
不是单个字符串,而是结果集,因此不能使用||
连接。
是否可以将完整的结果集转换为可在此SQL注入方案中使用的方式(在适用于HSQLDB的标准SQL / SQL中)?
答案 0 :(得分:1)
你是对的,因为显然有多个用户从SELECT返回多行。
您可以将LIMIT 1
添加到SELECT以获取第一行。您还可以从内部SELECT创建一个字符串数组。请参阅指南。
在HSQLDB中,每个数据库用户都拥有对表的单独访问权限。在实际部署中,插入注释的用户甚至看不到包含密码的表的存在,更不用说从中进行选择。