211 lines
8.6 KiB
Plaintext
211 lines
8.6 KiB
Plaintext
|
|
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
|
||
|
|
<%@ page
|
||
|
|
import="org.apache.commons.lang.StringUtils,weaver.general.BaseBean,weaver.general.Util,weaver.hrm.HrmUserVarify,weaver.hrm.User,java.io.BufferedReader,java.io.File,java.io.FileInputStream" %>
|
||
|
|
<%@ page import="java.io.InputStreamReader" %>
|
||
|
|
<%@ page import="java.util.Date" %>
|
||
|
|
<%@ page import="java.util.List" %>
|
||
|
|
<%@ page import="java.util.Vector" %>
|
||
|
|
<%@ page import="java.util.regex.Matcher" %>
|
||
|
|
<%@ page import="java.util.regex.Pattern" %>
|
||
|
|
<%@ page import="java.text.SimpleDateFormat" %>
|
||
|
|
<jsp:useBean id="rs" class="weaver.conn.RecordSet" scope="page"/>
|
||
|
|
|
||
|
|
<%
|
||
|
|
response.setHeader("cache-control", "no-cache");
|
||
|
|
response.setHeader("pragma", "no-cache");
|
||
|
|
response.setHeader("expires", "Mon 1 Jan 1990 00:00:00 GMT");
|
||
|
|
|
||
|
|
%>
|
||
|
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||
|
|
<html>
|
||
|
|
<head>
|
||
|
|
<title>WEBSHELL检查</title>
|
||
|
|
|
||
|
|
<LINK href="/css/Weaver_wev8.css" type=text/css rel=STYLESHEET>
|
||
|
|
</head>
|
||
|
|
<%!
|
||
|
|
public List getFiles(String filepath, long ts) {
|
||
|
|
List files = new Vector();
|
||
|
|
//System.out.println(TimeUtil.getCurrentTimeString()+":开始得到项目 "+project+" 文件列表...");
|
||
|
|
listFiles(files, filepath, ts);
|
||
|
|
//System.out.println(TimeUtil.getCurrentTimeString()+":项目 "+project+" 文件列表获取完成..."+files.size());
|
||
|
|
return files;
|
||
|
|
}
|
||
|
|
|
||
|
|
public void listFiles(List files, String dirName, long ts) {
|
||
|
|
try {
|
||
|
|
File dirFile = new File(dirName);
|
||
|
|
if (!dirFile.exists() || (!dirFile.isDirectory())) {
|
||
|
|
} else {
|
||
|
|
File[] tmpfiles = dirFile.listFiles();
|
||
|
|
for (int i = 0; i < tmpfiles.length; i++) {
|
||
|
|
File f = tmpfiles[i];
|
||
|
|
if (f.isFile()) {
|
||
|
|
if (!f.getName().endsWith(".log") && !f.getName().endsWith(".zip") && !f.getName().toLowerCase().endsWith(".jpg")
|
||
|
|
&& !f.getName().toLowerCase().endsWith(".jpeg") && !f.getName().toLowerCase().endsWith(".js")
|
||
|
|
&& !f.getName().toLowerCase().endsWith(".css") && !f.getName().toLowerCase().endsWith(".png")) {
|
||
|
|
|
||
|
|
Date d = new Date(f.lastModified());
|
||
|
|
if (d.getTime() > ts) {
|
||
|
|
files.add(f.getAbsolutePath());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
} else if (f.isDirectory()) {
|
||
|
|
if (!f.getPath().trim().endsWith("filesystem")) {
|
||
|
|
if (f.getPath().contains("WEB-INF")) {
|
||
|
|
if (f.getPath().trim().endsWith("WEB-INF") || f.getPath().trim().contains("WEB-INF" + File.separator + "work")) {
|
||
|
|
listFiles(files, f.getAbsolutePath(), ts);
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
listFiles(files, f.getAbsolutePath(), ts);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
} catch (Exception e) {
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public String checkCode(String code, int line) {
|
||
|
|
if (code == null) return null;
|
||
|
|
Pattern p = null;
|
||
|
|
Matcher m = null;
|
||
|
|
p = Pattern.compile("getruntime|processbuilder|https://github.com/sensepost/reGeorg|SocketChannel|defineClass", Pattern.CASE_INSENSITIVE);
|
||
|
|
m = p.matcher(code);
|
||
|
|
if (m.find()) {
|
||
|
|
return "0";
|
||
|
|
}
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
public List checkFiles(List files) {
|
||
|
|
String readline = "";
|
||
|
|
List resultList = new Vector();
|
||
|
|
int i = 0;
|
||
|
|
BaseBean bb = new weaver.general.BaseBean();
|
||
|
|
for (int j = 0; j < files.size(); j++) {
|
||
|
|
String file = "" + files.get(i);
|
||
|
|
i++;
|
||
|
|
//xss.writeLog(file,true);
|
||
|
|
if (i % 50 == 0) {
|
||
|
|
try {
|
||
|
|
bb.writeLog("已完成:" + (i * 1.0 / files.size() * 100) + "%...");
|
||
|
|
} catch (Exception e) {
|
||
|
|
}
|
||
|
|
//System.out.println("已完成:"+(i*1.0/files.size()*100)+"%...");
|
||
|
|
}
|
||
|
|
File f = new File(file);
|
||
|
|
if (!f.exists()) continue;
|
||
|
|
if ((f.getName().indexOf("debug.jsp") != -1 && file.indexOf("debug") != -1)
|
||
|
|
|| (f.getName().indexOf("debugm.jsp") != -1 && file.indexOf("debug") != -1)
|
||
|
|
|| (f.getName().indexOf("monitorXOperation.jsp") != -1 && file.indexOf("join") != -1)
|
||
|
|
|| (f.getName().indexOf("checkdone.jsp") != -1 && file.indexOf("security") != -1 && file.indexOf("monitor") != -1)
|
||
|
|
|| f.getName().indexOf("checkFile.jsp") != -1
|
||
|
|
|| f.getName().indexOf("ecologyClusterConfigCheck.jsp") != -1
|
||
|
|
) continue;
|
||
|
|
BufferedReader is = null;
|
||
|
|
boolean isComment = false;
|
||
|
|
try {
|
||
|
|
is = new BufferedReader(new InputStreamReader(new FileInputStream(f), "GBK"));
|
||
|
|
int lineno = 0;
|
||
|
|
//System.out.println("正在检查第"+i+"个文件,总共"+files.size()+"个文件...");
|
||
|
|
long spaceCount = 0;
|
||
|
|
long totalCount = 0;
|
||
|
|
boolean inKeyword = false;
|
||
|
|
while ((readline = is.readLine()) != null) {
|
||
|
|
//readline = readline.trim() ;
|
||
|
|
lineno++;
|
||
|
|
if (readline != null) {
|
||
|
|
//if(readline.indexOf("//")!=-1)continue;
|
||
|
|
//totalCount+=readline.length();
|
||
|
|
/*for(int c=0;c<readline.length();c++){
|
||
|
|
if(readline.charAt(c)==32){
|
||
|
|
spaceCount++;
|
||
|
|
}else if(readline.charAt(c)==9){
|
||
|
|
spaceCount+=4;
|
||
|
|
}
|
||
|
|
}*/
|
||
|
|
String res = checkCode(readline, lineno);
|
||
|
|
if (res == null) {//正常
|
||
|
|
} else if (res.equals("0")) {//非例外
|
||
|
|
//resultList.add(f.getPath());
|
||
|
|
inKeyword = true;
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (inKeyword) {
|
||
|
|
resultList.add(f.getPath());
|
||
|
|
}
|
||
|
|
} catch (Exception e) {
|
||
|
|
// TODO Auto-generated catch block
|
||
|
|
e.printStackTrace();
|
||
|
|
} finally {
|
||
|
|
try {
|
||
|
|
is.close();
|
||
|
|
} catch (Exception e) {
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return resultList;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
%>
|
||
|
|
<body>
|
||
|
|
<div style="margin:0 auto;width:800px;margin-top:50px;">
|
||
|
|
<%
|
||
|
|
if (request.getParameter("heart") != null && "1".equals(request.getParameter("heart"))) {
|
||
|
|
User user = HrmUserVarify.getUser(request, response);
|
||
|
|
if (user == null || !"sysadmin".equals(user.getLoginid())) {
|
||
|
|
out.println("false");
|
||
|
|
} else {
|
||
|
|
out.println("true");
|
||
|
|
}
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
User user = HrmUserVarify.getUser(request, response);
|
||
|
|
|
||
|
|
if (user == null || !"sysadmin".equals(user.getLoginid())) {
|
||
|
|
out.println("请登陆");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
long ts = -1;
|
||
|
|
if(request.getParameter("ts") != null){
|
||
|
|
ts = Long.parseLong(request.getParameter("ts"));
|
||
|
|
} else if(request.getParameter("dt") != null){
|
||
|
|
String dt = Util.null2String(request.getParameter("dt"));
|
||
|
|
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
|
||
|
|
try {
|
||
|
|
ts = sdf1.parse(dt).getTime();
|
||
|
|
}catch (Exception e){
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
//List exceptionFiles = checkFiles(getFiles(request.getRealPath("/")));
|
||
|
|
List exceptionFiles = getFiles(request.getRealPath("/"),
|
||
|
|
(ts == -1 ? System.currentTimeMillis() : ts) - 3600 * 1000);
|
||
|
|
//System.out.println(exceptionFiles);
|
||
|
|
out.println("疑似异常文件列表:<p></p>");
|
||
|
|
out.println("<div style='color:red;'><b>");
|
||
|
|
if (exceptionFiles.size() == 0) {
|
||
|
|
out.println("未发现可疑文件。");
|
||
|
|
}
|
||
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
|
||
|
|
String date = Util.null2String(request.getParameter("date"));
|
||
|
|
for (int i = 0; i < exceptionFiles.size(); i++) {
|
||
|
|
File f = new File("" + exceptionFiles.get(i));
|
||
|
|
Date d = new Date(f.lastModified());
|
||
|
|
out.println("<p>" + StringUtils.replace(("" + exceptionFiles.get(i)), request.getRealPath("/"), "ecology" + File.separatorChar) + "---->" + sdf.format(d) + "</p>");
|
||
|
|
}
|
||
|
|
out.println("</b></div>");
|
||
|
|
%>
|
||
|
|
</div>
|
||
|
|
</body>
|
||
|
|
</html>
|