照着P神的文章准備復現一下(總結一下經驗)
環境的安裝
這里面直接使用的vulhub里面的環境來進行安裝的(為了方便嗎)
基礎環境如下

實際上Apache版本在2.4.0~2.4.29即可
index.php文件內容
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="text" name="name">
<input type="submit" value="submit">
</form>
<?php
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);
}?>
</body>
可以看到進行了黑名單處理

正常的php后綴會被攔截

嘗試上傳未知的后綴名,但是不能解析(apache老的解析漏洞不存在)

利用burp的十六進制功能來插入oa(其實也就是換行符,因為\n的十六進制就是0a)

明顯的多個換行

在服務器上生成了對於的文件
訪問http://ip:port/xxxx.php%0a即可Getshell
漏洞原理
其實就是正則的一個坑,在默認的Apache的配置里面,判斷是否解析為php文件是使用正則來匹配的(php|php4|phtml)$,而這個\(符號不僅僅是可以匹配行尾,還可以匹配一個換行(因此我們上傳的帶有換行的文件就會被解析,但是\)_FILES['xxx']['name']會默認的將換行給去掉,因此就顯得有些雞肋了,當然P神也說了,$這個思想是值得學習的)
后記
這里面特地的使用POST發送用戶名(因為使用$_FILES['xxx']['name']會將我們添加的換行給去掉)
