亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

文件上傳漏洞全面滲透分析小結(jié)

  發(fā)布時(shí)間:2021-03-21 12:23:53   作者:wolfshadow   我要評(píng)論
這篇文章主要介紹了文件上傳漏洞全面滲透分析小結(jié),這里主要為大家分享一下防御方法,需要的朋友可以參考下

0x00 文件上傳場(chǎng)景

(本文檔只做技術(shù)交流,切勿進(jìn)行違法犯罪操作,請(qǐng)做一個(gè)好人,不給別人添麻煩)

文件上傳的場(chǎng)景真的隨處可見(jiàn),不加防范小心,容易造成漏洞,造成信息泄露,甚至更為嚴(yán)重的災(zāi)難。

比如某博客網(wǎng)站評(píng)論編輯模塊,右上角就有支持上傳圖片的功能,提交帶有惡意字符串的圖片后,就直接可以顯示在評(píng)論中了,如圖:

再次聲明:大家在自己的搭建的環(huán)境里面測(cè)試,不要給別人造成麻煩哈。

文件上傳漏洞是進(jìn)行滲透是比較常見(jiàn)好利用的漏洞,利用它能夠直接上傳webshell,進(jìn)行連接,是比較常見(jiàn)的攻擊方式。針對(duì)文件上傳場(chǎng)景檢測(cè)和繞過(guò)進(jìn)行了全面姿勢(shì)總結(jié)。

0x01 滲透姿勢(shì)全面分析

針對(duì)一個(gè)文件上傳場(chǎng)景,首先判斷是客戶端JS校驗(yàn)還是服務(wù)器校驗(yàn),判斷依據(jù):上傳非法文件,返回結(jié)果是否很快?

1.客戶端JavaScript檢測(cè)

如果上傳非法文件,返回結(jié)果很快,或者F12打開開發(fā)者模式,上傳非法文件,發(fā)現(xiàn)沒(méi)有網(wǎng)絡(luò)請(qǐng)求,但是被攔截了,很有可能就是客戶端進(jìn)行了JS校驗(yàn)檢測(cè)。這種前端采用JS限制上傳類型和大小的方式:

<script type="text/javascript">
    function checkFile() {
        var file = document.getElementsByName('upload_file')[0].value;
        if (file == null || file == "") {
            alert("請(qǐng)選擇要上傳的文件!");
            return false;
        }
        //定義允許上傳的文件類型
        var allow_ext = ".jpg|.png|.gif";
        //提取上傳文件的類型
        var ext_name = file.substring(file.lastIndexOf("."));
        //判斷上傳文件類型是否允許上傳
        if (allow_ext.indexOf(ext_name) == -1) {
            var errMsg = "該文件不允許上傳,請(qǐng)上傳" + allow_ext + "類型的文件,當(dāng)前文件類型為:" + ext_name;
            alert(errMsg);
            return false;
        }
    }
</script>

很是雞肋,繞過(guò)思路:1.直接本地禁用JS,不讓其做檢測(cè) 2.抓包,修改文件后綴名類型,繞過(guò)檢測(cè)限制

2.服務(wù)器后端檢測(cè)

服務(wù)器后端檢測(cè)有較多方式,普遍分為文件類型檢測(cè),文件頭類型,文件擴(kuò)展名名單檢測(cè),文件內(nèi)容檢測(cè),接下來(lái)進(jìn)行簡(jiǎn)要分析。

a.文件類型檢測(cè)

此類檢測(cè)防護(hù)主要是從content-type進(jìn)行檢測(cè),檢驗(yàn)請(qǐng)求中content-type是否符合可接受的上傳類型(如"image/gif","image/png","image/jpeg")

if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'];          
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;

繞過(guò)思路:抓包將content-type改為可接受圖片形式,即可繞過(guò)

b.文件頭類型檢測(cè)

上個(gè)文件類型是檢測(cè)content-type,比較好偽造,這個(gè)則是使用getimagesize()函數(shù)來(lái)獲取文件的MIME類型,通過(guò)文件頭進(jìn)行判斷文件類型

if(file_exists($filename)){
$info = getimagesize($filename);

文件頭就是文件特定的標(biāo)志,如二進(jìn)制PE文件的4D5A,bmp文件的424D,zip文件的504B0304,各種常見(jiàn)文件的文件頭類型大家可以查找了解一下,常見(jiàn)圖片文件頭如下:

gif: GIF89a

jpg,jpeg: FF D8 FF

png: 89 50 4E 47 0D 0A

繞過(guò)思路:針對(duì)這種,上傳木馬惡意文件時(shí),先使用編輯工具在數(shù)據(jù)最前面添加圖片的文件頭進(jìn)行偽造,即可繞過(guò)

c.文件擴(kuò)展名檢測(cè)

這種類型有基于黑名單檢測(cè)和白名單檢測(cè)。通常基于黑名單是很不安全的,黑名單機(jī)制:只攔截名單中出現(xiàn)的擴(kuò)展后綴名,其余默認(rèn)放行。這就取決于名單中的擴(kuò)展后綴名覆蓋能力范圍了,很難把所有的考慮全面,就很容易造成漏洞。

黑名單繞過(guò)思路:可以從服務(wù)器的解析特性進(jìn)行分析,如特殊可解析后綴php3,php7,phtml,jspx等 如特殊的解析方式陌生后綴名,帶換行后綴名,雙后綴名等解析差異造成的漏洞。 還可以從混淆方面出發(fā),后綴名大小寫,點(diǎn)繞過(guò),空格繞過(guò),以及上傳.htaccess配置控制文件權(quán)限和::$DATA數(shù)據(jù)流的使用

基于白名單相對(duì)于黑名單就安全很多了,要求只能是特定擴(kuò)展名的文件才能夠上傳。

白名單繞過(guò)思路:MIME繞過(guò),修改文件類型為白名單可接受的類型,以及%00,0x00截?cái)嗬@過(guò),這種場(chǎng)景針對(duì)save_path可控。

