Apache HTTPD 换行解析漏洞(CVE-2017-15715)学习笔记
漏洞范围:
Apache 2.4.0~2.4.29
源代码:
<?php
if(isset($_FILES['file'])) { //检查变量是否设置
$name = basename($_POST['name']); //basename:返回路径中文件名部分
$ext = pathinfo($name,PATHINFO_EXTENSION); //pathinfo:以数组的性式返回文件路径信息
//PATHINFO_EXTENSION:只返回 extension(文件名后缀)
if(in_array($ext, ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'])) { //黑名单检查
exit('bad file');
}
move_uploaded_file($_FILES['file']['tmp_name'], './' . $name);
//tmp_name:文件上传到服务器的临时文件夹
//moce_uploaded_file:将文件上传到指定的目录
} else {
?>
漏洞成因:
正则表达式中,$用来屁匹配字符串的结尾位置。菜鸟写道
匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。
意味着我们在上传的文件后面加上换行符。正则匹配到的是 extension\n 与黑名单的内容(extension)不匹配。所以能够上传成功。但是在文件进行解析的时候,会被正确的解析。这就造成了绕过。
漏洞复现:
可以看到上传失败。
添加0a后上传成功。