在服务器端处理时在搜索字符串中输入特殊字符

Input special character in search string when handled at server side

我正在测试我正在进行的项目。在这里,我在服务器端(Java)放置了一个过滤器,每当我在查询字符串中遇到任何 HTML 标记(如正则表达式(URL Encoded is also checked))时,将页面重定向到错误页面.根据我的技能,它工作正常。但我非常确定这还没有结束。必须有一种方法仍然可以输入向量来执行 XSS 脚本。

示例 : 重定向到错误页面
%3Chello%3E 转换为 并重定向到错误页面
%253Chello%253E 转换为 %3Chello%3E & 页面工作正常,因为没有找到 HTML 标签。

  1. 您尝试的方法是黑名单方法,即搜索不良字符(IE <、>)并重定向到错误页面 and\or 对其进行编码。这是错误的做法。 如果输入包含任何不允许的字符,您应该使用允许字符的白名单并重定向到错误页面。实施此方法的一种方法是正则表达式:^[a-zA-Z0-9]*$^[\s\w]*$。添加客户端验证和服务器验证将使您安全无误(除非黑客试图绕过客户端验证,在这种情况下服务器验证会阻止他)。 如果您试图猜测攻击者的方法,您注定会失败。
  2. 对用户发起的输入进行编码以防止 XSS 的正确方法是 HTML 编码,而不是 URL 编码(不是 %3Chello%3E,而是 &gt;hello&lt;)。
  3. 如果您对用户输入进行编码,则不必将用户重定向到错误页面,因为您提供的示例和我提供的示例都是无害的
  4. 话虽如此,这里有一个没有 < 和 > 的 XSS 示例: 假设一个页面接收到一个图片文件名并显示它,并且不对引号字符进行编码:

    https://contoso.com/displaypic?source=111.jpg
    
    <img src="111.jpg"></img>
    

    如果你访问这个 URL,你自己就有了 XSS:

    https://contoso.com/displaypic?source=a"+onerror="alert('XSS')
    
    <img src="a" onerror="alert('XSS')"></img>