热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

常见web开发安全漏洞修复方案

web系统测试工具:APPScan1.不充分账户封锁(一)安全问题描述发送了两次合法的登录尝试,并且在其间发送了几次错误的登录尝试。最后一个响应与

web系统测试工具:APPScan
1.不充分账户封锁

(一) 安全问题描述

发送了两次合法的登录尝试,并且在其间发送了几次错误的登录尝试。最后一个响应与第一个响应相同。这表明存在未充分实施帐户封锁的情况,从而使登录页面可能受到蛮力攻击

解决方案

效果,当用户登录错误3次,则提醒30分钟后才可再次登录

if(!checkLock(session, username)) {
System.out.println("该账号已经被锁定");
return "该账号已经被锁定";
}
if (username=="小一"&&password=="1234"){
//登录成功
System.out.println("登录成功");
User user=new User();
user.setUsername(username);
user.setPassword(password);
System.out.println("登录成功");
cleanFailNum(request.getSession(),username);//清空该用户之前登录的错误信息
return "登录成功";
}else {
addFailNum(session,username);//错误信息加一
return "用户名或者密码错误";
}

/**
* 校验用户登录失败次数
* @param session
* @param username
* @return
*/
public boolean checkLock(HttpSession session,String username) {
Object o = session.getServletContext().getAttribute(username);
if(o==null) {
return true;
}
HashMap map = (HashMap) o;
int num = (int) map.get("num");
Date date = (Date) map.get("lastDate");
long timeDifference = ((new Date().getTime()-date.getTime())/60/1000);
if(num>&#61;3&&timeDifference<30) {
return false;
}
return true;
}
/**
* 新增用户登录失败次数
* &#64;param session
* &#64;param username
*/
public void addFailNum(HttpSession session, String username) {
Object o &#61; session.getServletContext().getAttribute(username);
HashMap map &#61; null;
int num&#61; 0;
if(o&#61;&#61;null) {
map &#61; new HashMap();
}else {
map &#61; (HashMap) o;
num &#61; (int) map.get("num");
Date date &#61; (Date) map.get("lastDate");
long timeDifference &#61; ((new Date().getTime()-date.getTime())/60/1000);
if(timeDifference>&#61;30) {
num&#61;0;
}
}
map.put("num", num&#43;1);
map.put("lastDate", new Date());
session.getServletContext().setAttribute(username, map);
}
/**
* 清理用户登录失败的记录
* &#64;param session
* &#64;param username
*/
public void cleanFailNum(HttpSession session, String username) {
session.getServletContext().removeAttribute(username);
}

2.会话标识未更新

安全规范要求

COOKIE中的登陆前JSESSIONID与登陆后JESSIONID不能相同。&#xff08;只有J2EE应用服务器为JESSIONID,其他应用服务器可能不同&#xff09;

简单理解就是登录前和登录后的sessionId要更新

方式一&#xff1a;在登录页面操作

<%
//登录之后更改会话标识符
request.getSession().invalidate();//清空session
COOKIE COOKIE &#61; request.getCOOKIEs()[0];//获取COOKIE
COOKIE.setMaxAge(0);//s让COOKIE过期
%>

方式二&#xff1a;登录方法中头加入操作

session.invalidate();

3.跨站点请求伪造


描述&#xff1a;可能会窃取或操纵客户会话和
COOKIE
&#xff0c;它们可能用于模仿合法用户&#xff0c;从而使黑客能够以该用户身份查


看或变更用户记录以及执行事务&#xff0c;窃取用户权限进行非法操作。


解决方案:过滤器拦截所有请求。非本站点和内网请求全部过滤。



import org.apache.logging.log4j.core.config.Order;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* &#64;author lhl
* &#64;version 1.0
* &#64;date 2020/5/6 16:47
* &#64;description TODO 拦截跨站点请求伪造
*/
&#64;Order(1)
&#64;WebFilter(filterName &#61; "CSRFFilter", urlPatterns &#61; "/*")
public class CSRFFilter implements Filter {
&#64;Override
public void init(FilterConfig filterConfig) throws ServletException {
}
&#64;Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;CSRFFilter&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");
HttpServletRequest req &#61; (HttpServletRequest) request;
HttpServletResponse resp &#61; (HttpServletResponse) response;
if (checkReferer(req, resp)) {
// 拦截
response.setContentType("text/html;charset&#61;utf-8");
// resp.sendRedirect("/login.jsp");
throw new ServletException("非法请求&#xff01;");
// return;
}
// 放行
chain.doFilter(req, resp);
}
private boolean checkReferer(HttpServletRequest request, HttpServletResponse response) {
String referer &#61; request.getHeader("referer");
String serviceName &#61; request.getServerName();
if (null &#61;&#61; referer) {
return false;
}
if (referer !&#61; null && referer.matches("^(http|https)&#43;://(" &#43; serviceName &#43; ")(.*)")) {
// 本系统的访问 直接放行
return false;
}
if (referer !&#61; null && referer
.matches("^[(http)|(https)]&#43;://(localhost|10\\.|172\\.|127\\.0\\.0\\.1)&#43;(.*)")) {
// 内网的访问 直接放行
return false;
}
return true;
}
&#64;Override
public void destroy() {
}
}

