Time-based SQL injection is a sort of assault the place the attacker checks if a web site has a vulnerability by measuring how lengthy it takes for the database to reply. On this assault, the attacker injects SQL code into an internet enter subject, like a search field or type, to make the database reply slowly on function.
As an alternative of exhibiting errors or returning information straight, as with different SQL injection strategies, time-based SQL injection solely reveals the attacker whether or not a delay occurred. For instance, the attacker may use an SQL question like this:
1' OR IF(1=1, SLEEP(5), 0) --
On this instance, if the database is weak, it would wait (or “sleep”) for five seconds earlier than responding. This delay tells the attacker that their code labored, confirming that the database is in danger. Time-based SQL injection effectiveness is very depending on direct and uninterrupted interplay with the database, which trendy environments with reverse proxies, cache servers, and different optimizations can disrupt. Trendy internet environments typically embrace options like reverse proxies, caching, and content material supply networks (CDNs) to enhance efficiency and deal with excessive site visitors. These options can intervene with safety testing strategies, together with time-based SQL Injection.
Study extra about blind SQL injection
How caching and proxies have an effect on time-based SQL injection
A typical instance is a reverse proxy with caching. When a tester (or hacker) sends a request with a time-based SQL injection payload, corresponding to 1' OR IF(1=1, SLEEP(5), 0) --
, the primary request may attain the database and trigger a 5 second delay, suggesting a attainable vulnerability. However when caching is enabled, the proxy may retailer this response. For repeated an identical requests, the response may very well be served from the cache with out being executed by the database. This might trigger the tester to mistakenly consider that the vulnerability is a false constructive or doesn’t exist as a result of the anticipated delay doesn’t happen.
Testing situation for checking time-based SQL injection
This check reveals how a reverse proxy with caching, like Nginx, can have an effect on testing for time-based SQL injection vulnerabilities. By configuring Nginx as a reverse proxy with caching enabled, we are able to see how repeated requests could also be dealt with in a different way.
Configuring Nginx for reverse proxy and caching
Nginx is ready as much as function a reverse proxy for a backend PHP utility related to a database:
proxy_cache_path /var/cache/nginx ranges=1:2 keys_zone=my_cache:10m max_size=1g inactive=60s;
server {
pay attention 80;
# Configure the backend service
location / {
proxy_pass http://internet:80;
proxy_cache my_cache; # Allow caching
proxy_cache_bypass $arg_cache_bypass; # Permits cache bypass if wanted
proxy_cache_valid 200 10s; # Cache profitable responses for 10 seconds
add_header X-Cache-Standing $upstream_cache_status;
}
}
Docker Compose setup
Here’s a fundamental instance of a docker-compose.yml
file that units up an atmosphere with Nginx as a reverse proxy, a PHP utility with a weak endpoint, and a MySQL database.
DB service (MySQL database):
db:
picture: mysql:5.7
atmosphere:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: check
MYSQL_USER: tim
MYSQL_PASSWORD: check
ports:
- 3306:3306
volumes:
- ./dump:/docker-entrypoint-initdb.d
restart: at all times
container_name: mysql_database
This initializes a MySQL database with information from dump.sql
, offering a check database for SQL injection.
Net service (PHP internet utility):
internet:
construct:
context: ./
container_name: php_web
depends_on:
- db
volumes:
- ./php/:/var/www/html/
ports:
- 8080:80
stdin_open: true
tty: true
restart: at all times
This service runs the weak PHP utility, linking it with the database and making it accessible on port 8080.
RP service (Nginx Reverse Proxy):
rp:
picture: nginx:newest
depends_on:
- internet
ports:
- 80:85
volumes:
- ./nginx.conf:/and so forth/nginx/nginx.conf
restart: at all times
container_name: reverse_proxy
Acts as a reverse proxy. It makes use of the customized configuration from nginx.conf
to allow caching.
Working payloads
As you may see within the decrease proper nook, the payload executed efficiently, and the response was delayed by 5 s (X-Cache-Standing: MISS
).
However the second response was delayed solely 13 ms as a result of cache server’s response.
Cache bypass strategies
Add distinctive parameters: By including a random or distinctive parameter to every request, caching mechanisms deal with every request as new. For instance, you may add &cachebuster=12345
on the finish of the URL, the place 12345
is a random quantity that modifications with every request.
Utilizing float numbers: By making small changes within the delay worth (e.g., 5 vs. 5.0), caching mechanisms deal with every request as distinctive as a result of distinction within the question construction. For instance, utilizing SLEEP(5)
in a single request and SLEEP(5.0)
within the subsequent can stop the caching layer from recognizing these as an identical.
Utilizing arithmetic operations: By including arithmetic expressions inside the delay perform (e.g., SLEEP(3+2)
or SLEEP(10/2)
as a substitute of SLEEP(5)
), caching mechanisms interpret every request as distinctive as a result of distinction in question construction.
Including feedback in payloads: By inserting random feedback (e.g., /*234*/
) inside the SQL payload, you may make every request seem distinctive to caching mechanisms, despite the fact that the question logic stays unchanged. Right here’s an instance utilizing 1' OR IF(1=1, SLEEP(5), 0) -- /*234*/
:
Utilizing redundant expressions in payloads: Including innocent expressions, corresponding to 123=123
, makes every request seem distinctive to caching mechanisms whereas retaining the SQL logic unchanged. Right here’s the way it works for the question 1' OR IF(1=1, SLEEP(5), 0) AND 123=123 --
:
Why we’d like this strategy
When testing for time-based SQL injection vulnerabilities utilizing ZAP, I encountered a problem after introducing a cache server. After I repeated a check scan with the cache server, the response was served straight from the cache for an identical requests after the primary one, returning immediately with out re-executing the SQL question. Consequently, ZAP didn’t report the SQL injection vulnerability, because the caching mechanism masked the delay that may usually point out profitable injection. This reveals how caching layers can disrupt time-based testing by offering rapid, cached responses that bypass the backend solely, resulting in missed detections.
Scan outcomes and not using a cache server (vulnerability discovered):
Scan outcomes when a cache server is used (vulnerability not discovered):
Conclusion
Trendy environments can have an effect on the vulnerability testing course of, so we should always put together our methodologies to stop these conditions. Typically simply your Nginx configuration can introduce crucial vulnerabilities like internet cache deception or trigger you to overlook some vulnerabilities in testing, like blind SQL injection.