Details
Alert ID 40024-2
Alert Type Active
Status alpha
Risk High
CWE 89
WASC 19
Technologies Targeted Db / SQLite
Tags API_2023_API4
CWE-89
HIPAA
OWASP_2017_A01
OWASP_2021_A03
OWASP_2025_A05
PCI_DSS
POLICY_PENTEST
POLICY_QA_FULL
TEST_TIMING
WSTG-V42-INPV-05
More Info Scan Rule Help

Summary

SQL injection may be possible.

Solution

Do not trust client side input, even if there is client side validation in place. In general, type check all data on the server side. If the application uses JDBC, use PreparedStatement or CallableStatement, with parameters passed by '?' If the application uses ASP, use ADO Command Objects with strong type checking and parameterized queries. If database Stored Procedures can be used, use them. Do *not* concatenate strings into queries in the stored procedure, or use 'exec', 'exec immediate', or equivalent functionality! Do not create dynamic SQL queries using simple string concatenation. Escape all data received from the client. Apply an 'allow list' of allowed characters, or a 'deny list' of disallowed characters in user input. Apply the principle of least privilege by using the least privileged database user possible. In particular, avoid using the 'sa' or 'db-owner' database users. This does not eliminate SQL injection, but minimizes its impact. Grant the minimum database access that is necessary for the application.

Other Info

The query time is controllable using parameter value [case randomblob(100000) when not null then 1 else 1 end ], which caused the request to take [100] milliseconds, parameter value [case randomblob(1000000) when not null then 1 else 1 end ], which caused the request to take [200] milliseconds, when the original unmodified query with value [test] took [50] milliseconds.

References

Code

org/zaproxy/zap/extension/ascanrulesAlpha/SqlInjectionSqLiteTimingScanRule.java