1、后台登錄
格式:flag:{xxx}
解題鏈接: http://ctf5.shiyanbar.com/web/houtai/ffifdyop.php
打開鏈接:
查看源碼,發現一段被注釋的代碼,有用:
仔細分析這一句:
$sql = "SELECT * FROM admin WHERE username = 'admin' and password = '".md5($password,true)."'";
其實這一句我也不太會,通過別人的wp和百度PHP的md5(string,raw)函數:
那這個語句的含義就是將$password的值進行32位md5值加密后,再進行16進制和字符串的轉換。(從這里開始我就不太明白)。這道題的思路應該是構造一個'or'xxx'的密碼,只要后面的字符串為真即可。那么可以根據32位16進制的字符串來查找‘or’對應的16進制是276f7227(為什么我用腳本運行出來的or對應的16進制是6f72???歡迎評論解答),所以我們的目標就是要找一個字符串取32位16進制的md5值里帶有276f7227這個字段的,在276f7227這個字段后面緊跟一個數字(除了0)1-9,對應的asc碼值是49-57,轉化為16進制就是31-39,也就是含有276f7227+(31-39)這個字段,就可以滿足要求。而當md5后的hex轉換成字符串后,如果包含 ‘or’ 這樣的字符串,那整個sql變成:
SELECT * FROM admin WHERE pass = ''or'6<trash>'
那如何獲取這個字符串,我們不如回過頭來看看剛才頁面的url:view-source:http://ctf5.shiyanbar.com/web/houtai/ffifdyop.php,這里面有一個ffifdyop的字符,276f722736c95d99e921722cf9ed621c正是ffifdyop的md5轉義。