Попытка реализовать уязвимость SQL в веб-приложении Java.Java + MySQL - PullRequest
0 голосов
/ 14 февраля 2019

Это немного странно.Для моего финального проекта я пытаюсь разработать уязвимое веб-приложение в качестве учебного пособия.Одной из уязвимостей, которые я хочу реализовать, является уязвимость SQL, когда пользователь может выполнить инъекцию SQL через страницу «поиска продукта» на сайте.

Проблема заключается в том, что где-то по ходу процесса входные данные автоматически очищаются, что означает, что я не могу выполнить инъекционную атаку.Я сделал тестовую запись только одной кавычки ('), и она возвращается, когда в поиск вводится одна кавычка.Если вход не был обработан, он вернул бы ошибку, верно?Я думаю, что это может быть функцией программного обеспечения, которое я использую, и которое мне нужно будет отключить или использовать более старую версию, или я случайно настроил ее так, чтобы это происходило.Если кто-нибудь знает, почему это может произойти, любая помощь будет высоко ценится!:)

У меня есть база данных, настроенная в MySQL Community Server 8.0.13, и простое приложение, созданное с использованием JSP.Я включил исходный код ниже.

Страница 'Поиск продукта':

<%@page import="java.sql.Connection"%>
<%@page import="databaseManagement.DBConnection"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.SQLException"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.PreparedStatement"%>

<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Search Our Products</title>
</head>
<body>
    <h1>Search for a product</h1>
    <form method="post" action="ProductSearch">

        Search: <input type="text" name="Search"> <br> 
        <input type="submit" value="Go"> 

        <%@taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%><br>

                <table align="left" border="1">
                        <tr>
                            <th>ID</th>
                            <th>Name</th>
                            <th>Description</th>
                            <th>Price</th>
                        </tr>
                        <c:forEach var="product" items="${r1}">


                            <tr bgcolor="">

                                <td>${product.id}</td>
                                <td>${product.name}</td>
                                <td>${product.description}</td>
                                <td>${product.price}</td>
                            </tr>
                        </c:forEach>
                    </table>
    </form>
</body>
</html>

Java-сервлет:

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import databaseManagement.DBConnection;
import databaseManagement.Product;

@WebServlet("/ProductSearch")
public class ProductSearch extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public ProductSearch() {
        super();
        // TODO Auto-generated constructor stub
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub

        String searchTerm = request.getParameter("Search");
        searchTerm = "%" + searchTerm + "%";
        ArrayList<Product> ab = new ArrayList();

        try {

            String sql1 = "select * from products where name like ?;";
            DBConnection db = new DBConnection();
            Connection con = db.getConnection();

            PreparedStatement ps = con.prepareStatement(sql1);

            ps.setString(1, searchTerm);

            ResultSet rs = ps.executeQuery();
            while (rs.next()) {

                Product b = new Product();
                b.setId(rs.getInt("id"));
                b.setName(rs.getString("name"));
                b.setDescription(rs.getString("description"));
                b.setPrice(rs.getString("price"));
                ab.add(b);
            }

            request.setAttribute("r1", ab);
            request.getRequestDispatcher("productSearch.jsp").forward(request, response);

        }

        catch (Exception s2) {
            s2.printStackTrace();
        }

    }
}

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Фрагмент метода doPost, который должен быть помещен для принятия SQL-инъекции:

....
try {

        String sql1 = "select * from products where name like '"+searchTerm+"';";
        DBConnection db = new DBConnection();
        Connection con = db.getConnection();

        Statement ps = con.createStatement();

        ResultSet rs = ps.executeQuery();
        while (rs.next()) {

....

PreparedStatement предотвращает SQL-инъекцию, поэтому используйте вместо него Statement.

0 голосов
/ 14 февраля 2019

Это PreparedStatement, кто очищает ваши данные.Вместо того, чтобы устанавливать ваши параметры, просто объедините их в sql.

...