1.xss跨站脚本攻击
1)输入验证:某个数据被接受为可被显示或存储之前,使用标准输入验证
机制,验证所有输入数据的长度、类型、语法以及业务规则。
2)强壮的输出编码:数据输出前,确保用户提交的数据已被正确进行
entity 编码,建议对所有字符进行编码而不仅局限于某个子集。
3)明确指定输出的编码方式(如 ISO 8859-1 或 UTF 8):不要允许攻击
者为你的用户选择编码方式。
4)注意黑名单验证方式的局限性:仅仅查找或替换一些字符(如"<" ">"或
类似"script"的关键字),很容易被 XSS 变种攻击绕过验证机制。
5)警惕规范化错误:验证输入之前,必须进行解码及规范化以符合应用程
序当前的内部表示方法。请确定应用程序对同一输入不做两次解码。
2.未授权访问
1) 做好对用户与所拥有权限的验证
2) 所有访问系统的请求,首先验证是否是合法有效用户。如不是则跳转到
登录页面。
3) 严格验证用户 session 是否有效,如果无效从后台跳转到登录页面。
4) 重要数据操作功能要使用 token。
3.登录处明文传输
使用 SSL 方式加密或发送重要信息前对信息加密
申请证书 https 方式访问。
4.文件上传漏洞
上传时,检查上传文件的文件头,非授权文件类型的文件,禁止上传。如:建一个txt文件,改为test.jpg,即可上传,这些上传方式是不允许的。
String fileName=file.getOriginalFilename();
String fileNamefix= fileName.substring(fileName.lastIndexOf(".") + 1);
if(!"png".equals(fileNamefix) && !"jpg".equals(fileNamefix) && !"gif".equals(fileNamefix) && !"bmp".equals(fileNamefix)){
throw new RczpException("请上传正确的.jpg、.png、.gif、.bmp格式的图片");
}
String mineType=mineType(file);
if(!"image/jpeg".equals(mineType)&&!"image/png".equals(mineType)&&!"image/x-ms-bmp".equals(mineType)&&!"image/gif".equals(mineType)){
throw new RczpException("请上传正确的.jpg、.png、.bmp、.gif格式的图片");
}
if(file.getSize()>(1024*1000)){
throw new RczpException("文件不能超过1.00MB");
}
import org.springframework.web.multipart;
import eu.medsea.mimeutil;
private String mineType(MultipartFile f) {
String mineType="";
MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
try {
mineType=MimeUtil.getMimeTypes(f.getBytes()).toString();
} catch (IOException e) {
e.printStackTrace();
mineType="";
}
return mineType;
}
5.跨站伪造请求
1、禁止目录递归,如过滤 ../ 或 ../../ 。
2. 判断请求来源
public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String referer = request.getHeader("referer");
String RequestURL = request.getRequestURI();
if(!RequestURL.equals("/wcm/app/login.jsp")){
if(referer == null){
request.getRequestDispatcher("/WEB-INF/error.html").forward(request, response);
}else{
if (!referer.contains(request.getServerName())) {
System.out.println("伪来源地址");
request.getRequestDispatcher("/WEB-INF/error.html").forward(request, response);
} else {
chain.doFilter(request, response);
}
}
}else{
chain.doFilter(request, response);
}
}
6.不安全的链接
添加rel="noopener noreferrer nofollow"
<a href="https://test.com" target="_blank" rel="noopener noreferrer nofollow">test</a>
7.典型漏洞介绍
7.1XSS跨站脚本攻击
漏洞成因
是因为WEB程序没有对用户提交的变量中的HTML代码进行过滤或转换。
漏洞形式
这里所说的形式,实际上是指WEB输入的形式,主要分为两种:
1.显示输入
2.隐式输入
其中显示输入明确要求用户输入数据,而隐式输入则本来并不要求用户输入数据,但是用户却可以通过输入数据来进行干涉。
显示输入又可以分为两种:
1.输入完成立刻输出结果
2.输入完成先存储在文本文件或数据库中,然后再输出结果
注意:后者可能会让你的网站面目全非!
而隐式输入除了一些正常的情况外,还可以利用服务器或WEB程序处理错误信息的方式来实施。
漏洞危害
比较典型的危害包括但不限于:
获取其他用户Cookie中的敏感数据
屏蔽页面特定信息
伪造页面信息
拒绝服务攻击
突破外网内网不同安全设置
与其它漏洞结合,修改系统设置,查看系统文件,执行系统命令等
其它
一般来说,上面的危害还经常伴随着页面变形的情况。而所谓跨站脚本执行漏洞,也就是通过别人的网站达到攻击的效果,也就是说,这种攻击能在一定程度上隐藏身份。
7.2SQL INJECTION数据库注入攻击
SQL Injection定义
所谓SQL Injection ,就是通过向有SQL查询的WEB程序提交一个精心构造的请求,从而突破了最初的SQL查询限制,实现了未授权的访问或存取。
SQL Injection原理
随着WEB应用的复杂化,多数WEB应用都使用数据库作为后台,WEB程序接受用户参数作为查询条件,即用户可以在某种程度上控制查询的结果,如果WEB程序对用户输入过滤的比较少,那么入侵者就可能提交一些特殊的参数,而这些参数可以使该查询语句按照自己的意图来运行,这往往是一些未授权的操作,这样只要组合后的查询语句在语法上没有错误,那么就会被执行。
SQL Injection危害
SQL Injection的危害主要包括:
1.露敏感信息
2.提升WEB应用程序权限
3.操作任意文件
4.执行任意命令
SQL Injection 技巧
利用SQL Injection的攻击技巧主要有如下几种:
1.逻辑组合法:通过组合多种逻辑查询语句,获得所需要的查询结果。
2.错误信息法:通过精心构造某些查询语句,使数据库运行出错,错误信息中包含了敏感信息。
3.有限穷举法:通过精心构造查询语句,可以快速穷举出数据库中的任意信息。
4.移花接木法:利用数据库已有资源,结合其特性立刻获得所需信息。