欢迎来到萧静默的博客

书山有路勤为径,学海无涯苦作舟。

Java-JDBC-SQL注入攻击实例及反注入攻击

package cn.bruce.MySql;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;

public class LOGON {

    public static void main(String[] args) {
        String usename, password, url, sql, jdbc, sname, spass;
        Connection con = null;
        usename = "root";
        password = "jinqi1986";
        url = "jdbc:mysql://localhost:3306/mytrain?useSSL=false&serverTimezone=CTT";
        // url =
        // "jdbc:mysql://localhost:3306/mytrain?useSSL=false&serverTimezone=CTT";
        sql = "select * from users ";
        jdbc = "com.mysql.cj.jdbc.Driver";
        // 加载驱动
        try
        {
            Class.forName(jdbc);
            System.out.println("加载驱动成功!");
        } catch (Exception e)
        {
            System.out.println("加载驱动失败!");
        }
        // 连接数据库
        try
        {
            con = DriverManager.getConnection(url, usename, password);
            System.out.println("连接数据库成功!");
        } catch (Exception e)
        {
            System.out.println("连接数据库失败!");
        }

        // 执行SQL语句-注入攻击实例
        try
        {
            Statement sa = con.createStatement();
            Scanner sc = new Scanner(System.in);
            // 用户名和密码可以随便输
            System.out.println("请输入用户名:");
            String n = sc.nextLine();
            // 只要密码输入里有'or' 1=1就可以进行SQL漏洞攻击
            System.out.println("请输入密码:");
            String p = sc.nextLine();
            sql = "select * from users where zusename = '" + n + "' and zpassword = '" + p + "';";
            System.out.println(sql);
            ResultSet rs = sa.executeQuery(sql);
            while (rs.next())
            {
                System.out.println("用户名:" + rs.getString("zusename") + "  " + "密码:" + rs.getString("zpassword"));
            }
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        // 执行SQL语句-使用预编译实例--推荐使用这种使用方法
        try
        {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入用户名:");
            String n = sc.nextLine();
            System.out.println("请输入密码:");
            String p = sc.nextLine();
            // sql语句中的参数全部采用?进行占位
            sql = "select * from users where zusename = ? and zpassword = ?";
            PreparedStatement ps = con.prepareStatement(sql);// 预编译
            // 使用ps的set方法进行参数的赋值
            ps.setString(1, n);
            ps.setString(2, p);
            System.out.println(sql);
            ResultSet rs = ps.executeQuery();// 参数不需要SQL
            while (rs.next())
            {
                System.out.println("用户名:" + rs.getString("zusename") + "  " + "密码:" + rs.getString("zpassword"));
            }
            rs.close();// 关rs
        } catch (Exception e)
        {
            e.printStackTrace();
        } finally
        {
            try
            {
                con.close();// 关连接
            } catch (Exception e2)
            {
                e2.printStackTrace();
            }
        }
    }
}

 

posted @ 2020-09-23 16:12  萧静默  阅读(492)  评论(0编辑  收藏  举报