首先了解 java 中 mysql 的连接:java连接Mysql
WebGoat SQL Injection (intro)
10
根据提示:下面两个输入框只有一个受到 sql 注入攻击。题目要求是检索到所有数据
发现请求路径为 SqlInjection/assignment5b
定位到所在文件如下,根据代码可知:
- 使用的 PreparedStatement 执行 sql 语句,并且 SQL 语句中,Login_Count的值使用占位符 ? 代替,从而避免了Login_Count 值受到 sql 注入攻击;
- 并且判断了Login_Count 值是否为数字类型;
- 而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 --+