整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          jsp+servlet做的用戶注冊登錄刪除功能

          sp+servlet做的用戶注冊登錄刪除功能

          主要功能:

          用戶注冊

          用戶登錄

          用戶刪除

          art1前言

          在日常的藍隊溯源工作、感染加密勒索病毒后的應急排查工作中,查找攻擊者遺留的webshell是一種常規手段,一旦webshell文件被找到后,可以反推出很多信息,最重要的是能確定攻擊者攻擊時間,以此攻擊時間為軸心開展溯源工作會事半功倍。但攻擊者經常會把webshell文件刪除,并且清理掉所有的訪問日志,這種情況下應該怎么溯源確定上傳webshell的攻擊時間呢?其實對于jsp型或jspx型webshell來說,還是有辦法的,因為java的webshell在編譯過程中會生成很多臨時文件,一直留存在服務器中。

          Part2技術研究過程

          首先本地搭建一個tomcat,模擬攻擊者行為,上傳一個jsp的webshell

          接下來模擬攻擊者行為,把log111.jsp文件刪除掉,那么怎么找到這個shell遺留的蛛絲馬跡呢?

          查看tomcat中間件的\work\Catalina\localhost_\org\apache\jsp 目錄,仍然是可以發現這個shell的編譯過程中產生的幾個文件的,這3個文件攻擊者一般不會刪除,也不會更改文件的時間屬性。所以,這些jsp型webshell文件在編譯過程中生成的class文件的時間屬性,往往是比較準確的,而jsp文件的時間屬性,很多攻擊者會改成與web應用部署一樣的時間,去迷惑藍隊工作人員。

          原理:客戶端訪問某個jsp 、jspx文件時,Tomcat容器或者Weblogic容器會將 jsp 文件編譯成java文件和class文件,這兩份文件均會存儲在容器的某個目錄中。

          如下圖所示,可以確定攻擊者的攻擊時間了:

          如果需要進一步驗證此文件是正常文件還是webshell文件,就需要使用jadx-gui工具對此class文件進行反編譯了。如下圖所示,很清楚看到了冰蝎webshell的代碼特征。

          注:虛擬機環境證明,tomcat中間件即使重啟后,這些編譯產生的臨時文件也是會一直存在的。

          接下來在weblogic中間件上進行同樣的操作,制作一個war包上傳到weblogic環境中:


          接下來將log.jsp刪除后,試著查看在weblogic中間件下還有什么蛛絲馬跡可以查詢,發現在/jsp_servlet/目錄下,還是有幾個webshell編譯生成的文件,這里與tomcat中間件不同的是,路徑中的/hwr7e2/是隨機生成的一個目錄,需要根據經驗具體問題具體分析:

          除此之外,還可以找到上傳的war包,一樣可以確定攻擊時間,一般在這個目錄下邊:\user_projects\domains\base_domain\servers\AdminServer\upload,即使刪掉jsp文件,重啟weblogic后,這個war包文件也會一直存在。

          Part3總結

          1. jsp、jspx型webshell文件被刪除后,可以通過查找編譯生成的class文件的方式去確定攻擊時間。如果攻擊者將webshell時間屬性改掉,也可以通過此方法獲取真實的攻擊時間。
          2. 對于tomcat、weblogic中間件,除非攻擊者刪除編譯生成的文件,否則重啟后這些文件也會一直留存在Web服務器中,成為溯源攻擊者的一個重要證據。
          3. 即使攻擊者非常細心,把這些class文件全部刪干凈了,那么借助一些取證工具或者專業設備,還是可以溯源出來的,這個將來會專門寫一篇文章講解。

          網絡安全abc123

          專注于紅隊、藍隊技術分享,每周一篇

          后續會繼續分享藍隊應急溯源技巧,同時也會分享關于weblogic日志分析的案例,歡迎大家交流分享,并提出寶貴意見!

          1),模板list_jsp.ftl文件

          <%@ page language="java" pageEncoding="UTF-8"%>
          <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
          
          <%
          String childPath = request.getContextPath();
          String basePath = request.getScheme()+"://"
          	+request.getServerName()+":"+request.getServerPort()+ childPath +"/";
          %>
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
            <head>
              <title></title>
          	<%@ include file="/pub/scripts.jsp"%>
          
              <script type="text/javascript">
              
                  function gotoPageSub(){
                      var varCurPageIdx = $("#curPageIdx").val();
                      varCurPageIdx = parseInt(varCurPageIdx) + 1;
                      var varPages = $("#pages").val();
                      if(parseInt(varCurPageIdx) > parseInt(varPages) ) {
                          // 沒有下一頁按鈕置灰
                          $("#pageSub").attr("disabled", true);
                          $("#pageSub").remove("href");
          			} else {
                          $("#curPageIdx").val(varCurPageIdx);
                          submit_seach();
          			}
          
                  }
          
                  function gotoPageAdd(){
                      var varCurPageIdx = $("#curPageIdx").val();
                      varCurPageIdx = parseInt(varCurPageIdx) - 1;
                      var varPages = $("#pages").val();
                      if(parseInt(varCurPageIdx) < 1) {
                          // 沒有上一頁按鈕置灰
                          $("#pageSub").attr("disabled", true);
                          $("#pageSub").remove("href");
                      } else {
                          $("#curPageIdx").val(varCurPageIdx);
                          submit_seach();
                      }
          
                  }
          
          		function submit_seach_real() {
                      $("#curPageIdx").val( 1 );
                      $("#serachForm").submit();
                  }
          
                  function submit_seach() {
                      $("#serachForm").submit();
                  }
          
                  function testT00_userModifyJs() {
          
                      var checkNum = 0;
                      var tid = 0;
                      $("input[name='tidChx']").each(function(){
          
          				if($(this).attr("checked")) {
          				    checkNum = parseInt(checkNum) + 1;
          				    tid = $(this).val();
          				}
          			});
                      if(checkNum > 1) {
                          alert("只能選中一條數據進行修改!");
                          return false;
          			}
                      else if(checkNum == 0) {
                          alert("請選擇其中的一條數據進行修改!");
                          return false;
          			} else {
                          $("#btn<#list mapDataTableComment as listItmCom > ${listItmCom.upperColumnName} </#list>Modify").attr("href", "<%=childPath %>/<#list mapDataTableComment as listItmCom > ${listItmCom.columnName} </#list>Conter/get<#list mapDataTableComment as listItmCom > ${listItmCom.upperColumnName} </#list>?tid="+ tid);
                          return true;
          			}
          		}
          
                  function testT00_userDispJs() {
          
                      var checkNum = 0;
                      var tid = 0;
                      $("input[name='tidChx']").each(function(){
          
                          if($(this).attr("checked")) {
                              checkNum = parseInt(checkNum) + 1;
                              tid = $(this).val();
                          }
                      });
                      if(checkNum > 1) {
                          alert("只能選中一條數據進行查看!");
                          return false;
                      }
                      else if(checkNum == 0) {
                          alert("請選擇其中的一條數據進行查看!");
                          return false;
                      } else {
                          $("#btn<#list mapDataTableComment as listItmCom > ${listItmCom.upperColumnName} </#list>Disp").attr("href", "<%=childPath %>/<#list mapDataTableComment as listItmCom > ${listItmCom.columnName} </#list>Conter/get<#list mapDataTableComment as listItmCom > ${listItmCom.upperColumnName} </#list>Disp?tid="+ tid);
                          return true;
                      }
                  }
          
                  function testT00_userDelJs() {
          
                      var checkNum = 0;
                      var tid = 0;
                      $("input[name='tidChx']").each(function(){
          
                          if($(this).attr("checked")) {
                              checkNum = parseInt(checkNum) + 1;
                              tid = $(this).val();
                          }
                      });
                      if(checkNum > 1) {
                          alert("只能選中一條數據進行刪除!");
                          return false;
                      }
                      else if(checkNum == 0) {
                          alert("請選擇其中的一條數據進行刪除!");
                          return false;
                      } else {
                          $("#btn<#list mapDataTableComment as listItmCom > ${listItmCom.upperColumnName} </#list>Del").attr("href", "<%=childPath %>/<#list mapDataTableComment as listItmCom > ${listItmCom.columnName} </#list>Conter/<#list mapDataTableComment as listItmCom > ${listItmCom.columnName} </#list>Del?tid="+ tid);
                          return true;
                      }
                  }
              </script>
              
            </head>
            <body>
            		
          		<!-- 標題區域 -->
          		<div class="tleBg">
          			<div class="title">
          				<span class="txt"> <em></em><#list mapDataTableComment as listItmCom > ${listItmCom.columnComment} </#list>- 列表
          				</span> <a href="javascript:;" class="search-hide"></a>
          			</div>
          			<div class="clr"></div>
          		</div>
            		
            		<!-- 查詢維度區域 -->
          		<div class="t_list" id="searchtable">
          			<form name="serachForm" id="serachForm" action="<%=childPath %>/<#list mapDataTableComment as listItmCom > ${listItmCom.columnName} </#list>Conter/query_<#list mapDataTableComment as listItmCom > ${listItmCom.upperColumnName} </#list>List" method="post">
          				<input type="hidden" id="curPageIdx" name="curPageIdx" value="美元符左大括<#list mapDataTableComment as listItmCom > ${listItmCom.columnName} </#list>Dto.curPageIdx右大括" />
          				<input type="hidden" id="pages" name="pages" value="美元符左大括<#list mapDataTableComment as listItmCom > ${listItmCom.upperColumnName} </#list>Dto.pages右大括" />
          
          				<table border="0" cellspacing="0" cellpadding="0" class="t_list_1">
          					<tbody>
          						<tr>
          							<td class="text">
          								名稱:
          							</td>
          							<td>
          								<input type="text" id="name_" name="name_" class="inputStyle" value="美元符左大括testT00_userDto.name_右大括" />
          							</td>
          							<td>
          								年齡:
          							</td>
          							<td>
          								<input type="text" id="age" name="age" class="inputStyle" value="美元符左大括testT00_userDto.age右大括" />
          							</td>
          						</tr>
          
          						
          						自己選擇加入查詢條件
          							<#list mapDataList as listItm >
          								${listItm.columnComment}: 元素ID  ${listItm.columnName}
          							</#list>
          						
          						
          						<tr>
          							<td class="text">
          								 
          							</td>
          							<td>
          								 
          							</td>
          							<td>
          								 
          							</td>
          							<td>
          								<input type="button" id="btn_search" value="查 詢" class="t_button_gray" onclick="submit_seach_real()" />
          							</td>
          						</tr>
          
          					</tbody>
          				</table>
          			</form>
          		</div>
          
            		<div class="t_title">
          	  		<a href="<%=childPath %>/<#list mapDataTableComment as listItmCom > ${listItmCom.columnName} </#list>Conter/<#list mapDataTableComment as listItmCom > ${listItmCom.columnName} </#list>Add" class="btn-def" id="btn<#list mapDataTableComment as listItmCom > ${listItmCom.upperColumnName} </#list>Add">新 增</a>
          			<a href="#" class="btn-def" id="btn<#list mapDataTableComment as listItmCom > ${listItmCom.upperColumnName} </#list>Modify" onclick="return <#list mapDataTableComment as listItmCom > ${listItmCom.columnName} </#list>ModifyJs()">修 改</a>
          			<a href="#" class="btn-def" id="btn<#list mapDataTableComment as listItmCom > ${listItmCom.upperColumnName} </#list>Del" onclick="return <#list mapDataTableComment as listItmCom > ${listItmCom.upperColumnName} </#list>DelJs()">刪 除</a>
          			<a href="#" class="btn-def" id="btn<#list mapDataTableComment as listItmCom > ${listItmCom.upperColumnName} </#list>Disp" onclick="return <#list mapDataTableComment as listItmCom > ${listItmCom.columnName} </#list>DispJs()">查 看</a>
            		</div>
            		
            		<div class="t-table-Frame">
          			<table width="100%" border="0" cellspacing="0" cellpadding="0" class="t-table">
          				<thead>
          						<tr class="titleBg">
          						
          						<#list mapDataList as listItm >
          								<td>${listItm.columnComment}</td>
          						</#list>
          							
          		  			</tr>
          		  		</thead>
          		  		<tbody>
          			  		<c:forEach items="美元符左大括listTestT00_userDto}" var="testT00_user" varStatus="k">
          					<tr>
          						<td>
          						 	<input type="checkbox" name="tidChx" value="美元符左大括testT00_user.tid}" title="美元符左大括testT00_user.tid}">
          				      		<a href="#">
          				      			美元符左大括testT00_user.tid}
          				      		</a>
          						</td>
          					 	
          						
          						<#list mapDataList as listItm >
          								
          								<td>美元符左大括<#list mapDataTableComment as listItmCom > ${listItmCom.columnName} </#list>.${listItm.columnName}</td>
          						</#list>
          
          						
          					</tr>
          					</c:forEach>
          					
          					<tr>
          						<td colspan="3" style="text-align: left">
          
          							                
          							共美元符左大括testT00_userDto.pages}頁, 當前第美元符左大括testT00_userDto.curPageIdx}頁 <a onclick="gotoPageAdd()" href="#" id="pageAdd">上一頁</a> <a onclick="gotoPageSub()" id="pageSub" href="#">下一頁</a>
          						
          						</td>
          					</tr>
          					
          		  		</tbody>
          	  		</table>
            		</div>
            </body>
          </html>

          (2),生成jsp列表頁

          public class TestCls {
          
              public static void main(String[] args) throws Exception {
                  TestCls testCls = new TestCls();
                  String testT00_po = "testT00_user";
                  String generFileName = testT00_po + "List.jsp";
                  testCls.outTemplate(testT00_po, "用戶數據"
                          , generFileName, "list_jsp.ftl" );
          
                  System.out.println("執行成功!");
              }
          
              // 輸出到模板
              private void outTemplate(String entryInfoPoName, String tableComment
                      , String templateFileName , String templFileName ) throws Exception {
          
                  Configuration configuration = new Configuration();
                  String templateDir = "F:\\xbl\\myResource\\temp_test_";
                  configuration.setDirectoryForTemplateLoading(new File(templateDir));
                  Template template = configuration.getTemplate(templFileName);
          
                  Map<String, List<EntryInfoPo>> dataMap = new HashMap<String, List<EntryInfoPo>>();
                  List<EntryInfoPo> listEntryInfo = new ArrayList<EntryInfoPo>();
                  listEntryInfo = testMetaAddComment();
                  dataMap.put("mapDataList", listEntryInfo );
          
                  // 表注釋
                  dataMap.put("mapDataTableComment", testTableComment(entryInfoPoName, tableComment ));
                  String generFileDir = "F:\\xbl\\myResource\\temp_test_\\gener_file_\\";
                  File generFile = new File(generFileDir + templateFileName);
                  if(generFile.exists()) {
                      generFile.delete();
                  }
                  generFile.createNewFile();
          
                  Writer outputWriter = new OutputStreamWriter(new FileOutputStream(generFile ) );
          //        Writer outputWriter = new OutputStreamWriter(System.out );
          
                  template.process(dataMap, outputWriter);
                  System.out.println("輸出完成!");
                  outputWriter.close();
              }
          
              // 表注釋
              private List<EntryInfoPo> testTableComment(String entryInfoPoName, String tableComment) throws Exception {
          
                  List<EntryInfoPo> listTableComment = new ArrayList<EntryInfoPo>();
                  EntryInfoPo entryInfoPo = new EntryInfoPo();
                  entryInfoPo.setColumnName(entryInfoPoName);
                  entryInfoPo.setColumnComment(tableComment);
                  entryInfoPo.setUpperColumnName(firTextUpper( entryInfoPoName ) );
                  listTableComment.add(entryInfoPo);
                  return listTableComment;
              }
          
              // 首字母大寫
              private String firTextUpper(String scontext ) {
                  int textLength = scontext.length();
                  String sufText = scontext.substring(1, textLength);
                  String firText = scontext.substring(0, 1);
                  firText = firText.toUpperCase();
                  String finText = firText + sufText;
                  return finText;
              }
          
              private List<EntryInfoPo> testMetaAddComment() throws Exception {
          
                  List<EntryInfoPo> listEntryInfoPo = new ArrayList<EntryInfoPo>();
                  Connection connection = getDataBaseConnection();
                  Statement statement = connection.createStatement();
                  ResultSet resultSet = statement.executeQuery("show full columns from t00_user ");
                  while (resultSet.next()) {
          
                      String columnComment = resultSet.getString("Comment");
                      String columnName = resultSet.getString("Field");
                      columnName = columnName.toLowerCase();
                      EntryInfoPo entryInfoPo = new EntryInfoPo();
                      entryInfoPo.setColumnName(columnName);
                      entryInfoPo.setColumnComment(columnComment);
                      listEntryInfoPo.add(entryInfoPo);
                  }
                  return listEntryInfoPo;
              }
              private Connection getDataBaseConnection() throws Exception {
                  // 連接數據庫
                  Class.forName("com.mysql.jdbc.Driver");
                  String databaseUrl = "jdbc:mysql://127.0.0.1:3306/grcdb05?useUnicode=true&characterEncoding=utf8";
                  Connection connection = DriverManager.getConnection(databaseUrl, "root", "root");
                  return connection;
              }
          }
          

          (3),注意替換空格


          主站蜘蛛池模板: 成人一区二区免费视频| 无码人妻精品一区二 | 精品国产一区二区三区久| 国产短视频精品一区二区三区| 无码精品人妻一区二区三区人妻斩 | 亚洲线精品一区二区三区影音先锋| 内射白浆一区二区在线观看| 国产激情一区二区三区在线观看 | 国产精品视频一区二区噜噜| 国产福利电影一区二区三区,免费久久久久久久精 | 国产AV午夜精品一区二区三| 国产一区二区久久久| 一区二区三区波多野结衣| www一区二区www免费| 在线精品动漫一区二区无广告| 一区二区三区精品| 成人在线观看一区| 最美女人体内射精一区二区| 久久亚洲综合色一区二区三区| 色欲AV蜜桃一区二区三| 国产精品亚洲产品一区二区三区| 午夜视频一区二区| 视频一区视频二区在线观看| 国产一区韩国女主播| 波多野结衣一区二区三区aV高清| 香蕉视频一区二区| 无码精品人妻一区二区三区免费看 | 精品国产伦一区二区三区在线观看| 精品一区二区三区波多野结衣| 久久久一区二区三区| 无码aⅴ精品一区二区三区| 亚洲精品日韩一区二区小说| 怡红院AV一区二区三区| 91香蕉福利一区二区三区| 激情综合一区二区三区| 成人免费观看一区二区| 亚洲一区无码中文字幕| 久久se精品一区精品二区国产| 国精品无码一区二区三区在线| 日本精品一区二区三本中文 | 亚洲乱色熟女一区二区三区丝袜|