1 忘記密碼漏洞
黑客使用抓包工具分析 HTTP 請求,在忘記密碼找回時,需要發送一套短信驗證碼,如果驗證碼數字比較短的話,很容易使用暴力破解方式攻擊破。
防禦手段:
- 短信驗證碼最好在
6-8 位
或數字 + 字母
- 一旦頻繁調用接口驗證時,應該使用圖形驗證碼攔截,防止機器模擬
- 使用
黑名單和白名單機制
、限流
、限制 IP 訪問
、配置防止 DDOS
,防禦攻擊
2 上傳文件漏洞
2.1 漏洞描述
上傳漏洞這個顧名思義,就是攻擊者 通過上傳木馬文件,直接得到 WEBSHELL
,危害等級超級高,現在的入侵中上傳漏洞也是常見的漏洞。
導致該漏洞的原因在於代碼作者沒有對訪客提交的數據進行檢驗或者過濾不嚴,可以直接提交修改過的數據繞過擴展名的檢驗。
例如:上傳一個 test.jsp
頁面,在 test.jsp
頁面裏面有 Java
代碼編寫的刪除文件的代碼。一旦 test.jsp
頁面上傳到服務器時,我們可以直接訪問 test.jsp
頁面執行刪除操作。
如何知道上傳的路徑?
可以直接子啊瀏覽器中修改 js
執行腳本
2.2 漏洞危害
1)可以得到WEBSHELL
2)上傳木馬文件,可以導致系統癱瘓
Tomcat虛擬地址:
F:\itmayiedujiangke2018-06-12.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\tomcat_web
2.3 如何防禦上傳文件漏洞
-
在上傳文件時,使用判斷文件流的方式確定文件的格式,不要使用判斷後綴的方式
-
動態資源與靜態資源分開執行
-
服務器環境上的硬盤不能做刪除操作
-
前臺就做後綴的限制
-
服務器上不要有熱部署
-
限制上傳
class
、jsp
、exe
可執行程序
2.3 環境搭建
1、
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>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
2、
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" name="file" /> <input type="submit" value="submit" />
</form>
</body>
</html>
3、
UploadServlet
package com.snow.servlet;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.snow.utils.FileType;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.lang.StringUtils;
@WebServlet("/load/UploadServlet")
public class UploadServlet extends 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()) {
// FileType fileType = getFileType(it.getInputStream());
// if (fileType == null) {
// // 非圖片格式
// response.getWriter().write("fail");
// return;
// }
// String imgValue = fileType.getValue();
// System.out.println("imgValue:" + imgValue);
// 是圖片格式
it.write(new File(root + "/" + it.getName()));
response.getWriter().write("success");
}
}
} catch (Exception e) {
try {
response.getWriter().write("exception");
} catch (IOException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}
}
// 判斷文件是圖片格式
public static FileType getFileType(InputStream is) throws IOException {
byte[] src = new byte[28];
is.read(src, 0, 28);
StringBuilder stringBuilder = new StringBuilder("");
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v).toUpperCase();
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
FileType[] fileTypes = FileType.values();
for (FileType fileType : fileTypes) {
if (stringBuilder.toString().startsWith(fileType.getValue())) {
return fileType;
}
}
return null;
}
}
4、文件類型枚舉類
FileType
package com.snow.utils;
public enum FileType {
/**
* JPEG
*/
JPEG("FFD8FF", "jpg"),
/**
* PNG
*/
PNG("89504E47", "png"),
/**
* GIF
*/
GIF("47494638", "gif"),
/**
* TIFF
*/
TIFF("49492A00"),
/**
* Windows bitmap
*/
BMP("424D"),
/**
* CAD
*/
DWG("41433130"),
/**
* Adobe photoshop
*/
PSD("38425053"),
/**
* Rich Text Format
*/
RTF("7B5C727466"),
/**
* XML
*/
XML("3C3F786D6C"),
/**
* HTML
*/
HTML("68746D6C3E"),
/**
* Outlook Express
*/
DBX("CFAD12FEC5FD746F "),
/**
* Outlook
*/
PST("2142444E"),
/**
* doc;xls;dot;ppt;xla;ppa;pps;pot;msi;sdw;db
*/
OLE2("0xD0CF11E0A1B11AE1"),
/**
* Microsoft Word/Excel
*/
XLS_DOC("D0CF11E0"),
/**
* Microsoft Access
*/
MDB("5374616E64617264204A"),
/**
* Word Perfect
*/
WPB("FF575043"),
/**
* Postscript
*/
EPS_PS("252150532D41646F6265"),
/**
* Adobe Acrobat
*/
PDF("255044462D312E"),
/**
* Windows Password
*/
PWL("E3828596"),
/**
* ZIP Archive
*/
ZIP("504B0304"),
/**
* ARAR Archive
*/
RAR("52617221"),
/**
* WAVE
*/
WAV("57415645"),
/**
* AVI
*/
AVI("41564920"),
/**
* Real Audio
*/
RAM("2E7261FD"),
/**
* Real Media
*/
RM("2E524D46"),
/**
* Quicktime
*/
MOV("6D6F6F76"),
/**
* Windows Media
*/
ASF("3026B2758E66CF11"),
/**
* MIDI
*/
MID("4D546864");
private String value = "";
private String ext = "";
FileType(String value) {
this.value = value;
}
FileType(String value, String ext) {
this(value);
this.ext = ext;
}
public String getExt() {
return ext;
}
public String getValue() {
return value;
}
}
測試
創建一個 a.jsp
:
<%@page import="java.io.File"%>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%
String root ="F:\\test";
File file = new File(root);
file.delete();
%>
上傳該文件,並訪問該文件,執行內部邏輯。
修復方案
- 對文件格式限制,只允許某些格式上傳
- 對文件格式進行校驗,前端跟服務器都要進行校驗(前端校驗擴展名,服務器校驗擴展名、Content_Type等)
- 將上傳目錄防止到項目工程目錄之外,當做靜態資源文件路徑,並且對文件的權限進行設定,禁止文件下的執行權限。
3 其他攻擊和漏洞
-
直接異常信息,會給攻擊者以提示。 可以使用
mvc
中的工具,把錯誤碼異常等進行封裝 -
JSP
裏面寫HTML
註釋, 會暴露功能,方便攻擊。 上線時去除註釋 -
文件上傳, 如果本身功能就是上傳文件去執行,那麼就有可能執行非常危險的命令。 解決方式是,設置文件白名單,限制文件類型,另外還可以重新命名文件,改名爲不可執行的
-
路徑遍歷, 使用相對路徑來遍歷未開放的目錄。 方式是將
JS
、CSS
部署在獨立的服務器,使用獨立域名。 其他文件不使用靜態URL
訪問,動態參數不包含文件路徑信息。