java如何执行SQL注入以进行测试?

java如何执行SQL注入以进行测试?,java,sql-injection,illegalargumentexception,Java,Sql Injection,Illegalargumentexception,我有一个我正在尝试“破坏”的web应用程序。有一个需要输入用户名和密码的登录页面。假设我有一个表Auser,它在MySQL中存储用户名信息 键入凭据后单击Login时,它会执行以下代码行: String sql = "select object(o) from Auser as o where ausername='" + username + "'"; 现在,我知道不使用preparedStatement会使SQL查询容易受到SQL注入的攻击,我想执行这样的特技。我创建了一个名为test的虚

我有一个我正在尝试“破坏”的web应用程序。有一个需要输入用户名和密码的登录页面。假设我有一个表
Auser
,它在MySQL中存储用户名信息

键入凭据后单击Login时,它会执行以下代码行:

String sql = "select object(o) from Auser as o where ausername='" + username + "'";
现在,我知道不使用
preparedStatement
会使SQL查询容易受到SQL注入的攻击,我想执行这样的特技。我创建了一个名为
test
的虚拟表,以便能够通过injection命令删除该表

我尝试了各种方法,比如输入用户名(root是用户名):

但它不起作用。有没有办法让我的注射成功

更新

只是额外的信息,我的用户名列是
VARCHAR(255)
,我获取用户名的方法如下:

public Auser get(String username, boolean moreInfo) {
 try {
  Auser u = null;
  String sql = "select object(o) from Auser as o where ausername='" + username + "'";
  List resList = em.createQuery(sql).getResultList();
  if (resList == null) { // null check for sql query / library error
   msg = CoreUtil.wrapMsg(CoreUtil.FUNC_ERROR,
    this.getClass().getName(), "get[" + username + "]", "query error AUSER.");
  } else if (resList.isEmpty()) {
   msg = "User " + username + " not found.";
  } else {
   u = (Auser) resList.get(0);
  }
  return u;
 } catch (Exception e) {
  msg = CoreUtil.wrapMsg(CoreUtil.FUNC_ERROR,
   this.getClass().getName(), "get[" + username + "]", e.getMessage());
  return null;
 }
}
似乎每一个解决方案,我都试图不断抛出
IllegalArgumetnException
,表仍然存在。我只是想利用我程序的漏洞,它可以是任何类型的注入,无论是删除表、返回所有用户信息,等等

String sql = "select object(o) from Auser as o where ausername='" + username + "'";
如果要删除测试表

username = "x'; DROP TABLE test AND '1'='1"
如果要查看所有ausers条目的所有字段

username = "x' OR '1'='1"

EntityManager内置了一些(非常)基本的保护,不会在同一SQL语句中运行多个命令

这将保护您免受
Robert');落桌学生--,但它无法防止攻击者试图扩展/更改正在运行的一个查询

例如,在您的代码中,攻击者可以通过输入用户名
”或1=1--
,获取其他用户的详细信息;这将使正在执行的SQL字符串

select object(o) from Auser as o where ausername='' OR 1 = 1 --'
这将选择表中的每个用户(请注意,输入末尾的
--
将注释掉注入代码之后的所有内容),并且您的方法将返回结果列表中的第一个用户,这可能会向攻击者提供有关其不应访问的其他用户的详细信息。如果第一个帐户是管理员帐户,则他们可能还具有不应有的访问权限

攻击者还可以通过这种方式了解表的结构-他们可以尝试使用字符串,如
,IS_ADMIN=IS_ADMIN--
,或
,或ID=0--
。如果他们尝试了足够多的方法(这样的攻击可以很容易地自动化),当查询没有抛出错误时,他们将找到有效的列名。然后,他们可能会进行更有针对性的注入攻击,以获得对管理员帐户的访问权限


他们还可能从失败尝试返回的错误消息(如DB平台)中学习到一些东西,这会使攻击更容易。

Hey,您可能面临JDBC在一个查询中阻止多个子句的问题。您应该尝试使用
root'或'1'='1
。这将返回数据库中的所有用户。请单击此处。不要尝试做一件以上的事情,尝试扩展你已经可以做的一件事情的范围。不管你是否能看到它是如何被利用的,都要编写防注入代码:)@playeron我只想看看这个理论是如何运作的。毫无疑问,健壮的代码是优先考虑的,但出于好奇,您知道。但通常字符串变量在双引号之间不起作用,不断抛出IllegalArgument exeception
IllegalArgumen
给你什么消息?意外字符:“;”您到底想用SQL注入做什么?在我的例子中,我真的能成功地注入它吗?
select object(o) from Auser as o where ausername='' OR 1 = 1 --'