使登录易受 SQL 注入登录绕过攻击
Make Login Vulnerable to SQL Injection Login Bypass
我正在做一个关于 SQL 注射的学校项目。我创建了自己的 Netbeans 登录表单以显示使用 SQL 注入的登录绕过。我使用这个 youtube 视频作为参考 https://www.youtube.com/watch?v=3vauM7axnRs 因为这是我第一次使用 Netbeans 或任何数据库构建。该表格有效,我制作了伪造的登录凭据,但我未能成功绕过该表格。我相信这是因为我正在使用 prepareStatement 来防止攻击。
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);
}
}
我在网上查看了一些示例,其中使用了容易受到 SQL 注入攻击的常规 Statement 和 createStatement。我更改了 prepareStatement,但 SQL 语法出现错误。我得到的错误是:
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '? AND password
= ?' at line 1
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 进行查询,或者我只是出了点问题,我将不胜感激。
我对 NetBeans 或 Java 不是很熟悉,但应该可以帮助您。
当您使用 createStatement
时,您并没有替换问号。您需要使用表单中的值填充查询。这就是 MySQL 错误所说的。它正在发送文字问号。
我认为您是对的,prepareStatement
给您带来了麻烦。 According to the documentation,问号是占位符,您可以在其中使用 setInt, setString, setFloat
等来清理用户输入。
SQL 注入攻击
SQL 攻击的目的是诱使应用程序做一些它不应该做的事情。
所以根据你的代码,由于你没有清理用户输入,输入以下密码应该会删除 table:
hunter2; DROP TABLE USERS;
一旦您进行了变量替换,MySQL 的查询将如下所示(为清楚起见添加了新行):
SELECT * FORM `users` WHERE `username` = q13 AND `password` = hunter2;
DROP TABLE USERS;
我正在做一个关于 SQL 注射的学校项目。我创建了自己的 Netbeans 登录表单以显示使用 SQL 注入的登录绕过。我使用这个 youtube 视频作为参考 https://www.youtube.com/watch?v=3vauM7axnRs 因为这是我第一次使用 Netbeans 或任何数据库构建。该表格有效,我制作了伪造的登录凭据,但我未能成功绕过该表格。我相信这是因为我正在使用 prepareStatement 来防止攻击。
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);
}
}
我在网上查看了一些示例,其中使用了容易受到 SQL 注入攻击的常规 Statement 和 createStatement。我更改了 prepareStatement,但 SQL 语法出现错误。我得到的错误是:
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '? AND
password
= ?' at line 1
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 进行查询,或者我只是出了点问题,我将不胜感激。
我对 NetBeans 或 Java 不是很熟悉,但应该可以帮助您。
当您使用 createStatement
时,您并没有替换问号。您需要使用表单中的值填充查询。这就是 MySQL 错误所说的。它正在发送文字问号。
我认为您是对的,prepareStatement
给您带来了麻烦。 According to the documentation,问号是占位符,您可以在其中使用 setInt, setString, setFloat
等来清理用户输入。
SQL 注入攻击
SQL 攻击的目的是诱使应用程序做一些它不应该做的事情。
所以根据你的代码,由于你没有清理用户输入,输入以下密码应该会删除 table:
hunter2; DROP TABLE USERS;
一旦您进行了变量替换,MySQL 的查询将如下所示(为清楚起见添加了新行):
SELECT * FORM `users` WHERE `username` = q13 AND `password` = hunter2;
DROP TABLE USERS;