0


WebGoat SQL Injection (intro) 源码分析

首先了解 java 中 mysql 的连接:java连接Mysql

WebGoat SQL Injection (intro)

10

根据提示:下面两个输入框只有一个受到 sql 注入攻击。题目要求是检索到所有数据

发现请求路径为 SqlInjection/assignment5b

定位到所在文件如下,根据代码可知:

  1. 使用的 PreparedStatement 执行 sql 语句,并且 SQL 语句中,Login_Count的值使用占位符 ? 代替,从而避免了Login_Count 值受到 sql 注入攻击;
  2. 并且判断了Login_Count 值是否为数字类型;
  3. 而userid 值在 sql 语句中并未使用占位符,而是依然采用拼接 sql 语句的方式,从而导致存在 sql 注入。

public class SqlInjectionLesson5b extends AssignmentEndpoint {

    //表明dataSource是一个LessonDataSource类型的对象。
  private final LessonDataSource dataSource;

  public SqlInjectionLesson5b(LessonDataSource dataSource) {
    this.dataSource = dataSource;
  }

  @PostMapping("/SqlInjection/assignment5b")
  @ResponseBody
  public AttackResult completed(
      @RequestParam String userid, @RequestParam String login_count, HttpServletRequest request)
      throws IOException {
    return injectableQuery(login_count, userid);
  }

  protected AttackResult injectableQuery(String login_count, String accountName) {
      //SQL 语句,Login_Count的值使用占位符 ?
    String queryString = "SELECT * From user_data WHERE Login_Count = ? and userid= " + accountName;
    //连接数据库。
    try (Connection connection = dataSource.getConnection()) {
        //创建一个 prepareStatement 对象,用于执行 SQL 查询。
        PreparedStatement query = connection.prepareStatement(queryString, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

      int count = 0;
      try {
        count = Integer.parseInt(login_count);  //判断字符串login_count是否为整数
      } catch (Exception e)
      {
       ...
      }

      query.setInt(1, count);  //将query语句中的第一个参数占位符(索引从1开始)Login_Count替换为count的值
      // String query = "SELECT * FROM user_data WHERE Login_Count = " + login_count + " and userid
      // = " + accountName, ;
      try {
        ResultSet results = query.executeQuery();

        ...
      } 
  }
}

所以可知userid 值存在 sql 注入,并且Login_Count 的值需要输入数字类型才行

所以输入如下,即可获取所有查询数据

11

执行后定位到代码所在文件,可以看出使用Statement 的方式执行 sql 语句,并且 name 和 auth_tan 是使用字符串拼接的的方式插入到 sql 语句中,且未进行任何过滤

题目要求是查询到所有数据。可以构造如下语句成功查询

拼接后所执行的 sql 语句为

SELECT * FROM employees WHERE last_name = '' or 1=1 --+' AND auth_tan = ''

12

上一题仅仅是获取到全部员工的列表信息,这次题目要求将数据库中自己的工资修改为比 Tobi 和 Bob 的工资高。利用联合查询,同时执行多条 sql 语句

' or 1=1; Update employees SET SALARY=99999 where USERID=37648 --

13

题目显示存在一个 access_log 表,记录了我们的操作,现在需要把它删除。观察源码

执行的 sql 语句的含义:用于从名为access_log的数据库表中检索数据。这个查询的目的是找出表中所有action列中包含特定字符串(即变量action的值)的记录。

String query = "SELECT * FROM access_log WHERE action LIKE '%" + action + "%'";

与上一题思路相同,再第二句SQL语句中执行 DROP 命令,删除access_log表中的数据。所以构造 sql 语句

' or 1=1; drop TABLE access_log --+

本文转载自: https://blog.csdn.net/qq_44159028/article/details/142961330
版权归原作者 Ly4j 所有, 如有侵权,请联系我们删除。

“WebGoat SQL Injection (intro) 源码分析”的评论:

还没有评论