1 resttemplate与close_wait
背景,植入resttemplate请求对外数据,发现每次请求会新建一个连接,而且完了也不关,显示close_wait,显然,在1分钟establish状态后,对方发起fin,我方ack,然后没有发fin,到这四次挥手就中断了
先要证明iframe不能跨端口
小插曲,本地可以,线上不行,
因为本地使用jetty,没有x-frame-options:SAMEORIGIN(注意,该x-frame-options对chrome大小写不敏感)
而线上由tomcat/conf/web.xml统一打开了
84
<filter>
<filter-name>httpHeaderSecurity</filter-name>
<filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
<async-supported>true</async-supported>
// 以下为额外添加
<init-param>
<param-name>antiClickJackingEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>antiClickJackingOption</param-name>
<param-value>SAMEORIGIN</param-value>
</init-param>
<filter>
看上去tomcat也没给机会
解决方案
生产:代理服务器
P.80 ? app=A80 iframe
P.80 ? app=A8080
P.80 ? app=A8081
P.80 ? app=A8082
开发;
fiddler篡改response,删掉X-Frame-Options
interface A
class A1 implements A
class A2 implements A
guice注入A1,A2,按名称
在aop中控中,用getBeanByClass形式去拿,是拿不到的,反哺失败
这里同事有个误区,A1,A2本身没有使用aop切面,直接注入原对象,为什么会报错
如下:
B {
inject
name(A_A1)
private A A1's object
};
cglib B = cglib(new B)
当反哺时,用A这个类型去取bean,是取不到的;考究的做法是,读取待反哺对象的name注解,如果有,则通过名称去bean里取
0
4 http response splitting
82
4.1 本地的jetty以
reponse.setRedirect(url + "\r\nHACK:hh\r\n\r\n")
并不能完成攻击,根据抓包,发现jetty将\r\n换为空格(%20)了
4.2 URLEncode.encode(url) 会导致非法url, 结论一致,urlencode会encode :/?=,本质是为了将用户的数据转义,如果将正常的url也转义了,那么url也就不合法了,正确的做法是对url中的\r\n替换为""
4.3 sendredirect会组装一个http
302
Location:url 在response中植入一个Location头
5 java与javac不一致
java -jar时,发现用的是C:\Program Files (x86)\Common Files\Oracle\Java\javapath,32位的
而用的jstack是64的,所以就不行了
解决:在idea terminal中吧path设置到64的java
6 iframe跨域cookie
发现调试时(跨域,用fiddler篡改response报文,删除X-Frame-Options)网站能够被iframe嵌入(这可以理解)的同时,居然跨域带cookie
发现该cookie勾选了Secure,SameSite为空
经过调查,跨域设置SameSite=None和Secure时,谷歌浏览器才会发送Cookie
经过调查,跨域设置SameSite=None和Secure时,谷歌浏览器才会发送Cookie