JFinal是怎么解决http host头攻击漏洞的?

我尝试了添加 Interceptor,然后模拟host攻击,当http请求填充host后请求时没有进入Interceptor,又尝试了添加 Handler 依然是没有进入Handler,不知道JFinal是如何处理这种漏洞攻击。

  1. 模拟host篡改攻击

    图片.png

    图片.png

    图片.png

  2. 创建com.jfinal.handler.Handler子类

    图片.png

  3. 把Handler子类添加到启动配置,也尝试过添加com.jfinal.aop.Interceptor过滤器实现类

    图片.png

  4. 测试普通请求,非篡改host的请求能进入自定义的handler,但是改动host后就无法进入到这层handler了,Interceptor也是同样的情况

    图片.png

  5. 尝试添加javax.servlet.Filter实现类,

    图片.png

    图片.png

  6. 再次模拟http host篡改请求,结果和上面的handler一样,正常请求能拦截,但改动host后就没有进入我的filter

  7. 正如本文开头截图显示的,篡改host的请求有进入io.undertow.server.HttpHandler的一些实现类,如SetHeaderHandler、PathHandler,然后我尝试了自定义了一个HttpHandler子类,但http请求时没有触发我自定义的HttpHandler

    图片.png

  8. 最后的最后我只能通过变更io.undertow.server.handlers.SetHeaderHandler 源码来处理了,如果你们有更好的解决方法,烦请指导下我,谢谢了.

    图片.png


评论区

JFinal

2020-10-17 15:06

信息量不够,不知道问题是啥

四零四

2020-10-17 15:13

@JFinal 应该是undertow ,我们项目用了undertow和JFinal框架,怎么处理http host攻击漏洞呢?

SuperEric

2020-10-18 15:19

@四零四 http host头攻击漏洞是个什么洞?属于应用的问题吧?

四零四

2020-10-20 11:01

@SuperEric 如果是Tomcat可以用filter拦截,但对于undertow不熟悉,我目前只知道请求的时候会进入PathHandler,有没有办法注册与PathHandler同等级的handle,来拦截每个请求进行host检测?就是不改PathHandler,直接添加另外一个请求可以触发的handle,是怎么添加呢?我尝试了在启动类注册com.jfinal.handler.Handler子类,但这种host篡改的请求进入不了这层handler,我再次尝试添加io.undertow.server.HttpHandler实现类,但请求的时候没能像PathHandler那样被调用,不知道如果让请求也进入我新添加的这个实现类

SuperEric

2020-10-20 11:24

@四零四 能否补充代码或代码包说明?Show me the code!

JFinal

2020-10-20 12:34

@四零四 tomcat 可以添加 filter, jfinal undertow 也可以,注意看文档:
https://jfinal.com/doc/1-4

注意看文档的第 12 小节《12、添加 Filter、WebSocket、Servlet、Listener》

四零四

2020-10-20 12:42

@SuperEric 代码有点多,这里不能发截图,你有邮箱么?我可以直接发邮件给你吗?如果不可以,你回复我一下我在这里贴出来,就是会有点乱

SuperEric

2020-10-20 12:48

@四零四 可以编辑反馈内容,富文本编辑器带有代码块功能,贴问题核心代码。

四零四

2020-10-20 14:11

@SuperEric 我重新编辑了反馈内容,你看看是否明白?有点乱

四零四

2020-10-20 14:14

@JFinal 非常感谢,之前我不知道如何添加filter,看了文章知道了,但依然无法解决这个问题

JFinal

2020-10-20 15:47

@四零四 http host头攻击是如何实施的,有什么破坏后果,jfinal undertow 是不是天然免疫了?

异常是什么,我想了解更多信息,好解决问题

四零四

2020-10-20 16:06

@JFinal 正如我文中的第一个截图,用户输入的url是我网站服务的url,然后被别人改掉了请求头host,把host改为了知网的网址,然后页面显示的是知网的登录页,而不是我网站的登录页,基于这种情况,第三方可以伪造我的登录页来获取用户的登录信息。从模拟请求来看,跳转的页面是来自知网的,所以jfinal undertow 未能拦截这种漏洞。

JFinal

2020-10-20 16:37

@四零四 我看了看 http host 头攻击的相关资料,这个一般是通过配置 nginx 解决:
https://blog.csdn.net/u012903926/article/details/81702224

根本上来说,如果你的项目中没有使用 request.getHost() 这个值,是不会有害的,如果使用了,就要防一防

在 jfinal 之下,可以通过一个 handler 来处理一下,大致办法如下:
public class HostCheckHandler extends Handler {
static String host = PropKit.get("server.host");

public void handle(String target, HttpServletRequest req, HttpServletResponse res, boolean[] isHandled) {
if ( ! host.equals(req.getHost()) ) {
RenderKit.render404(...);
} else {
next.handle(req, res, isHandled);
}
}
}

注意上面的 host 属性从配置文件中来,你需要事先配置一个 server.host,在开发的时候,你可以配置成 localhost 就可以了

注意解决后来反馈一下

四零四

2020-10-20 16:41

@JFinal 我们项目没有用到nginx ,然后,你说的handler,我文中有提到过,如果host被改掉,是不会进入到handler这层的,经过httphandler后就跳转了

JFinal

2020-10-20 16:42

@四零四 既然被改掉了,是不是 undertow 已经帮你处理完了这个事,不用再操心这事了吧?

四零四

2020-10-20 16:49

@JFinal 并没有,我其实是想通过注册自定义的httphandler去处理,而不是改掉你们源码这种方式的,这个只能是没方案的方案。@SuperEric 或者你有更好的方案么?

JFinal

2020-10-20 17:24

@四零四 扩展 underotw 的 handler 解决一下试一试, jfinal undertow 提供了相应的扩展接口:
https://jfinal.com/share/2066