AppScan9.0.3.5漏洞扫描记录
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漏洞扫描记录的更多相关文章
- AppScan 8.0.3安全漏洞扫描总结
本文记录了通过AppScan 8.0.3工具进行扫描的安全漏洞问题以及解决方案, 1.使用SQL注入的认证旁路 问题描述: 解决方案: 一般通过XSSFIlter过滤器进行过滤处理即可,通过XSSFI ...
- [原创]K8_C段旁注工具6.0 新增SMB漏洞扫描
工具: K8_C段旁注工具6.0_0510[K.8]编译: 自己查壳组织: K8搞基大队[K8team]作者: K8拉登哥哥博客: http://qqhack8.blog.163.com发布: 201 ...
- 官方Tomcat 8.0.24 Web漏洞整改记录
测试环境 web服务器:apache-tomcat-8.0.24-windows-x64 测试工具:Acunetix Web Vulnerability Scanner 9.5 官方Tomcat测试结 ...
- Exp6 信息搜集与漏洞扫描 20165110
Exp6 信息搜集与漏洞扫描 20165110 一.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 二.实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描 ...
- 2017-2018-2 20155303『网络对抗技术』Exp6:信息收集与漏洞扫描
2017-2018-2 20155303『网络对抗技术』 Exp6:信息收集与漏洞扫描 --------CONTENTS-------- 一.原理与实践说明 1.实践内容 2.基础问题 二.实践过程记 ...
- 2018-2019-2 20165336 《网络对抗技术》 Exp6 信息搜集与漏洞扫描
2018-2019-2 20165336 <网络对抗技术> Exp6 信息搜集与漏洞扫描 一.原理与实践说明 1.实践内容 本实践的目标是掌握信息搜集的最基础技能.具体有: 各种搜索技巧的 ...
- 2018-2019-2 网络对抗技术 20165305 Exp6 信息搜集与漏洞扫描
1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具 ...
- 2018-2019-2 20165316 《网络对抗技术》 Exp6 信息搜集与漏洞扫描
2018-2019-2 20165316 <网络对抗技术> Exp6 信息搜集与漏洞扫描 1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应 ...
- Exp6 信息搜集与漏洞扫描 20164303
一.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 二.实践内容. (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测. ...
随机推荐
- 12.详解Condition的await和signal等待通知机制
1.Condition简介 任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wait(),wait(long timeout),wait(lo ...
- Python list降序排序
test = [6,1,2,3,4,5] a = sorted(test,reverse=True) print a 结果如下: [6, 5, 4, 3, 2, 1] 你可以参考下sorted,里面是 ...
- day31 堡垒机尾声 + Python与金融量化分析(一)
堡垒机尾声: 代码案例:https://github.com/liyongsan/git_class/tree/master/day31 课堂笔记:file send: 1.选择本地文件 2.远程路径 ...
- Java复习4.数组初始化.
Java复习4.Java中的数组声明方式 20131004 1.数组声明和初始化, 数组元素和变量一样,可以在定义的时候i进行初始化.数组元素的初始化工作实在编译阶段完成的,可以减少运行时间. 在初 ...
- SQL SERVER 算法执行效率
较差的性能 <---没有索引(为每个表执行表扫描) --->非聚集非覆盖索引(seek+局部有序扫描+lookups) ---> 聚集索引(seek+局部扫描) ---> 非聚 ...
- 公客网beta阶段发布说明
项目 公客 公正客观的课程评价网站 功能说明 评价的增删改 对课程发表评价 限制评价次数(3次),删除与增量修改评价 评价下的讨论与点赞 在评价下添加讨论,支持在讨论中使用@与对方交流想法 为评价点赞 ...
- mysql服务1067错误:修改mysql可执行文件路径
今天遇到mysql服务1067错误的问题,设置使用系统账户也无法启动mysql,后面认证看了系统的配置信息,发现启动文件也就是mysql安装路径是之前的(也说明之前安装mysql,没去卸载直接安装新的 ...
- Flask项目中的蓝图简介及使用方式
Blueprint概念 简单来说,Blueprint 是一个存储操作方法的容器,这些操作在这个Blueprint 被注册到一个应用之后就可以被调用,Flask 可以通过Blueprint来组织URL以 ...
- 迭代器、foreach循环、泛型集合
集合的迭代 语法:Iterator<Object> it=集合.iterator(); while(it.hasNext()){ Object obj=it.next(); } is.ha ...
- React-Native进阶_4.底部标签栏TabBar
原生项目中,我们对底部Tab 很熟悉,点击Tab标签可以切换页面,那么在React-Native 中我们该怎么实现呢. 在查了文档后,我们找到了一个TabBarIos ,这个是ios 下使用的Tab ...