00截?cái)嘣砥鋵?shí)很巧妙,利用場(chǎng)景是文件保存路徑可控,這樣一來(lái)我們上傳的文件符合白名單就行,真正動(dòng)手的地方在文件保存路徑出,可以放上自己的webshell文件,然后在webshell文件后面添加%00,或0x00,再加一些字符,這樣一來(lái),系統(tǒng)在解析碰到00就會(huì)截?cái)啵竺孀址筒黄鹱饔?,只剩下前面的webshell文件名,就可以在url中進(jìn)行訪問(wèn)了。%00和0x00的使用區(qū)別在于提交get請(qǐng)求時(shí),是%00,會(huì)進(jìn)行url自動(dòng)解碼動(dòng)作,然后進(jìn)入驗(yàn)證函數(shù)。0x00則是post請(qǐng)求直接進(jìn)入驗(yàn)證函數(shù)。

d.文件內(nèi)容檢測(cè)

比較厲害的防護(hù)檢測(cè),就是針對(duì)內(nèi)容做檢測(cè),這種防護(hù)能力比較強(qiáng),但也不是不能繞過(guò)。自始至終,攻防都是在對(duì)抗中螺旋演進(jìn)的。

這種檢測(cè)防護(hù)基本都是從webshell具有的代表性敏感字符?或者危險(xiǎn)敏感函數(shù)。

繞過(guò)思路:從特殊敏感字符開始進(jìn)行Fuzz測(cè)試,探測(cè)webshell中有多少必要的字符存在被替換,如果構(gòu)成webshell執(zhí)行的字符

被替換得較多,剩下未過(guò)濾的字符的難以支撐webshell執(zhí)行,可以換個(gè)角度利用系統(tǒng),調(diào)用腳本語(yǔ)言,如<script language='php'>system('ls');<script>。

還有一種更強(qiáng)的基于內(nèi)容檢測(cè)機(jī)制,對(duì)上傳的圖片進(jìn)行二次渲染,參考代碼如下

//判斷文件后綴與類型,合法才進(jìn)行上傳操作
    if(($fileext == "jpg") && ($filetype=="image/jpeg")){
        if(move_uploaded_file($tmpname,$target_path)){
            //使用上傳的圖片生成新的圖片
            $im = imagecreatefromjpeg($target_path);

            if($im == false){
                $msg = "該文件不是jpg格式的圖片!";
                @unlink($target_path);
            }else{
                //給新圖片指定文件名
                srand(time());
                $newfilename = strval(rand()).".jpg";
                //顯示二次渲染后的圖片(使用用戶上傳圖片生成的新圖片)
                $img_path = UPLOAD_PATH.'/'.$newfilename;
                imagejpeg($im,$img_path);
                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            $msg = "上傳出錯(cuò)!";
        }

主要就是后端調(diào)用了php的GD庫(kù),利用imagecreatefromjpeg()函數(shù)提取了文件中的圖片數(shù)據(jù),然后再重新渲染,這樣圖片中插入的惡意代碼就會(huì)被過(guò)濾掉了,經(jīng)過(guò)測(cè)試發(fā)現(xiàn),不管是直接修改文件頭制作圖片馬,還是利用copy命令制作的圖片馬,都無(wú)法避免其中的一句話被過(guò)濾掉。

繞過(guò)思路:借鑒二進(jìn)制中鉤子的思想,其實(shí)就是想在上傳圖片中找一塊"地方",存儲(chǔ)webshell,這塊"地方"要求在后端處理后沒(méi)有被過(guò)濾掉。那就上傳一個(gè)正常的文件,然后下載下來(lái),diff一下,查看哪些位置沒(méi)有被改動(dòng)過(guò),然后添加webshell進(jìn)行嘗試。

0x02 安全小思考

以上防護(hù)和繞過(guò)姿勢(shì)基本上都是從業(yè)務(wù)實(shí)戰(zhàn)和CTF比賽中總結(jié)而來(lái)的,更多的時(shí)候需要各種信息進(jìn)行綜合利用,安全中攻擊和防范永遠(yuǎn)是在對(duì)抗中相互成就的。敬畏前輩先驗(yàn)知識(shí),展露后輩探索精神。

相關(guān)文章

最新評(píng)論