作为安全代码课程的一部分,我将获得一个易受攻击的Java系统,在该系统中,查询是使用字符串连接构建的,等等。下面是用于检索登录数据的SQL注入的相应代码行:
String comment;
int articleID;
//...
stmt.executeUpdate("INSERT INTO comment (text, article_id) VALUES ('" + comment + "', " + articleId + ")");
comment
可以设置为任何文本,它只是从文本框中读取纯文本.因此,我考虑将textbox文本设置为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中)?
发布于 2016-03-26 19:41:40
您是正确的,因为显然有多个用户,并且从SELECT返回多个行。
可以将LIMIT 1
添加到SELECT以获得第一行。还可以从内部选择创建字符串数组。看导游。
在HSQLDB中,每个数据库用户都有对表的单独访问权限。在实际部署中,插入注释的用户甚至看不到包含密码的表的存在,更不用说从中进行选择了。
https://stackoverflow.com/questions/36237970
复制相似问题