攻防世界——warmup

進入頁面發現一個大的滑稽臉,查看源代碼,發現提示source.php
在這裏插入圖片描述
進入該頁面,進行代碼審計,又發現一個hint.php頁面,進入發現提示
在這裏插入圖片描述
表明 flag 在這個文件中,且這個文件名暗示要使用四層目錄

繼續審計代碼
在這裏插入圖片描述
發現滿足三個條件,會包含並運行指定文件file,此處的file可以由我們構造,爲切入點:

  1. 檢查file變量是否爲空
  2. 檢查file變量是否爲字符串
  3. 通過自定義的checkFile函數來檢查

由於我們要構造payload,前兩點直接滿足,直接查看checkFile函數代碼:
在這裏插入圖片描述
發現包含四個if語句:

  1. 第一個 if 語句對變量進行檢驗,要求$page爲字符串,否則返回 false
  2. 第二個 if 語句判斷$page是否存在於$whitelist數組中,存在則返回 true
  3. 第三個 if 語句,截取傳進參數中首次出現?之前的部分,判斷該部分是否存在於$whitelist數組中,,存在則返回 true
  4. 第四個 if 語句,先對構造的 payload 進行 url 解碼,再截取傳進參數中首次出現?之前的部分,並判斷該部分是否存在於$whitelist中,存在則返回 true

以上四個滿足一個即可返回 true,若均未滿足,則返回 false

我們利用第三個 if 語句構造參數:
?file=source.php?/../../../../ffffllllaaaagggg
第一個?表示傳參,第二個?用來滿足截取

  1. 爲什麼include source.php(或hint.php)?/../../../../ffffllllaaaagggg能執行成功
    在這裏插入圖片描述
    因爲我們的參數是有/../../../../這樣的路徑,所以符合最後一段話如果定義了路徑,就會忽略/前的字符串而去找/../../../../ffffllllaaaagggg這個文件
  2. 網上大多數 writeup 用到的 url 編碼繞過發現並沒有用到,這一方法的思路是將?進行兩次 url 編碼,變爲%253f在服務器端提取參數時自動解碼一次checkFile函數中解碼一次,仍會解碼爲?,可以繞過第四個 if ,但是實測只編碼一次也可以得到 flag
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章