前言——首先我這是在前輩的經驗上自己動手做了這次實驗,全都仰仗前輩的經驗總結。
漏洞簡介:
apache httpd是一款http服務器,它可以通過mod_php來運行php網頁,其中2.4.0~2.4.29版本中存在一個解析漏洞,在解析php時,1.php、0xa將被按照php後綴進行解析,導致繞過一些服務器的安全策略。
復現:
我是在kali環境下,預先已經裝好了docker。
不知怎麼下載docker的和安裝的可以去vulhub上自行解決:漏洞搭建環境指導
下載漏洞集成環境vulhub:
git clone https://github.com/vulhub/vulhub.git
啓動docker:
systemctl start docker
- 在物理機上創建目錄
- mkdir -p /var/www/html、
- 然後創建個容器,並關聯物理機的/var/www/html目錄
- docker run -d -v /var/www/html:/var/www/html -p 8080:80 --name apache php:5.5-apache
- 再把物理機的/var/www/html開放寫權限
- chmod 777 /var/www/html/
在html目錄下編輯一個php文件,內容如下:
該代碼爲模擬一個存在解析漏洞的環境
<?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);
}
對這個代碼進行分析的話,發現這裏獲取文件名是需要單獨post一個name的,如果通過下面這樣的方式就會把\0xa自動去除,也就不會造造成這個漏洞
$_FILES['file']['name']
接着創建一個index.html文件:
內容如下:
<form action="/你的PHP文件名.php" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="text" name="name">
<input type="submit" value="submit">
</form>
這是創建了一個上傳表單
我們創建一個php文件,內容如下:
<?php
phpinfo();
?>
直接將其上傳會顯示上傳失敗
將其上傳後抓包,在Hex選項卡中name=你的php文件名.php後面0d的位置右鍵-Insert byte,添加一個0a,然後發包,成功上傳
瀏覽器訪問:ip:8080/x.php%0A成功解析
回車的(0D)是不行的,雖然能上傳成功,但是無法解析
優秀復現文章: