首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使登录易受SQL注入登录旁路的影响

问使登录易受SQL注入登录旁路的影响
EN

Stack Overflow用户
提问于 2019-12-01 21:16:48
回答 1查看 568关注 0票数 0

我正在做一个关于SQL注入的学校项目。我创建了自己的Netbeans登录表单,以显示使用SQL注入的登录绕行。我使用这个youtube视频作为参考https://www.youtube.com/watch?v=3vauM7axnRs,因为这是我第一次使用Netbeans或任何数据库建设。表单有效,我伪造了登录凭据,但我没有成功地绕过该表单。我相信这是因为我正在使用prepareStatement来防止攻击。

代码语言:javascript
复制
import java.awt.Color;
*import java.sql.PreparedStatement;*
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

private void jButton_LoginActionPerformed(java.awt.event.ActionEvent evt) {                                              

    PreparedStatement st;
    ResultSet rs;

    //get username & password

    String username = jTextField1.getText();
    String password = String.valueOf(jPasswordField1.getPassword());

    //make sure username and passord are from query
    String query = "SELECT * FROM `users` WHERE `username` = ? AND `password` = ?";

   // show a message if the username or the password fields are empty
    if(username.trim().equals("username"))
    {
        JOptionPane.showMessageDialog(null, "Enter Your Username", "Empty 
    Username", 2);
    }
    else if(password.trim().equals("password"))
    {
        JOptionPane.showMessageDialog(null, "Enter Your Password", "Empty 
    Password", 2);
    }
    else{
    try {
        st = My_CNX.getConnection().prepareStatement(query);

        st.setString(1, username);
        st.setString(2, password);
        rs = st.executeQuery();

        if(rs.next())
        {
            //show new form
            Main_Menu form  = new Main_Menu();
            form.setVisible(true);
            form.pack();
            form.setLocationRelativeTo(null);
            //close the current form (login_form)

            this.dispose();

        }
        else{
            // error message
            JOptionPane.showMessageDialog(null, "Invalid Username / 
    Password","Login Error",2);
        }

    }


     catch (SQLException ex) {
        Logger.getLogger(Login_Form.class.getName()).log(Level.SEVERE, null, ex);
    }
    }

我在网上查看了一些示例,它们使用正则语句和createStatement,这很容易受到SQL攻击。我更改了prepareStatement,但是使用SQLSyntax时出现了一个错误。我得到的错误是:

您的SQL语法有错误;请检查与您的MariaDB服务器版本对应的手册,以获得正确的语法以使用near '?password = ?‘在第1行

代码语言:javascript
复制
import java.awt.Color;
*import java.sql.Statement;*
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

private void jButton_LoginActionPerformed(java.awt.event.ActionEvent evt) {                                              

    Statement st;
    ResultSet rs;

    //get username & password

    String username = jTextField1.getText();
    String password = String.valueOf(jPasswordField1.getPassword());

    //make sure username and passord are from query
    String query = "SELECT * FROM `users` WHERE `username` = ? AND `password` = ?";

    // show a message if the username or the password fields are empty
    if(username.trim().equals("username"))
    {
        JOptionPane.showMessageDialog(null, "Enter Your Username", "Empty 
    Username", 2);
    }
    else if(password.trim().equals("password"))
    {
        JOptionPane.showMessageDialog(null, "Enter Your Password", "Empty 
    Password", 2);
    }
    else{
    try {
        st = My_CNX.getConnection().createStatement();


        rs = st.executeQuery(query);

        if(rs.next())
        {
            //show new form
            Main_Menu form  = new Main_Menu();
            form.setVisible(true);
            form.pack();
            form.setLocationRelativeTo(null);
            //close the current form (login_form)

            this.dispose();

        }
        else{
            // error message
            JOptionPane.showMessageDialog(null, "Invalid Username / 
    Password","Login Error",2);
        }

    }


     catch (SQLException ex) {
        Logger.getLogger(Login_Form.class.getName()).log(Level.SEVERE, null, ex);
    }
    }

我正在使用MySQL。如果有一种方法可以使登录表单变得易受攻击,或者我可以使用一个查询,甚至可以使用prepareStatement,或者我只是有问题,我会感谢帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-02 01:51:23

我不太熟悉NetBeans或Java,但应该能够帮助您。

当您使用createStatement时,您并不是在替换问号。您需要使用表单中的值填充查询。MySQL错误就是这么说的。它在发送文字问号。

我认为你是对的,prepareStatement给你带来了麻烦。根据文件,问号是位置持有者,您可以在这里使用setInt, setString, setFloat等对用户输入进行消毒。

SQL注入攻击

SQL攻击的目的是欺骗应用程序去做它不应该做的事情。

因此,根据您的代码,由于您没有清理用户输入,输入以下密码应该删除该表:

代码语言:javascript
复制
hunter2; DROP TABLE USERS;

完成变量替换后,查询在MySQL中将如下所示(为清晰起见添加了新行):

代码语言:javascript
复制
SELECT * FORM `users` WHERE `username` = q13 AND `password` = hunter2; 
DROP TABLE USERS;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59130075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档