CTF中的SQL注入的思路總結
1.拿到題目之后一般是一個登陸框(大概率盲注或者是報錯,寫腳本跑):
嘗試輸入用戶名(admin)和密碼(隨意)查看其返回結果這里一般又分為兩種:
- 有返回是密碼錯誤還是用戶名錯誤
- 只是單一的返回登陸失敗
對於第一種情況就可以直接嘗試在username
之后輸入payload的了
- 判斷注入點
- 按照執行效果判斷sql注入類型
- 利用字典跑一下被過濾的特殊符號和關鍵字(判斷語句一般使用regexp或length(),and或者異或,再或者就是直接輸入)
payload
and length('關鍵字')>0
^length('關鍵字')>0
- 最后利用information_schema爆出庫名,表名,字段名以及flag
對於第二種情況就稍微要復雜一些了
- 可以用burp抓個包,查看一下數據包中是否存在着一些提示內容
- 嘗試一些萬能的登陸密碼:假設sql語句是:
select * from user where username=’$username’ and password=’$password’
而我們我發送的數據包中是username= &password=
-
username=reborn'='&password=reborn'='
=>select * from user where username='reborn'=' and password='reborn'='
=>select * from user where 1 and 1
-
username=' or 1=1 %23&password=123456
-
username=admicsfn' union select '25d55ad283aa400af464c76d713c07ad'%23&password=12345678
利用不存在的用戶再去構造一個密碼來進行登陸
- 查看一下(利用字典)試一試哪一個特殊符號會報錯之類的,如果有報錯,則考慮報錯注入
- 如果報錯的是一些不常見的字符串,那可能就涉及了某些漏洞,比如%報錯,就可能是sprintf格式化字符串漏洞
- 題外話:平時多瀏覽一些安全網站,去找新出現的漏洞,及時去做一些漏洞復現,與時俱進
2.題目是GET注入(大概率是回顯注入)
- 判斷注入點
- 利用order by判斷字段數
union select 1,2,3,...%23
判斷具體哪個字段存在回顯- 利用字典跑一下被過濾的特殊符號和關鍵字(判斷語句一般使用length(),and或者異或,再或者就是直接輸入)
- 最后利用information_schema爆出庫名,表名,字段名以及flag
- 如果回顯的內容一直不存在變化那就需要考慮盲注了
3.頁面直接返回注入結果(insert等其他類型的注入,考慮時間盲注)
可以使用' and sleep(5)='1'='1
或' and sleep(5)='1'='1' %23
來判斷sleep()能否執行