(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用也就是人们所知道的钓鱼网站。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
防御CSRF攻击手段如何防止伪造Token请求,
在互联网电商项目中,会话信息使用令牌方式保存。
如果黑客使用抓包分析到令牌,黑客技术使用令牌伪造请求支付、下单等核心业务。绑定ip不适合。在互联网上没有绝对防止不能抓包分析到令牌
可以使用在调用接口时候,确认是本人在操作。
使用发送短信验证码方式或者图像识别方式。
在核心接口上,一定要确认是本在操作,比如修改密码、支付下单、转账等核心业务。
使用图形验证码防止机器模拟接口请求攻击,在调用核心业务接口时,比如支付、下单、等接口,最好使用手机短信验证验证或者是人脸识别,防止其他用户使用Token伪造请求。
1.5 忘记密码漏洞黑客使用抓包工具分析Http请求,在忘记密码找回时,需要发送一套短信验证码,如果验证码数字比较短的话,很容易使用暴力破解方式攻击破。
例如:使用短信验证码,在忘记密码短信找回中有一个短信Code(短信验证码)
您现在要找回您的密码,您的找回短信验证码为6440
破解思路(暴力破解) :假设验证码为4位数字。
使用Java程序HttpClient技术开启多线程技术调用找回密码接口暴力破解生成对应的在4位数字以内验证码进行验证,如果一旦验证成功,就破解成功了。
防御手段:
1.忘记密码验证码最好在6-8位。
2.找回验证码最好不要是单纯全部都是数字
3.建议验证码数字+其他字符混合(字母)
4.一旦频繁调用接口验证时,应该使用图形验证码拦截,防止机器模拟,如果找回密码接口重试五次以上还是错误(出现图形验证码)
5.配置防DOS,限流,限制IP访问,使用黑名单和白名单机制,防御攻击
1.6 上传文件漏洞 漏洞描述上传漏洞这个顾名思义,就是攻击者通过上传木马文件,直接得到WEBSHELL,危害等级超级高,现在的入侵中上传漏洞也是常见的漏洞。
导致该漏洞的原因在于代码作者没有对访客提交的数据进行检验或者过滤不严,可以直接提交修改过的数据绕过扩展名的检验。
漏洞危害1)可以得到WEBSHELL
2)上传木马文件,可以导致系统瘫痪
漏洞演示Maven依赖
<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> </dependencies>Index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="/load/UploadServlet" method="post" enctype="multipart/form-data"> <input type="file" /> <input type="submit" value="submit" /> </form> </body> </html>UploadServlet
public class UploadServletextends HttpServlet { /** * 文件上传 */ protected void doPost(HttpServletRequest request, HttpServletResponse response) { String root = request.getServletContext().getRealPath("/upload"); DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); try { List<FileItem> list = upload.parseRequest(request); for (FileItem it : list) { // 如果是file文件类型 if (!it.isFormField()) { it.write(new File(root + "http://www.likecs.com/" + it.getName())); response.getWriter().write("success"); } } } catch (Exception e) { try { response.getWriter().write("exception"); } catch (IOException e1) { e1.printStackTrace(); } e.printStackTrace(); } } }