Tuesday, January 23, 2007

XSS filter to protect from XSS attacks

Here are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 excerpts from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chilling effect

Grossman, who founded his own research company, WhiteHat, claims XSS vulnerabilities can be found in 70 percent of websites. RSnake goes furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. "I know Jeremiah says seven of 10. I'd say cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's only one in 30 I come across where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XSS isn't totally obvious. I don't know of a company I couldn't break into [using XSS]."
If you apply Grossman's number to a recent Netcraft survey, which estimated that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are close to 100 million websites, you've got 70 million sites with XSS vulnerabilities. Repairing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m one-off, two-off, 200,000-off is spitting in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 proverbial ocean. Even if you've disclosed, you've done very little to reduce cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overall risk of exploit. "Logistically, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's no way to disclose this stuff to all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interested parties," Grossman says. "I used to think it was my moral professional duty to report every vulnerability, but it would take up my whole day."


If we can put an XSS filter in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 framework (for example, as a servlet filter in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java EE) cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n it would make it a lot easier for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 developers to not worry about all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 places where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are accepting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 input from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 client browser. Instead cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can just do a request.getParameter() and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 servlet filter would do all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filtering for XSS characters with each and every request which comes in to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JSP pages or servlets.

I have created a xss filter which can be tested at http://www.attacklabs.com/xssfilter/. It filters only 8 characters but it protects from all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 possible attack strings mentioned in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Rsnake’s cheat sheet. If you can find an xss attack which can bypass cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filter, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n please do submit it here or email it to me at anurag.agarwal@yahoo.com

Please bear in mind that this filter is not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right choice if you want your users to input HTML tags or urls.

Source Code

import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;

/**
*
* @author anurag agarwal
* @version 1.0
*/
public class XSSFilter extends HttpServlet {
private String[] filterChars = {"<", ">", "<", ">", "&#", "\"", "\\", "0x"};
private String[] replacementChars = {" ", " ", " ", " ", "#", "'", "/", "0 x"};

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();

String html = request.getParameter("html");
out.println("Here is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filtered output of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 html you submitted.");

out.println(filterRequest(html));

out.close();
}

private String filterRequest(String param) {
String value = param;

if( param!=null) {

for(int i = 0; i < filterChars.length; i++) {
value = filterCharacters(filterChars[i], replacementChars[i], value);
}

}

return value;

}

private String filterCharacters(String originalChar, String newChar, String param)
{
StringBuffer sb = new StringBuffer(param);

for(int position = param.toLowerCase().indexOf(originalChar); position >= 0; ) {
sb.replace(position, position + originalChar.length(), newChar);
param = sb.toString();
position = param.toLowerCase().indexOf(originalChar);
}

return sb.toString();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
}

6 comments:

Anonymous said...

Hi,
nice but you forgot something very important:
What if we have for example a blogging webapplication in which an admin should be able to write postings with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 use of HTML but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 readers which want to leave a comment shouldn't be able to do so. Here you need to have a regulation about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filter rules for each group of users and so, it's not that easy to have one filter for everyone and everywhere. Especially you have problems, when you want or have to allow some HTML-Tags to everyone, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n you filter will not be able to work any more in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way our application should.
So I think once more this is a proof that we can filter (all known) XSS-Attacks very easy but only if we reduce cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 functionality of our application to a minimum.

Anonymous said...

This is a good but dangerous effort, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem is in this example is that Anurag is applying a blackList filter and is only protecting against one case of xss.

see http://blogs.owasp.org/diniscruz/2007/01/23/an-example-of-a-flawed-xss-blacklist-filter/ for more details

Dinis Cruz

Anurag Agarwal said...

I agree that it does not covers all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 websites. For examples blogs which lets you enter certain html characters or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 macá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365matics site as you mentioned, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n in my opinion 5-10% of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 websites would require such data and even those sites would not require in all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 input. Most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 websites in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir regular functionality would not even need cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filtered characters here as input.

This module here does not cater to those applications.

Anonymous said...

Hi Anurag,

Your filter seems to replace "&#" to "#",
but "&\0#" is NOT replaced to "#" (\0 = NUL character).
As you know, IE ignores NUL, so "&\0#" is treated as "&#".

Of course, this does'nt mean that your filter has exploitable
XSS hole, but I think this represents potential dangerousness of
your approach.

By cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way, I could not understand why "&#" should be replaced.
I think just escaping "&" to "&" is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 correct and easy way
in many situations. < > " ' are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same.

In addition, you have better remove non-SGML chars (ex. NUL),
because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y should not appear in html and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y make filtering
so difficult.

--
teracc

Anurag Agarwal said...

teracc

thanks for pointing this out. In this PoC, i am replacing \ with / but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is something else i was working on and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re it would have slipped through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cracks. I appreciate your input.

anurag

Anonymous said...

Thanks for sharing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filter!