作者:雲悳蕲黇 | 来源:互联网 | 2024-10-19 08:23
漏洞概述
为了方便的获得网站域名,开发人员一般依赖于HTTP Host header。例如,在php里用_SERVER[“HTTP_HOST”]。但是这个header是不可信赖的,如果应用程序没有对host header值进行处理,就有可能造成恶意代码的传入。
解决方案
如果是php的话不要用SERVER_NAME,apache和Nginx通过设置虚拟机来记录非法header,而web开发中常见的运行容器就是tomcat,网络查找出的解决方案大多不适用,最后,我们找到了一个折中的办法。 主要解决办法,就是在请求拦截上面做host合法性校验,拦截掉非法请求。
public class SessionFilter implements Filter { public void doFilter ( ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = ( HttpServletRequest) req; HttpServletResponse response = ( HttpServletResponse) res; String requestHost = request. getHeader ( "host" ) ; if ( requestHost != null && ! ServerWhiteListUtil. isWhite ( requestHost) ) { response. setStatus ( 403 ) ; return ; } . . . } }
上述代码是常见的web系统拦截器doFilter方法,我们在方法开始的地方做host判定,如果不在白名单内,则返回403状态码。漏洞工具收到403后认为访问请求已被终止,就不会报错了。 其中,ServerWhiteListUtil.isWhite(requestHost))方法:
package . . . ; import java. io. InputStreamReader; import java. util. List; import com. google. gson. Gson; import com. google. gson. reflect. TypeToken; public class ServerWhiteListUtil { private static List< String> whiteList = null; ; static { try { whiteList = new Gson ( ) . fromJson ( new InputStreamReader ( ServerWhiteListUtil. class . getResourceAsStream ( "/serverWhiteList.json" ) ) , new TypeToken < List< String> > ( ) { } . getType ( ) ) ; } catch ( Exception e) { e. printStackTrace ( ) ; } } public static boolean isWhite ( String host) { if ( whiteList == null || whiteList. size ( ) == 0 ) { return true ; } for ( String str : whiteList) { if ( str != null && str. equals ( host) ) { return true ; } } return false ; } }
配置项serverWhiteList.json文件(放置在src根目录或resource配置目录,根据项目框架来定):
[ "www.aaa.com:78", "www.bbb.com:178" ]
关注公众号,一起分享实用安全技术,关注安全最新事件,记录工作常见问题,吐槽生活真心操蛋。