Nginx 文件名邏輯漏洞(CVE-2013-4547)
影響版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
這個(gè)漏洞其實(shí)和代碼執(zhí)行沒有太大關(guān)系,其主要原因是錯(cuò)誤地解析了請(qǐng)求的URI万俗,錯(cuò)誤地獲取到用戶請(qǐng)求的文件名湾笛,導(dǎo)致出現(xiàn)權(quán)限繞過、代碼執(zhí)行的連帶影響闰歪。
舉個(gè)例子嚎研,比如,Nginx匹配到.php結(jié)尾的請(qǐng)求库倘,就發(fā)送給fastcgi進(jìn)行解析临扮,常見的寫法如下:
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT /var/www/html;
}
正常情況下(關(guān)閉pathinfo的情況下),只有.php后綴的文件才會(huì)被發(fā)送給fastcgi解析教翩。
而存在CVE-2013-4547的情況下杆勇,我們請(qǐng)求1.gif[0x20][0x00].php,這個(gè)URI可以匹配上正則.php$饱亿,可以進(jìn)入這個(gè)Location塊蚜退;但進(jìn)入后闰靴,Nginx卻錯(cuò)誤地認(rèn)為請(qǐng)求的文件是1.gif[0x20],就設(shè)置其為SCRIPT_FILENAME的值發(fā)送給fastcgi钻注。
fastcgi根據(jù)SCRIPT_FILENAME的值進(jìn)行解析蚂且,最后造成了解析漏洞。
所以幅恋,我們只需要上傳一個(gè)空格結(jié)尾的文件杏死,即可使PHP解析之。
環(huán)境搭建
docker-compose build
docker-compose up -d
啟動(dòng)后捆交,訪問http://your-ip:8080/即可看到一個(gè)上傳頁面淑翼。
漏洞復(fù)選
上傳一個(gè)php后綴的文件,上傳失敗不是支持的類型零渐。
然后我們修改后綴上傳一個(gè)gif后綴的窒舟,內(nèi)容是phpinfo的文件
抓包在gif后綴后面再加一個(gè)空格系忙,發(fā)現(xiàn)上傳成功
之后訪問上傳文件路徑后加上.php诵盼,抓取數(shù)據(jù)包
之后打開hex編碼,在 .php前面加上[0x20][0x00]倆個(gè)編碼银还,一個(gè)代表空格一個(gè)代表\0
然后再轉(zhuǎn)發(fā)數(shù)據(jù)包可以發(fā)現(xiàn)gif被當(dāng)成php成功解析风宁。