1.簽到題
右鍵源代碼便可
2.md5 collision
這個考點是php"=="的弱相等,爲什麼會出現弱加密呢,是由於在比較==兩邊的時候,會將字符串類型轉化爲相同,在進行比較。例如「admin」== 0,這個比較是返回True的,由於會先強制的將admin轉化爲數值,轉化出來的結果就是0==0,因此返回爲True。那爲何admin強制類型轉化以後取值爲0呢?這是由於php在強制轉化的時候,若是字符串中沒有出現"." "e" "E",則會按照int類型轉換,不然轉化成float,字符串開頭就決定了取的值,若是在合法的數值開頭,則使用該值,不然取0。舉個例子就明白了:
admin == 0
1admin == 1
admin1 == 0
而若是是帶e的則是會識別爲科學計數法,故而0e開頭的都會識別爲相等,由於0的多少次方都是0,因此這就是爲何能夠利用php弱相等繞過md5比較了。因此更加安全的比較是 === ,由於 === 會先比較數據類型,再去比較值 。能夠直接去搜索百度,能獲得一堆
3.簽到題
這題考簡單的SQL萬能密碼,嘗試在text1中簡單地注入,發現注入不進去,另闢蹊徑猜想該php中存在其餘的參數能夠注入,填寫正確的密碼,而後拼接上id使用萬能密碼,發現直接返回了flag
4.這題不是WEB
沒想到出題人說的是真的,這題確實不是Web,下載網頁中gif圖片,用winhex打開查看二進制,在文件的結尾處存在flag
5.層層遞進
看題目的提示,能夠看出應該是信息收集,一步步收集信息的意思,直接查看源碼分析連接。
6.AAencode
平臺代碼可能有點問題。
7.單身二十年
這題直接看網頁源代碼此處再也不贅述。
8.php decode
這題考察典型的使用gzinflate+base64對php進行加密的解密,百度一波,提示的是將eval替換成echo便可。
這裏都是針對的是一層加密的,調研的過程當中,發現有更高級的用法就是多層加密的,即經過上述的方法,解密出來的東西仍是同樣的。
下面附上多重加密的代碼,替換eval,匹配你想要的字符串便可。
9.文件包含
進入題目,思路很清楚,file參貌似存在文件包含漏洞。
故而這裏詳述一下文件包含的原理。爲何會存在文件包含呢,開發人員通常會把重複使用的函數寫到一個文件中,須要使用的時候直接調用,就免去了再次編寫的麻煩,而在調用這些文件的過程就被稱爲文件包含。幾乎全部的腳本都存在文件包含,但漏洞多出如今php中,這是語言設計的漏洞,但這並不表明其餘的語言不存在。
其中常見的函數是include() , include_once() , require_once() , fopen() , readfile() ....
下面接收下各個函數的意思:
include():執行到include時才包含文件,找不到包含文件時就會產生警告,但會繼續執行腳本。
require():程序運行一開始,就會包含文件,若是找不到包含文件,中止腳本。
include_once()和 require_once():若是文件中的代碼已經被包含,則不會再次包含。
其中文件包含的方法總結下來以下幾種,應該還有其餘方法,往後若是遇到超越以下方法的題目,能夠作下標記。
1.直接包含
2.經過PHP內置協議直接讀取代碼
協議基礎:php://僞協議>>訪問各個輸入/輸出流
2.1 php://filter
解釋:php://filter是一種元封裝器,被設計用於數據流打開時的篩選過濾,簡單的講,就是在代碼運行前將代碼換一種方式讀取。這種方法不須要開啓allow_url_include選項。
payload:?file=php://filter/read=convert.base64-encode/resource=xxx.php
2.2 php://input
解釋:上面filter支持讀文件,確定還能寫文件,而寫文件就是利用input將數據post過去。
用法:?file=php://input 數據利用POST傳過去,其中若是allow_url_include=on,php<5.30,能夠形成任意代碼執行,即post一句話過去便可執行。
data://僞協議>>數據流封裝器,即include的文件流重定向到了用戶可控制的輸入流中
2.3 data://text/plain
解釋:
用法:?file=data://text/plain;base64,base64編碼的payload
phar://僞協議 >> 數據流包裝器,自 PHP 5.3.0 起開始有效,正好契合上面兩個僞協議的利用條件。說通俗點就是php解壓縮包的一個函數,解壓的壓縮包與後綴無關。
2.4 phar://
解釋:
用法:?file=phar://壓縮包/內部文件
這一題使用的即是利用了filter協議讀取了index.php的源碼,
經過base64解密便可獲得源碼。
10.單身一百年也沒用
這題與先前的單身二十年一模一樣,點擊以後,會發現有個302的返回包,請求頭中就存在flag
11.Download~!
鏈接打不開,題目做廢。
12.COOKIE
根據題目意思,着手點在Cookie上,直接試着將Login=0改爲Login=1便可獲得flag
13.MYSQL
根據提示的robots.txt,直接訪問獲得的是一段源碼,進行代碼審計。發現以下問題,首先是提示文件的名字,試着訪問是能夠訪問的,可是這段代碼使用了intval()強制整數轉化函數的安全處理,現在並無辦法對intval進行注入的操做。一開始覺得是暴力破解id,後來發現也就1024可能存在東西,可是被這個if擋住了,因此要想辦法繞過這個if,仔細觀察if的條件,條件並非$id,而是$_GET[id],因此如今的思路就變成了,若是輸入!=1024,可是intval[$id]=1024的問題了。
遂上網查一波資料發現以下規則
因此試一波小數,獲得flag
14.GBK Injection
這裏考察的是寬字節注入,關於寬字節,這題的防護在於使用了反斜槓的轉義,故而使用寬字節注入。
若是咱們輸入1%df呢,咱們看看效果
發現反斜槓被吃掉了,這是由於%5c是反斜槓,前面加上%df合在一塊兒數據庫會當作雙字節識別成一個%df%5c,因此就能形成注入了
那咱們只須要對http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df做爲注入的網站,用sqlmap跑下來就好了
15./x00
strpos() f函數查找字符串在另外一字符串中第一次出現的位置(區分大小寫)。
試一下傳入一個數組,便可獲得flag,由於這裏的值都是與false做比較,若是函數出錯返回NULL便可
這裏還有一個作法就是是1%00#biubiubiu,這一種比較好理解,傳nctf=1%00#biubiubiu 接收到1後被截斷,後面也有所須要的#biubiubiu,條件成立,拿到flag!
16. bypass again
這題強網杯中有一個更好的題目,這題的考點在於php中md5函數在接受數組的時候會返回NULL,因此若是傳入兩個數組,那麼就會變成NULL===NULL,而強網杯的那一題是隻能找出兩個相同的md5值才行,也能構造,經過找到兩個相同md5的文件,進行url編碼,傳上去就好了。
17.變量覆蓋
這題考察的是變量覆蓋漏洞。
常常引起變量覆蓋漏洞的函數有:extract(),parse_str()和import_request_variables()
1.extract()
目前使用最多見的就是這風格函數,使用的頻率也是最高的,致使的漏洞也是最多的。
extract(array,extract_rules,prefix)
array:輸入
extract_rules:可選,做用是檢查鍵名是否合法,其中要注意的是,若是該值等於EXTR_OVERWRITE(默認),若是鍵名有衝突,覆蓋變量。EXTR_SKIP ,若是有衝突,不覆蓋
prefix:可選,請注意 prefix 僅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 時須要。若是附加了前綴後的結果不是合法的變量名,將不會導入到符號表中。前綴和數組鍵名之間會自動加上一個下劃線。
2.parse_str()
parse_str函數的做用就是解析字符串並註冊成變量,在註冊變量以前不會驗證當前變量是否存在,因此直接覆蓋掉已有變量。
3.import_request_variables()
import_request_variables()函數就是把GET、POST、COOKIE的參數註冊成變量,用在register_globals被禁止的時候bool import_request_variables ( string $types [, string $prefix ] )
$type表明要註冊的變量,G表明GET,P表明POST,C表明COOKIE,第二個參數爲要註冊變量的前綴
這題的代碼審計中就考察了這個點
這裏講post進來的數據作了extract,而後比較了pass的值和¥thepassword_123的值,因此如今的目標是讓pass和thepassword_123相等既能獲得flag,因此這裏我構造這樣的輸入數據,讓等式兩邊都變成空。
能夠看到咱們已經成功的將thepassword_123覆蓋成了NULL,也不必定要是null,只要覆蓋讓他們相等便可。
18.PHP是世界上最好的語言
網頁沒法打開,略。
19. 假裝者
看這題的題目就知道考察的點是ip僞造。
在ddctf2018中web第一題也考察了這個點,遂僞造一下ip
可是啥也沒有,上網看一波其餘人的wp,好像是直接添加了X-Forwarded-For就能夠獲得flag,多是後臺網站的緣由,這題的知識點介紹到這裏。
20.Header
題目沒法打開,略。
21.上傳繞過
這題考察的是文件上傳繞過。
一個一個試
Content-Type:pass
00截斷文件名:pass
擴展名繞過:pass
00截斷文件夾名:成功
22.SQL注入1
這題考察代碼審計,給出源碼
進行源代碼的審計,觀察其中的數據庫查詢語句,發現對輸入的pass進行了md5加密,故而沒有辦法對其進行注入,而user的輸入採起了直接拼接的方式,故而直接對user進行注入,輸入admin')#將後面的註釋,前面的閉合便可,
23.pass check
這裏進行源代碼審計
發現使用了strcmp進行比較,並做爲了if的判斷條件,這個和上面提到的md5()弱相等有殊途同歸之妙。原理在於這是對兩個字符串進行比較,但若是傳入函數的不是字符串類型的話,strcmp會返回0,因此這裏咱們構造數組進行傳入,便可獲得flag。
24.起名字真難
進行源代碼審計
這裏有兩個條件,一個是必須得是判斷key中存不存在數字,第二個輸入的數==54975581388,不存在數字如何讓他等於54975581388呢,這裏一樣考察的是php的弱相等,上面提到,==兩邊會強制轉化爲同一類型,因此這裏咱們將54975581388轉化爲16進制的話也會先轉化爲十進制,在進行比較
剛好轉化出來也並不含數字。獲得flag
25.密碼重置
這裏題目要求的是重置admin,user1沒法更改,使用了base64編碼,故而這裏將admin進行base編碼再更改請求主體。便可。。
26.php反序列化
題目不可用,略。
27.SQL Injection
繼續源碼審計
這裏使用了get_magic_quotes_gpc()-,一種默認的配置,若是開啓的話,會將特殊字符加上\轉義。stripslashes(),刪除全部的\字符,htmlentities(),其中的ENT_QUOTES參數的意思是將全部的單引號和雙引號。可是要經過閉合單引號怎麼辦呢?這裏根據提示使用\對後面的單引號進行轉義,閉合。
後臺的語句變成了這樣
28.綜合題
這裏一打開,是下面這個樣子。
這裏使用的是js編碼,直接在控制檯中輸入。返回一個地址。
繼續訪問,提示在腦殼裏,查看http頭髮現tip:提示history of bash
這裏考察的知識點是--history命令能夠用來顯示曾執行過的命令。執行過的命令默認存儲在HOME目錄中的.bash_history文件中,能夠經過查看該文件來獲取執行命令的歷史記錄。須要注意的是.bash_history不包含當前會話所執行的命令,執行過的命令在關機時纔會寫入文件,除非執行命令history -w。
一開始還覺得是命令執行,後來找不到參數試了幾下也試不出來,後來直接訪問.bash_history試了試。
提示剛執行了系統命令 解壓了flagbak.zip包,而後訪問這個zip包,下載下來,得到flag
29.system(暫時沒法作)
30.SQL注入2
一樣的是代碼審計。
31.綜合題2
這題先作前期的信息收集,查看下方有個連接,點擊進去。
觀察多是文件包含漏洞,試了一下,果真存在文件包含漏洞,試了一下文本中提示的index.php,say.php
美化後的代碼如圖
信息收集的過程當中還發現了不少文件,均可以經過這文件包含來讀取源代碼。
其中so.php最爲可疑,而且存在sql注入漏洞。
題目有問題,做罷。
32.密碼重置2
先看tip,把tip的內容都找到
第一個tip
第二個tip
根據右鍵源碼,訪問index.php.swp和submit.php.swp,發現後者有東西
token長度爲10,且值要等於0,故而輸入10個0試試,獲得flag。其實這裏用到了弱類型!=,在做比較時也是會先強制轉換成整數再作比較。
33.file_get_contents
這題右鍵源碼
發現file_get_contents函數,一樣考察的是文件包含漏洞,這裏正是用到了上面說的php://input協議任意寫
34.變量覆蓋
這裏題目直接提示了變量覆蓋,咱們先觀察一下源代碼。
直接覆蓋。。
35.注意!!
php