Firewalls are everywhere. They filter unexpected traffic, and log everything for later analysis. They improve security by restricting access to potentially vulnerable software that only needs to be accessed internally. They proactively filter ports and services which may have undiscovered vulnerabilities. They prevent information gathering which might aid a future attack. They’re relatively easy to deploy and don’t require as much specialized knowledge as other security methods. Firewalls work.
Firewalls are a crutch. They allow systems and network administrators to say that a network is secure without spending the time to secure each machine and component. They mean that the sysadmin may choose not to disable every unused service and port on a machine. They mean that companies use unprotected file shares rather than authenticating each user and encrypting the protocol. They allow administrators to deploy applications which are not secure, with the explanation that the firewall will make them so.
This has historically worked pretty well. Firewalls do work, after all.
Today the situation is different.
While firewalls are very good at blocking all kinds of inbound traffic, they necessarily allow outbound web traffic to pass through. Internet access is a requirement for most jobs, and so administrators install antivirus, keep desktop software up to date, and hope that they don’t get a motivated attacker with a new 0-day.
This also works pretty well, except for one thing:
A properly functioning, fully patched web browser is an ideal gateway to internal web-based assets that are “Behind the Firewall”. By design, the browser is able to access content from multiple domains, and the rise of javascript (and now the various features of HTML5) allow a remote attacker to pass requests through the firewall to be made internally by trusted machines. Frameworks like BeEF make this tunneling trivial. Add a little DNS trickery and a browser can be convinced to do pretty advanced scans of private networks.
Web applications deployed behind the firewall should be secure enough to deploy facing the internet. This is especially true when the code is written for internal consumption by programmers with a deadline. The firewall can prevent many evils, but it won’t prevent web browsers from behaving as designed.