我正在接受一个网络安全类,对于一项任务,我们必须利用一个特定的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.")
}
Run Code Online (Sandbox Code Playgroud)
我知道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)
Run Code Online (Sandbox Code Playgroud)
我可以在系统中输入电子邮件,但在保存之前会验证格式.在这一点上,我有点失落,不知道我还能做些什么.
fopen()是我认为可以被利用的文件中的唯一函数,我想不出另一个漏洞利用的地方.
我认为他们指的是CRLF漏洞.
在您的示例漏洞利用代码中,您传递了一些PHP代码,但这不是您要做的.
目标是fopen从互联网上打开一个文件.如果$email变量包含由CRLF分隔的两个字符串,则可以fopen()访问不应该访问的外部网站.
所有这些都取决于$fh文件描述符之后发生的事情,它将决定你将如何利用它.
这是我在该漏洞上找到的链接:http://www.securiteam.com/unixfocus/5OP0C0A8AC.html
发布更多代码后编辑:
我们首先要强制$password你想要的价值.
因此,游戏的名称强制$pass为您想要的值,这样strcmp返回true,并且您在不知道任何密码的情况下登录.
$pass 在最后一个陈述中受到控制 $pass = fgets($fh)
如果您使用CRLF漏洞指向fopen以打开您托管的URL,例如http://your.ip.address/your-file,并且在该文件中,您可以设置与设置相同的数据$password.这应该允许您登录而无需注册.
但是代码中有一些奇怪的东西,例如:
$last = fgets($fh);
$first = fgets($fh);
$pass = fgets($fh);
Run Code Online (Sandbox Code Playgroud)
好像代码可能是不完整的,因为这里的值$last,$first并且$pass永远都是这没有任何意义相同.这将是一个需要考虑的因素.
可能性#2 - 文件遍历:
../在$email变量中使用,您将能够访问文件夹fopen外的其他acounts/文件.
如果您运行:
<?php
$fh = fopen("acounts/../../test.sh","r");
?>
Run Code Online (Sandbox Code Playgroud)
它成功评估并查找test.sh内容的两个文件夹.因此,您可以通过$email变量探测文件系统的内容.然后游戏的名称是找到一个标准文件,您知道其中的内容,将其输入$password,您可以登录系统而无需注册.
情形#3 - 注册以.php结尾的电子邮件地址:
正如drew010所提到的,假设您被允许注册一个自定义帐户,然后通过注册$email结尾.php,并在注册您的帐户时将eval()PHP代码放入其中$password,这将创建一个后门文件,acounts/以$email您可以通过网络访问的方式命名.