20061120

Eradicate HRS Once and for All

In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 spirit of how to perform output filtering, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 series of removing semantic flaws from your web applications is how to remove HTTP Response Splitting/HTTP Request Smuggling/HTTP Header Injection. And I believe that this is going to be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most difficult of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 series to write because of differences in standards and implementations.

If you do a search for any of those three, you'll find whitepapers on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first two, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 third is probably cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most pervasive, easily-exploitable, and dangerous. However, all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m stem from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same vulnerabilities - first is a lack of input validation on data that ultimately makes it into response headers, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second is a lack of output filtering on data going into response headers.

In most frameworks, you will have many different ways of applying headers - possibly one for sending a redirect, one for sending a cookie, and one for setting arbitrary headers - and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re could be more. Each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se take some sort of value that you (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 developer) are applying to a header. A redirect is just a 300 level response code with a Location header set to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new location. A cookie is just a Set-Cookie header with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookie name and value.

HTTP Headers need to be URL encoded - this is different from HTML encoding. The characters that are "special" to HTTP are different from those that are "special" in HTML. Fortunately, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's MORE support in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 frameworks (since it's lower level) for URL encoding than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is for HTML encoding. For example, in J2SE, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 java.net.URLEncoder class, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's not a J2SE encoder for HTML.

So cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 steps for output encoding this are similar to HTML:

  • Ensure that you've used to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 degree possible a level of indirection (particularly with exit pages - those are often implemented with a redirect).
  • Perform any business rule input validation on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data to ensure that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data received is meaningful in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operation you'll be using it in.
  • Perform URL encoding - if at all possible use your framework's built-in mechanism. Server.URLEncode in ASP/ASP.NET, java.net.URLEncoder.encode() in Java, urlencode in PHP, CGI::escape in Ruby.
  • Always, always, always determine if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's a better way to implement what you're doing without using headers - particularly stuff going into cookies. Racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than set a cookie with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 username, you should store cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 username in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 session, and always take it from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re (unless you're just using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cookie for auto-fill functionality after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user logs out). If you actually set a cookie with no expiration, it's very likely cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same value can (and should) be put in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 session instead.
The reason this one is so hard to write is twofold:
  • Particularly with my testing with J2EE, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are mixed results in actually trying to inject something. My testing has been limited, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only place that any documentation states is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Cookie constructor throws InvalidArgumentException (according to API doc) if you put in some unescaped and invalid character (such as a newline). However, in HttpResponse methods (sendRedirect(), addHeader(), etc.) my experience has been that newlines (and carriage returns and linefeeds) get translated to 0x20. I can't find anything in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Servlet specification that states this as a requirement, so I don't know if it's common or only cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way Tomcat handles it. I'll do more testing and let you know what I find from ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r vendors. (But I know from ethical hacking that I've seen HTTP injection in J2EE apps before).
  • If for some odd reason you can't find a method for URL encoding in your framework, it's actually not trivial to write. The HTTP RFC's are built from ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r RFC's (such as MIME, etc.), and so goes with headers. It's not just a matter of URL encoding so much as what needs to be specially handled. And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n, it's not just what characters as it is which instances of those characters. For example, if you're sending a redirect, you don't want to URL encode cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire URL, ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise, it's not a URL anymore - but you want to URL encode any parameters. So be very careful in dealing with this.
Hopefully this will get you started on writing safer headers. And really, if you can write fewer headers, by all means, do so.

0 comments: