ShellService代表一个Shell服务,在其构造函数中31行判断了,如果类型是php则在header中加入Content-type头。但在35行的getKeyAndCookie向服务端发送GET请求获取密钥时,也将此header头带入其中,所以发送GET请求包时也会携带此参数。
修改思路:
GET形式访问时在header中去掉此字段,POST形式访问时将值改为Content-Type值改为”text/html;charset=utf-8″以规避安全检测(值也可以不改)。
修改后的效果:
GET请求:
POST请求:
3.header中的User-Agent
User-Agent是指用户代理,会包含浏览器和操作系统等信息标志。在”冰蝎”的早期版本存在User-Agent特例化问题,最新版本已经解决了这个问题。解决方案是:每个shell连接会从17个内置的UA里随机选择一个。
来看下这部分的JAVA代码:
可以看到是随机从常量Constants.userAgents中取了一个值。
这块的问题是UA包含的浏览器版本比较旧,比如:Chrome/14.0.835.163是2011年发布的版本,Firefox/6.0也是2011年的版本。这种浏览器基本很少人使用,所以特征较为明显,可以作为规则参考。
修改思路:
使用较新版本的常见浏览器UA来替换内置的旧的UA常量。
修改后的效果:
2020年发布的Firefox 75.0:
2019年11月发布的Chrome 78.0.3904.108:
4.header中的Accept
在请求header中的Accept字段默认会是一个比较奇怪的值,此值在GET形式和POST形式的请求中均存在。而在正常的浏览器或其他设备访问的报文中Accept的值不会是这样的,所以此处也可以作为一个强力有效的规则检测依据。
GET请求:
POST请求:
此处产生的原因是JAVA的HTTPURLConnection库(”冰蝎”使用的HTTP通信库)在没有设置Accept值时会自动设置该值作为默认值,而源码中默认并没有对Accept进行处理。
修改思路:
修改请求header中的Accept的值。
修改后的效果:
GET请求:
POST请求: