1.跨站点脚本编制

这个安全漏洞拿cookie做文章,而且是将前端的一些弹窗方法,要么通过脚本注入,要么通过url.encode之后注入,看几个变异的版本:

版本一:

cookie  从以下位置进行控制: a5d5b093-a2c1-47e5--b661c124344a 至:a5d5b093-a2c1-47e5--b661c124344a"==aalertlert(15)+"

之前是将一个alert注入,现在这个软件知道了,只过滤一次,那我就拆成两个,你过滤一个,合起来还是alert。好贱啊这软件

解决处理:好吧,那我就递归处理了,没想到出现了版本二的变体了,厉害了

版本二:

 var _cookies="bosssoft.com.cn=7717ef32-34a8-4a42-b26cf6804549a370;JSESSIONID=Kzdsb2QTHGkTx08XBhTBNJQN7GQlhmnWv0YhmS2tLDxQQT2YbCvK!-2054262092"+
[window['location']='\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3a\x61\x6c\x65\x72\x74\x2832\x29']
+"";

我的天,前端那么多脚本注入方式,这么搞不行啊,而且人家还是通过url.encode,前端弹窗还有各种方式。:

.window.open()
.window.location=javascript:alert()
.comfirm("xxx")
.prompt("xxxx")
.alert
...

那不是搞死了?防不胜防啊。

解决方案:后来想想,反正这个cookie,在业务系统也没用到,但是jsessionid主要用于负载均衡策略session粘滞。

好吧,一不做二不休。想想既然能够执行的都是函数体,那我就把cookie里头包含以下字符:(、)、[、]、\的全部替换了。

                Pattern scriptPattern = Pattern.compile("\\(",
Pattern.CASE_INSENSITIVE);
if(scriptPattern.matcher(value).find()){
flag=true;
return flag;
} scriptPattern = Pattern.compile("'",
Pattern.CASE_INSENSITIVE);
if(scriptPattern.matcher(value).find()){
flag=true;
return flag;
} scriptPattern = Pattern.compile("\\\\",
Pattern.CASE_INSENSITIVE);
if(scriptPattern.matcher(value).find()){
flag=true;
return flag;
} scriptPattern = Pattern.compile("\\[",
Pattern.CASE_INSENSITIVE);
if(scriptPattern.matcher(value).find()){
flag=true;
return flag;
} scriptPattern = Pattern.compile("\\]",
Pattern.CASE_INSENSITIVE);
if(scriptPattern.matcher(value).find()){
flag=true;
return flag;
}

好吧,cookie的总算解决了,然这软件,坑爹的,用到了表单上,天啊,表单就不能这么搞了,但是安全漏洞不过,不让上线。后来经理说,能解决再说,我们后面补丁撤回来。

没想到,这软件绝了,改值,然后通过url.encode。注入表单,厉害了。

你绝,那我也绝了,把你响应回来的内容,字符我全部给你做了替换了,解决方案如下:

try {
value=URLDecoder.decode(value,"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} value= StringEscapeUtils.escapeJavaScript(value);
value= StringEscapeUtils.escapeHtml(value);
value= StringEscapeUtils.escapeXml(value);

首先通过URLDecoder.decode将编码的恢复正常,然后通过escapeJavaScript、escapeHtml、escapeXml等将输出的返回到前台,嗯嗯,这下总算解决了这个漏洞,当然上线的时候不能这么搞==!

2.使用 HTTP 动词篡改的认证旁路  

这个漏洞,首先将它有问题的链接改成指定的方法,然后再通过第一漏洞处理后,这漏洞就没了

3.会话标识未更新  

漏洞原因:在我们的cookie里头存有两个session值,一个是jessionid。一个是我们自己业务系统要使用的,在登录前后这两个session值都要发生变化,这个软件才会认为是安全的,但是jessionid如果变了,可能会影响负载均衡的粘滞问题。既然是为了安全扫描,业务系统登录前后的session是有变化的,但是jessionid是没变,所以把jessionid变了,就好了。这个漏洞就可以解决了。

4.已解密的登录请求 

这个漏洞主要是因为传递的参数没有通过ssl即https的方式进行传播,将weblogic开启https,此外如果有Nginx也要开通https,这个漏洞就可以解决了。附一份nginx配置:

#user  nobody;
worker_processes ; #error_log logs/error.log;
error_log logs/error.log notice;
#error_log logs/error.log info; #pid logs/nginx.pid;
worker_rlimit_nofile ; events {
use epoll;
worker_connections ;
} http {
include mime.types;
default_type application/octet-stream;
server_tokens off; keepalive_timeout ;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m; client_header_buffer_size 16k;
large_client_header_buffers 32k;
server_names_hash_max_size ;
server_names_hash_bucket_size ; sendfile on;
tcp_nopush on;
tcp_nodelay on; # limit_req_zone $binary_remote_addr zone=http:10m rate=10r/s;
# limit_req_zone $http_user_agent zone=useragenttrack:10m rate=10r/s; log_format main
'$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main; map $http_user_agent $is_bot {
default ;
~[a-z]bot ;
~[sS]pider ;
~spi_der ;
~crawler ;
~ysearch ;
~Yahoo\sPipes ;
~BingPreview ;
~YoudaoFeedFetcher ;
'Yahoo!\sSlurp' ;
'Mediapartners-Google' ;
#'Mozilla/5.0' ;
} include appconf/upstream.conf;
include appconf/gzip.conf; #lua_need_request_body on;
#init_by_lua_file conf/waf/init.lua;
#access_by_lua_file conf/waf/waf.lua; # lua_shared_dict limit 50m;
# lua_package_path /opt/openresty/nginx/conf/waf/?.lua;
# init_by_lua_file conf/waf/init.lua;
# access_by_lua_file conf/waf/waf.lua; server {
listen ssl;
server_name localhost; ssl_certificate ./ssl/server.crt;
ssl_certificate_key ./ssl/server.key; proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Cookie $http_cookie;
add_header Set-Cookie "HttpOnly";
add_header Set-Cookie "Secure";
add_header X-Frame-Options "SAMEORIGIN"; if ($request_method !~ ^(GET|POST|HEAD|DELETE)$ ) {
return ;
} location ~ ^/(WEB-INF)/ {
return ;
} location ~ ^/(js|css|img|scripts|stylesheets|uploads)/ {
root html;
access_log off;
expires 30d;
} location ~ \.(apk|torrent|htm|html|asp|php|gif|jpg|jpeg|png|bmp|ico|rar|css|js|zip|map|java|jar|txt|flv|swf|mid|doc|ppt|xls|pdf|txt|mp3|wma)$ {
root html;
access_log off;
expires 30d;
}
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1. TLSv1.;
ssl_ciphers
"ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
#ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
set $mscheme $scheme;
if ($http_referer ~* ^https.*) {
set $mscheme "https";
}
proxy_set_header X-Forwarded-Proto $mscheme;
} location /finance-web{
proxy_pass http://10.56.30.91:7001/finance-web;
set $mscheme $scheme;
if ($http_referer ~* ^https.*) {
set $mscheme "https";
}
proxy_set_header X-Forwarded-Proto $mscheme;
} location /appframe-web{
proxy_pass http://10.56.30.91:7001/appframe-web;
set $mscheme $scheme;
if ($http_referer ~* ^https.*) {
set $mscheme "https";
}
proxy_set_header X-Forwarded-Proto $mscheme;
} location /agency-web{
proxy_pass http://10.56.30.91:7001/agency-web; set $mscheme $scheme;
if ($http_referer ~* ^https.*) {
set $mscheme "https";
}
proxy_set_header X-Forwarded-Proto $mscheme;
}
} # location ~ ^/nstatus {
# stub_status on;
# access_log off;
# allow 127.0.0.1;
# allow 10.236.57.0/;
# deny all;
# } error_page /.html;
error_page /.html;
error_page /.html;
error_page /.html;
}

5.加密会话(SSL)Cookie 中缺少 Secure 属性

这个问题主要是因为cookie里头的属性secure未设置true。因为部署的容器是weblogic所以在应用的weblogic.xml文件里头新增属性:

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
<index-directory-enabled>true</index-directory-enabled>
<show-archived-real-path-enabled>true</show-archived-real-path-enabled>
</container-descriptor>
<charset-params>
<input-charset>
<resource-path>/*</resource-path>
<java-charset-name>UTF-8</java-charset-name>
</input-charset>
</charset-params>
<context-root>/appframe-web</context-root>
<session-descriptor>
<cookie-http-only>true</cookie-http-only>
<cookie-secure>true</cookie-secure>
</session-descriptor>
</weblogic-web-app>

如图要新增

    <session-descriptor>
<cookie-http-only>true</cookie-http-only>
<cookie-secure>true</cookie-secure>
</session-descriptor>

如何验证呢?

可以加,

但是没加前,获取cookie是空的 ,也就是说没有通过https传递cookie,那么document.cookie获取不到cookie

此外在nginx配置里头也要加上

    add_header                  Set-Cookie "HttpOnly";
add_header Set-Cookie "Secure";
add_header X-Frame-Options "SAMEORIGIN"; 

另外如果是shiro工程,要在spring-shiro.xml下加上配置:

    <!-- 会话Cookie模板 -->
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<constructor-arg value="bosssoft.com.cn"/>
<property name="httpOnly" value="true"/>
<property name="secure" value="true"/>
<!--cookie的有效时间 -->
<property name="maxAge" value="-1"/>
</bean>  

基于安全的考虑,需要给cookie加上Secure和HttpOnly属性,HttpOnly比较好理解,设置HttpOnly=true的cookie不能被js获取到,无法用document.cookie打出cookie的内容。
Secure属性是说如果一个cookie被设置了Secure=true,那么这个cookie只能用https协议发送给服务器,用http协议是不发送的。换句话说,cookie是在https的情况下创建的,而且他的Secure=true,那么之后你一直用https访问其他的页面(比如登录之后点击其他子页面),cookie会被发送到服务器,你无需重新登录就可以跳转到其他页面。但是如果这是你把url改成http协议访问其他页面,你就需要重新登录了,因为这个cookie不能在http协议中发送。

6.检查到目标URL存在http host头攻击漏洞

上述问题出现的原因为在项目中使用了 request.getServerName 导致漏洞的出现,不要使用request中的serverName,也就是说host header可能会在攻击时被篡改,依赖request的方法是不可靠的,形如JSP头部中的:

String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 

这样的使用方法就会被漏洞检测工具查出来,认定有头攻击漏洞。

解决方案:在CSRFFilter过滤器中加入头部攻击判断:

        String requestHost=((HttpServletRequest) request).getHeader("host");
if(requestHost!=null&&!isWhiteHost(requestHost)){
((HttpServletResponse) response).setStatus();
return;
}

7.检查到目标站点存在JavaScript框架库漏洞

这个问题,主要是因为jquery.js在低版本中存在安全漏洞的问题,只要替换高版本的jQuery.js库就可以解决了,当然要考虑高版本对IE8的兼容问题。可以参考博文《Jquery3.x高版本支持IE8

AppScan9.0.3.5漏洞扫描记录的更多相关文章

  1. AppScan 8.0.3安全漏洞扫描总结

    本文记录了通过AppScan 8.0.3工具进行扫描的安全漏洞问题以及解决方案, 1.使用SQL注入的认证旁路 问题描述: 解决方案: 一般通过XSSFIlter过滤器进行过滤处理即可,通过XSSFI ...

  2. [原创]K8_C段旁注工具6.0 新增SMB漏洞扫描

    工具: K8_C段旁注工具6.0_0510[K.8]编译: 自己查壳组织: K8搞基大队[K8team]作者: K8拉登哥哥博客: http://qqhack8.blog.163.com发布: 201 ...

  3. 官方Tomcat 8.0.24 Web漏洞整改记录

    测试环境 web服务器:apache-tomcat-8.0.24-windows-x64 测试工具:Acunetix Web Vulnerability Scanner 9.5 官方Tomcat测试结 ...

  4. Exp6 信息搜集与漏洞扫描 20165110

    Exp6 信息搜集与漏洞扫描 20165110 一.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 二.实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描 ...

  5. 2017-2018-2 20155303『网络对抗技术』Exp6:信息收集与漏洞扫描

    2017-2018-2 20155303『网络对抗技术』 Exp6:信息收集与漏洞扫描 --------CONTENTS-------- 一.原理与实践说明 1.实践内容 2.基础问题 二.实践过程记 ...

  6. 2018-2019-2 20165336 《网络对抗技术》 Exp6 信息搜集与漏洞扫描

    2018-2019-2 20165336 <网络对抗技术> Exp6 信息搜集与漏洞扫描 一.原理与实践说明 1.实践内容 本实践的目标是掌握信息搜集的最基础技能.具体有: 各种搜索技巧的 ...

  7. 2018-2019-2 网络对抗技术 20165305 Exp6 信息搜集与漏洞扫描

    1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具 ...

  8. 2018-2019-2 20165316 《网络对抗技术》 Exp6 信息搜集与漏洞扫描

    2018-2019-2 20165316 <网络对抗技术> Exp6 信息搜集与漏洞扫描 1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应 ...

  9. Exp6 信息搜集与漏洞扫描 20164303

    一.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 二.实践内容. (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测. ...

随机推荐

  1. Attribute 'items' must be an array, a Collection or a Map错误解决!

    唉!真的要说一句话叫做论一串代码的重要性!就是如此的气人!气的牙根痒痒! 前几天刚刚写过SpringMVC之ModelAndView的 jsp值在浏览页面不显示的问题!也是因为这一串代码,但是这一次一 ...

  2. less开发指南(一)- 小牛试刀

    [一]less简介 LESS(是.less后缀名的文件) 包含一套自定义的语法及一个解析器,我们根据这些语法定义自己的样式规则,这些规则最终会通过解析器,编译生成对应的 CSS 文件.LESS 并没有 ...

  3. Esper——内存计算、事件驱动、SQL支持

    教程简介Esper是一个事件流处理(ESP)和事件关联引擎(CEP的,复杂事件处理).Esper的目标是针对实时事件驱动架构(EDA).当Esper监测到事件流中又符合条件的时间发生时,即可触发Pla ...

  4. mysql和SqlServer 中取得汉字字段的各汉字首字母

    mysql 中取得汉字字段的各汉字首字母 这个转载于http://blog.csdn.net/lky5387/article/details/11973721 DELIMITER ;;CREATE  ...

  5. MYSQL-实现ORACLE 和SQLserver数据中- row_number() over(partition by ) 分组排序功能

    网上看见了好多例子都基本上是一样的,没有过多的解释,对于一个初学MySQL来说有点难,我把部分转摘过来如下 原文:http://www.cnblogs.com/buro79xxd/archive/20 ...

  6. Algorithm4.子数组求和贪心

    子数组求和最大问题 20131011 问题描述 一个数组中,有整数也有复数,求这个数组的所有子数组中,求和最大的值. 这是一个动态规划问题,乍看上去没有什么简单的方法,把所有的情况列出来就可以了,但是 ...

  7. kvm虚拟机克隆注意点

    1.硬盘空间会受第一次分配硬盘是的max capacity(最大容量) 限制,如果额外添加一块硬盘,会多出一个img文件,克隆这种虚拟机,两个img文件会都克隆下来,如果不重新命名会在原先img文件后 ...

  8. Conky配置文件

    Conky是一个可以在linux系统中实时显示系统性能的工具,美观且十分好用,我们选择安装conky-all程序包 # set to yes if you want Conky to be forke ...

  9. New Concept English there (1)Typing speed exercise

    Today,I start learn new concept english there,Mainly for listening practice and typing speed exercis ...

  10. 【PL/SQL编程】变量和常量

    1. 变量格式 <变量名><数据类型>[(长度):=<初始值>]; v_countryname varchar2(50):='中国'; 2. 常量格式 <常量 ...