启动靶场环境后,查看网页源码

细细阅读关键代码
if(isset($_FILES['file'])) {
$name = basename($_POST['name']);
$ext = pathinfo($name,PATHINFO_EXTENSION);
if(in_array($ext, ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'])) {
exit('bad file');
}
move_uploaded_file($_FILES['file']['tmp_name'], './' . $name);
}
发现主页接受$_POST['name'],也就是图上的文本框的输入,并分离出其后缀如'evil.php'的‘php’,若后缀是php等字符,则报错'bad file'并结束脚本,反之则将文件以$_POST['name']为名,重命名并存储。
这里解释下为什么要设置文本输入框,明明可以直接提取文件名的,这是题目为了复现漏洞,如果直接提取文件名,会用到$_FILES['file']['name']获取文件名,这会把换行符\x0a自动去除,所以$_FILES['file']['name']这种方式获取文件名就不会造成这个漏洞。
攻击目的
绕过针对文件上传漏洞的过滤.php文件的防护。
攻击
编辑一个1.php,其内容是<?php phpinfo(); ?>,并把文本输入框写上1.php以作为木马在服务器上的存储名,然后上传过程抓包。

我们去找第二个'1.php',这才是$_POST['name']即文本输入框的值。'php'的底层十六进制ascii码是'70 68 70','换行符'的底层十六进制ascii码是'0a'
![]()
找到了,在70 68 70后插入0a并forward,response显示如下,没有报错bad file

说明文件存储上了。去访问木马文件。

要知道1.php%0a不是严格的.php后缀,理论上不能访问成功才对。但是Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0A
共有 0 条评论