Tuesday, in How to DOS yourself, I described how to erroneously configure an Apache server and cause what appears to be a denial of service attack. There’s another way to do it that is even more insidious.
In Tuesday’s post I showed how to configure error documents. There’s apparently another way to configure things so that, rather than returning an error status code (403 Forbidden, 404 Not Found, etc.), the server returns a 302 Redirect status code. The redirect tells the client (i.e. the browser or crawler) that the page requested can be found at a new location. That new location is returned along with the 302 Redirect status code.
When a browser sees the 302 status code, it issues a request for the new page.
Now, imagine what happens if you block an IP address from accessing your site (see Tuesday’s article) and you configure the server to return a redirect status code when somebody tries to access from that blocked IP address:
- Client tries to access http://yoursite.com/index.html
- Server notices the blocked IP address and says, “return 403 Forbidden.”
- Custom error handling returns a 302 Redirect pointing to http://yoursite.com/forbidden.html.
- Browser receives redirect status code and issues a request for http://yoursite.com/forbidden.html
- Go to step 2.
The browser and server now enter a cooperative infinite loop, with the browser saying “Show me the forbidden.html page,” and the server saying, “View forbidden.html instead.”
This is more insidious because from the server’s point of view it looks like the client is perpetrating a denial of service attack by continually attempting to access the same document. But the client is simply following the server’s directions.
Web crawlers won’t fall into this trap because they keep track of the pages they’ve visited or tried to visit. A Web crawler will see the first redirect and attempt to access the forbidden.html page, but on the next redirect the crawler will see that it’s already attempted that page, and give up.
Not all browsers are that smart. Firefox tries a few times and then stops, showing an error message that says:
Firefox has detected that the server is redirecting the request for this address in a way that will never complete.
Internet Explorer, on the other hand, appears to continue trying indefinitely.
I don’t know enough about Apache server configuration to give an example of redirecting on error. I do know it’s possible, though, because I discovered such a redirect loop recently while investigating a problem report. Unfortunately, the Webmaster in question was not willing to share with me the pertinent sections of his .htaccess file.