日期:2014-05-18  浏览次数:20425 次

xss跨站脚本攻击思路
csdn的各位大虾们,大家好。
小弟在做论坛相关的web应用程序,涉及到跨站脚本攻击的问题,首先我贴出我现在知道的一些这方面的资料。
如果我们的网站没有做任何这方面的处理,此时ASP.Net的引擎会引发一个 HttpRequestValidationExceptioin,帮我们阻止了这些请求,此时如果我们想自己处理这个错误消息,我们可以通过把页面描述中的ValidateRequest="false"来禁用这个特性。
举例而言,处理这个异常其实只需要很简短的一小段代码就够了。在页面的Code-behind页面中加入这么一段代码:
C# code

protected void Page_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();
    if (ex is HttpRequestValidationException)
    {
        Response.Write("请您输入合法字符串。");
        Server.ClearError(); // 如果不ClearError()这个异常会继续传到Application_Error()。
    }
}


这样这个程序就可以截获 HttpRequestValidationException 异常,而且可以按照程序员的意愿返回一个合理的报错信息。
如果页面有富文本编辑器的控件的,那么必然会导致有<xxx>类的HTML标签提交回来。在这种情况下,我们不得不将validateRequest="false"。那么安全性怎么处理?如何在这种情况下最大限度的预防跨站脚本攻击呢?
首先,我们将输入字符串用 HttpUtility.HtmlEncode()来编码,将其中的HTML标签彻底禁止。

然后,我们再对我们所感兴趣的、并且是安全标签,通过Replace()进行替换。比如,我们希望有"<b>"标签,那么我们就将"&lt;b&gt;"显式的替换回"<b>"。
C# code

void submitBtn_Click(object sender, EventArgs e)
  {
    // 将输入字符串编码,这样所有的HTML标签都失效了。
    StringBuilder sb = new StringBuilder(
                            HttpUtility.HtmlEncode(htmlInputTxt.Text));
    // 然后我们选择性的允许<b> 和 <i>
    sb.Replace("&lt;b&gt;", "<b>");
    sb.Replace("&lt;/b&gt;", "");
    sb.Replace("&lt;i&gt;", "<i>");
    sb.Replace("&lt;/i&gt;", "");
    Response.Write(sb.ToString());
  }


这样我们即允许了部分HTML标签,又禁止了危险的标签。

根据微软提供的建议,我们要慎重允许下列HTML标签,因为这些HTML标签都是有可能导致跨站脚本攻击的。

  <applet>
  <body>
  <embed>
  <frame>
  <script>
  <frameset>
  <html>
  <iframe>
  <img>
  <style>
  <layer>
  <link>
  <ilayer>
  <meta>
  <object>


通过这种做法我们能够屏蔽所有的危险了,但我的问题是:我们在很多场合是必须允许用户进行html很多标签的输入的,比如论坛里的超链接或图片。比如在qq空间发表文章时,要想插入图片就要用[img]图片地址[/img],如果完全屏蔽很简单,只需要进行编码即可,但如果使用类似qq的模式,如果我把图片地址写成:javascript:alert("test");,类似于这样:
HTML code

[img]javascript:alert('welcome');[/img]


在这种情况下比如cnblog会把这段代码进行编码后原样显示,但如果img标签里面的确是个图片的地址他就会显示一个图片,现在的问题就是如何做到这一点?如何在用户提交的是一个图片的时候就显示一个图片,而如果是恶意的代码就直接编码原样显示?根据微软的建议,“默认禁止,显式允许”,也就是只有后面是图片的时候才显示图片其他情况都原样输出。因为恶意代码的方法有很多,比如如果我img标签是这样:
HTML code

[img]http://www.xx.xx.aspx[/img]


而xx.aspx内容很简单,类似这样:
C# code

response.write("<script language='javascript'>alert('xxx');</script>");


这样的又该如何处理?
总起来现在的问题就是,如果将服务器自定义的标签比如[img]安全准确的显示出来,也就是说服务器是如何对这些标签进行处理的?
小弟刚接触这些甚是不懂,希望做过的给点资料或思路。谢谢csdn的大虾们。

------解决方案--------------------
打比方:
某服务器上有n个站点,a,b,c,d,e...,站点文件夹放到d盘,且整个d盘都给了users或来宾帐号读写权限,当其中一个网站被人上传一个可遍历整个硬盘的文件(asp木马)上去时,是不是就可以对你的整个d盘上的所有文件进行操作呢?

所以我们首先要确定我们的权限问题
将D盘的users和其它没有必要的用户删除掉,在a(一个站点一个文件夹,文件夹名称越复杂越好)文件夹下创建www(也可以是别的IIS映射进来的文件夹),然后针对www给权限,一般我们这里可以给users读写权限,这里木马只能查看和操作www文件夹下的文件