1. 程式人生 > >第四屆上海大學生信息安全比賽----- web3

第四屆上海大學生信息安全比賽----- web3

比較 alt 代碼 進行 比賽 http img -- 。。

這道是源碼題,

源碼:

技術分享圖片

源碼很簡單,我覺得考得主要是細心

直接看第一個if

判斷是否上傳了一個文件,然後進去判斷是否POST了一個名為file的參數,如果有上傳這個參數,那麽$filename就等於這個POST上去的值,否則就等於上傳上去的文件名

然後下面判斷$filename是否是一個array

如果是,就對$filename 進行 explode ,切割成一個數組

否則,。。。沒有判斷(這就是第一個考點)

$ext = end($filename)

如果$filename 不是array,那麽$ext 就等於上傳的文件的後綴

那麽如果是數組呢,那麽就等於POST上去的一個值。值可控,也就是說

$ext可控了

繼續判斷$ext是否和$filename[count($filename)-1]的值相等

如果count($filename)2,那麽就是判斷

$ext === $filename[1]

這裏就有一個問題了,那麽end($filename),到底是哪一個 (我覺得這裏也是一個考點)

測試一下

技術分享圖片

技術分享圖片

可以很簡單地繞過。

然後下面新生成一個文件,後綴我們可以控制為php

然後將剛才上傳的文件,保存進去

下面在POST一個參數hehe

首先將這個文件的內容讀取出來,判斷前6位是否等於 @<?php

然後判斷上傳的文件不能和新生成的文件名一樣,這個隨便就可以過

成功了就包含這個

php文件

可怕的是下面有一個unlink() ,將剛才生成的文件全部刪除了,但是這個繞過去也很簡單

首先想到的是,資源競爭。

開多線程,如果這個文件剛生成,還沒有執行到unlink()的時候,被另外一個線程訪問到,那麽就會執行這個文件,如果這個文件的代碼再生成了一個文件,那麽這個文件就不會被刪除了。事實證明是可以的。

還有一種方法,我們控制後綴為 php/.

那麽生成的文件就會一直保存著,不會被刪除

(這種方法,我不是很理解,我沒有想到可以這樣子來繞過unlink(),學習姿勢了)

兩種方法都來試一下

第一種方法,資源競爭,這個比較耗時間,但是容易想到

技術分享圖片

第二種,

技術分享圖片

修改file[0]

php/. 就可以了

做到這裏,全部完成了,讀取flag的話,修改一下裏面內容,就可以讀到

第四屆上海大學生信息安全比賽----- web3