我正在接受一个网络安全类,对于一项任务,我们必须利用一个特定的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()
是我认为可以被利用的文件中的唯一函数,我想不出另一个漏洞利用的地方.
我认为他们指的是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);
好像代码可能是不完整的,因为这里的值$last
,$first
并且$pass
永远都是这没有任何意义相同.这将是一个需要考虑的因素.
可能性#2 - 文件遍历:
../
在$email
变量中使用,您将能够访问文件夹fopen
外的其他acounts/
文件.
如果您运行:
它成功评估并查找test.sh内容的两个文件夹.因此,您可以通过$email
变量探测文件系统的内容.然后游戏的名称是找到一个标准文件,您知道其中的内容,将其输入$password
,您可以登录系统而无需注册.
情形#3 - 注册以.php结尾的电子邮件地址:
正如drew010所提到的,假设您被允许注册一个自定义帐户,然后通过注册$email
结尾.php
,并在注册您的帐户时将eval()
PHP代码放入其中$password
,这将创建一个后门文件,acounts/
以$email
您可以通过网络访问的方式命名.