4.“Content-Security-Policy”头缺失或不安全

解决方案1


中间件为IIS&#xff0c;网站根目录下找到“web.cofig”文件&#xff0c;没有则新建该文件。复制以下代码&#xff0c;粘贴到web.cofig文件中&#xff08;新建全部复制&#xff0c;已有复制system.webserver&#xff09;













解决方案2


HTML前端解决方法&#xff1a;






5.“X-Content-Type-Options”头缺失或不安全

解决方案1.

中间件为IIS&#xff0c;网站根目录下找到“web.cofig”文件&#xff0c;没有则新建该文件。复制以下代码&#xff0c;粘贴到web.cofig文件中&#xff08;新建全部复制&#xff0c;已有复制system.webserver&#xff09;











 解决方案2.

HTML前端解决方法&#xff1a;


6.“X-XSS-Protection”头缺失或不安全

解决方案1.

中间件为IIS&#xff0c;网站根目录下找到“web.cofig”文件&#xff0c;没有则新建该文件。复制以下代码&#xff0c;粘贴到web.cofig文件中&#xff08;新建全部复制&#xff0c;已有复制system.webserver&#xff09;











HTML前端解决方法&#xff1a;


检测到目标URL存在电子邮件地址模式

Spambot 搜寻因特网站点&#xff0c;开始查找电子邮件地址来构建发送自发电子邮件&#xff08;垃圾邮件&#xff09;的邮件列表。 
如果检测到含有一或多个电子邮件地址的响应&#xff0c;可供利用以发送垃圾邮件。 
而且&#xff0c;找到的电子邮件地址也可能是专用电子邮件地址&#xff0c;对于一般大众应是不可访问的。

解决方案



从 Web 站点中除去任何电子邮件地址&#xff0c;使恶意的用户无从利用。



 关于内部IP暴露漏洞的解决

项目扫描遇到“内部IP暴露”漏洞&#xff0c;关于该漏洞的含义大家自行百度。

考虑的解决方法就是限制IP直接访问项目本身。具体做法如下&#xff1a;

项目是部署在Tomcat中&#xff0c;直接通过修改Tomcat配置文件中的server.xml实现。

初始配置为&#xff1a;

  
unpackWARs&#61;"true" autoDeploy&#61;"true"
xmlValidation&#61;"false" xmlNamespaceAware&#61;"false">


修改为

unpackWARs&#61;"true" autoDeploy&#61;"true"
xmlValidation&#61;"false" xmlNamespaceAware&#61;"false">



defaultHost是默认的&#xff0c;随便写点都行&#xff0c;应该是在域名无法发生作用的时候访问的。


通过上述配置&#xff0c;就可以实现禁止IP直接访问项目。


若完善一些&#xff0c;可以再配置一个Host&#xff0c;将IP访问指向特定的页面进行说明。



 潜在文件上载

文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器上&#xff0c;当开发者没有对该文件进行合理的校验及处理的时候&#xff0c;很有可能让程序执行这个上传文件导致安全漏洞。大部分网站都会有文件上传的功能&#xff0c;例如头像、图片、视频等&#xff0c;这块的逻辑如果处理不当&#xff0c;很容易触发服务器漏洞

防御方法

防范文件上传漏洞常见的几种方法。



1、文件上传的目录设置为不可执行



2、判断文件类型


在判断文件类型时&#xff0c;可以结合使用MIME Type、后缀检查等方式。在文件类型检查中&#xff0c;强烈推荐白名单方式&#xff0c;黑名单的方式已经无数次被证明是不可靠的。此外&#xff0c;对于图片的处理&#xff0c;可以使用压缩函数或者resize函数&#xff0c;在处理图片的同时破坏图片中可能包含的HTML代码。


3、使用随机数改写文件名和文件路径


文件上传如果要执行代码&#xff0c;则需要用户能够访问到这个文件。在某些环境中&#xff0c;用户能上传&#xff0c;但不能访问。如果应用了随机数改写了文件名和路径&#xff0c;将极大地增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件&#xff0c;都将因为重命名而无法攻击。


4、单独设置文件服务器的域名


由于浏览器同源策略的关系&#xff0c;一系列客户端攻击将失效&#xff0c;比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决。


已解密的登录请求

【原因】
经过实验测试&#xff0c;认为是页面input 标签type&#61;"password" 导致的&#xff0c;
如果 改成type&#61;"text"是可以绕过漏洞扫描的&#xff0c;但是密码框的内容要自己隐藏&#xff0c;出现诸多业务bugs。




