您好我有以下查询这是一个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页面输入的请求。
基本上它是这样工作的https://xkcd.com/327/
我做的是假设,一切用户输入是一种威胁,所以我将一切保存到变量一样usUsername
,这里的“我们”是指不安全。 从那以后,我检查每一个“我们” -variable打针,什么导致sUsername
(s表示安全)。 所以,当我创建一个查询我只能用S-varaibles,并应在大多数情况下是安全的。
这种想法完全是从这里取: http://www.joelonsoftware.com/articles/Wrong.html
在此基础上的代码,你可以通过操纵发送给查询用户名或密码的文本值做任何你想要的。
唯一的限制是执行查询的用户帐户的权限级别。 如果它是一个系统管理员,你可以删除所有内容。 如果它是SQL Server和xp_cmdshell的启用,可以格式化SQL服务器的硬盘驱动器。
SQL注入是那些东西在那里,如果你可以做一些事情 ,你几乎可以做任何事情之一。
看看进入Havij工具,这是一个安全的研究工具,可以证明SQLI的力量。
你不能这样做。 用户名和密码可以通过任何导致所有类型的查询所取代。 您必须使用准备好的语句,以提供用户名和密码
输入下列值密码将添加一行包含值的结果集合'admin'
, 'dummy'
, 1
为用户名 , 密码 ,和管理员 ,分别为:
' 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
是为每个记录假。 但第二,注入的SELECT语句返回所有的记录,其中admin=1
是真实的,并取代了用户名和密码的初始值admin
和dummy
,分别。
你应该用准备好的语句 ,并传递值作为执行参数。