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

问题描述 投票:0回答:2

我有一个我试图“破解”的Web应用程序。这是一个需要用户名和密码输入的登录页面。假设我有一个表Auser,用于在MySQL中存储用户名的信息。

当我在键入凭据后点击Login时,它会执行以下代码行:

String sql = "select object(o) from Auser as o where ausername='" + username + "'";

现在,我知道不使用preparedStatement使SQL查询容易受到SQL注入,我想执行这样的特技表演。我创建了一个名为test的虚拟表,以便能够通过injection命令删除该表。

我在用户名输入中尝试了各种方法(root是用户名):

root` DROP TABLE test;

它没有用。有没有办法使我的注射成功?

更新:

只是额外的信息,我的用户名列是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,表仍然存在。我只是想利用我的程序的漏洞,它可以是任何类型的注入,无论是丢桌,返回所有用户信息等。

java sql-injection illegalargumentexception
2个回答
1
投票

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

这将保护您免受Robert'); DROP TABLE Students; --的攻击,但它不会保护攻击者无法扩展/更改正在运行的一个查询。

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

select object(o) from Auser as o where ausername='' OR 1 = 1 --'

这将选择表中的每个用户(请注意输入末尾的--将在注入的代码后注释掉所有内容),并且您的方法将返回结果列表中的第一个用户。这可能会为攻击者提供有关另一个用户的详细信息他们不应该访问的用户。如果第一个帐户是管理员帐户,那么他们也可能具有他们不应具有的访问权限。

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

他们还可能从失败尝试返回的错误消息中学习一些东西,例如数据库平台,这可以使攻击更容易。


0
投票
String sql = "select object(o) from Auser as o where ausername='" + username + "'";

如果要删除测试表

username = "x'; DROP TABLE test AND '1'='1"

如果要查看所有用户条目的所有字段

username = "x' OR '1'='1"
© www.soinside.com 2019 - 2024. All rights reserved.