【解决】在原来的上面加多一个


&#96;



文件参数Shell命令注入

可能会在 Web 服务器上运行远程命令。这通常意味着完全破坏服务器及其内容

原因&#xff1a;未对用户输入正确执行危险字符清理



确保所访问的文件驻留在虚拟路径中并具有特定扩展名&#xff1b;除去用户输入中的特殊字符




跨站点脚本编制

XSS跨站脚本攻击&#xff1a;两种情况。一种通过外部输入然后直接在浏览器端触发&#xff0c;即反射型XSS&#xff1b;还有一种则是先把利用代码保存在数据库或文件中&#xff0c;当web程序读取利用代码并输出在页面上时触发漏洞&#xff0c;即存储型XSS。DOM型XSS是一种特殊的反射型XSS。

危害&#xff1a;前端页面能做的事它都能做。&#xff08;不仅仅盗取COOKIE、修改页面等&#xff09;


解决方案

&#xff08;1&#xff09; 特殊字符HTML实体转码。最好的过滤方式是在输出和二次调用的时候进行加HTML实体一类的转码&#xff0c;防止脚本注入。

&#xff08;2&#xff09; 标签事件属性黑名单。特殊字符容易被绕过&#xff0c;所以还得加标签事件得黑名单或者白名单&#xff0c;这里推荐使用白名单的方式&#xff0c;实现规则可以直接使用正则表达式来匹配&#xff0c;如果匹配到的事件不在白名单列表&#xff0c;就可以直接拦截&#xff0c;而不是过滤为空。





特殊字符XSS攻击

在过滤器中&#xff0c;Http所有请求参数&#xff0c;过滤&#xff0c;去除特殊字符对系统的影响&#xff1b;

&#xff08;1&#xff09;sql注入

&#xff08;2&#xff09;文件参数注入


private String cleanXSS(String value) {
//You&#39;ll need to remove the spaces from the html entities below
value &#61; value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");
value &#61; value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");
value &#61; value.replaceAll("&#39;", "& #39;");
value &#61; value.replaceAll("eval\\((.*)\\)", "");
value &#61; value.replaceAll("e-xpression\\\\((.*?)\\\\)\"", "");
value &#61; value.replaceAll("[\\\"\\\&#39;][\\s]*Javascript:(.*)[\\\"\\\&#39;]", "\"\"");
value &#61; value.replaceAll("script", "");
//防止sql语句字符注入
String[] sqlStr &#61; {"and", "exec", "execute", "insert", "select", "delete", "update", "count", "drop", "chr", "mid", "master", "truncate", "char", "declare", "sitename", "net user", "xp_cmdshell", "like", "and", "exec", "execute", "insert", "create", "drop", "table", "from", "grant", "use", "group_concat", "column_name", "information_schema.columns", "table_schema", "union", "where", "select", "delete", "update", "order", "by", "count", "chr", "mid", "master", "truncate", "char", "declare", "or"};
for (int i &#61; 0; i value &#61; value.replaceAll(sqlStr[i], "");
}
//文件参数注入
String[]cmdParameters&#61;{
"cmd.exe","/k","bin","sh",".sh","shell","sleep"
};
for (int i &#61; 0; i value &#61; value.replaceAll(cmdParameters[i], "");
}
return value;
}


更多博客和源码请到微信公众号&#xff1a;源码plus   探索和领取。




推荐阅读
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 本文深入解析了HTML框架集(FRAMESET)的使用方法及其应用场景。首先介绍了几个关键概念,如如何通过FRAMESET标签将主视图划分为多个独立的区域,每个区域可以加载不同的HTML文件。此外,还详细探讨了FRAMESET在实际开发中的优缺点,并提供了具体的实例代码,帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • 本文介绍了如何利用HTTP隧道技术在受限网络环境中绕过IDS和防火墙等安全设备,实现RDP端口的暴力破解攻击。文章详细描述了部署过程、攻击实施及流量分析,旨在提升网络安全意识。 ... [详细]
  • Python 3 Scrapy 框架执行流程详解
    本文详细介绍了如何在 Python 3 环境下安装和使用 Scrapy 框架,包括常用命令和执行流程。Scrapy 是一个强大的 Web 抓取框架,适用于数据挖掘、监控和自动化测试等多种场景。 ... [详细]
  • 通过使用Sqoop导入工具,可以精确控制并高效地将表数据的特定子集导入到HDFS中。具体而言,可以通过在导入命令中添加WHERE子句来指定所需的数据范围,从而在数据库服务器上执行相应的SQL查询,并将查询结果高效地存储到HDFS中。这种方法不仅提高了数据导入的灵活性,还确保了数据的准确性和完整性。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 如何使用 `org.apache.tomcat.websocket.server.WsServerContainer.findMapping()` 方法及其代码示例解析 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
author-avatar
手机用户2502856183
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有