您好我有以下查询,它是java类的一部分。我只是想知道SQL注入可能发生的攻击是什么。攻击者如何注入查询?在这种情况下,可用于获取数据库访问权限的示例查询是什么?
String query = ("SELECT username, password, admin FROM users
WHERE " + "username='" + username + "' AND password='" +
password + "'");
ResultSet rs = st.executeQuery(query);
// Entry in the result set means the query was successful and
//the user is a valid user
if (rs.next()) {
username = rs.getString(1);
isAdmin = rs.getBoolean(3);
我认为这也是一种可能的攻击方式,也可以将用户名设置为abc';#因为#之后的任何内容都将被视为SQL中的注释。别人怎么想呢?
我想知道攻击者将在HTML页面的用户名框和密码框中输入什么内容以获得管理员权限。假设上述java类的工作是通过查询数据库来处理来自HTML页面的用户输入的请求。
答案 0 :(得分:3)
基本上它就像这个https://xkcd.com/327/
一样我所做的是假设用户输入的所有内容都是威胁,所以我会将所有内容保存到usUsername
等变量中,其中" us"意味着不安全。
在那之后,我检查每个" us" -variable进行注射,结果为sUsername
(s表示安全)。因此,当我构建查询时,我只能使用s-varaibles,并且在大多数情况下应该是安全的。
这个想法完全取自这里:http://www.joelonsoftware.com/articles/Wrong.html
答案 1 :(得分:2)
根据此代码,您可以通过操纵发送到查询的用户名或密码文本的值来执行您想要的任何操作。
唯一的限制是执行查询的用户帐户的权限级别。如果它是一个系统管理员,你可以删除所有内容。如果启用了SQL Server和xp_cmdshell,则可以格式化SQL Server的硬盘驱动器。
SQL注入就是其中一项,如果你可以做某事,你几乎可以做任何事情。
查看Havij工具,这是一个可以展示SQLi强大功能的安全研究工具。
答案 2 :(得分:0)
你做不到。用户名和密码可以替换为导致所有类型查询的任何内容。您必须使用预准备语句来提供用户名和密码
答案 3 :(得分:0)
为密码输入以下值会在结果集中添加一行,其中包含 username <的值'admin'
,'dummy'
,1
/ em>,密码和 admin 分别为:
' AND 1=0 UNION SELECT 'admin', 'dummy', admin FROM users WHERE admin = 1 AND '1'='1
生成的查询如下所示:
SELECT username, password, admin FROM users
WHERE username='dummy' AND password='' AND 1=0 UNION SELECT 'admin', 'dummy', admin FROM users WHERE admin = 1 AND '1'='1'
对于每条记录,第一个SELECT将不返回任何结果,因为1=0
为false。但第二个注入的SELECT将返回admin=1
为真的所有记录,并用admin
和{{替换用户名和密码的原始值1}},分别。
你应该use prepared statements并在执行时将值作为参数传递。