第四屆上海大學生信息安全比賽----- web3
這道是源碼題,
源碼:
源碼很簡單,我覺得考得主要是細心
直接看第一個if,
判斷是否上傳了一個文件,然後進去判斷是否POST了一個名為file的參數,如果有上傳這個參數,那麽$filename就等於這個POST上去的值,否則就等於上傳上去的文件名
然後下面判斷$filename是否是一個array ,
如果是,就對$filename 進行 explode ,切割成一個數組
否則,。。。沒有判斷(這就是第一個考點)
$ext = end($filename)
如果$filename 不是array,那麽$ext 就等於上傳的文件的後綴
那麽如果是數組呢,那麽就等於POST上去的一個值。值可控,也就是說
繼續判斷$ext是否和$filename[count($filename)-1]的值相等
如果count($filename)為2,那麽就是判斷
$ext === $filename[1]
這裏就有一個問題了,那麽end($filename),到底是哪一個 (我覺得這裏也是一個考點)
測試一下
可以很簡單地繞過。
然後下面新生成一個文件,後綴我們可以控制為php
然後將剛才上傳的文件,保存進去
下面在POST一個參數hehe,
首先將這個文件的內容讀取出來,判斷前6位是否等於 @<?php
然後判斷上傳的文件不能和新生成的文件名一樣,這個隨便就可以過
成功了就包含這個
可怕的是下面有一個unlink() ,將剛才生成的文件全部刪除了,但是這個繞過去也很簡單
首先想到的是,資源競爭。
開多線程,如果這個文件剛生成,還沒有執行到unlink()的時候,被另外一個線程訪問到,那麽就會執行這個文件,如果這個文件的代碼再生成了一個文件,那麽這個文件就不會被刪除了。事實證明是可以的。
還有一種方法,我們控制後綴為 php/.
那麽生成的文件就會一直保存著,不會被刪除
(這種方法,我不是很理解,我沒有想到可以這樣子來繞過unlink(),學習姿勢了)
兩種方法都來試一下
第一種方法,資源競爭,這個比較耗時間,但是容易想到
第二種,
修改file[0]為
做到這裏,全部完成了,讀取flag的話,修改一下裏面內容,就可以讀到
第四屆上海大學生信息安全比賽----- web3