一道簡單的SQL注入題

這是我真正意義上來講作的第一道SQL題目,感受從這個題目裏仍是能學到好多東西的,這裏記錄一下這個題目的writeup和在其中學到的東西
link:https://www.ichunqiu.com/battalion Web分類下的SQL前端

嘗試SQL注入

進入這個模擬環境以後,會獲得一個提示爲flag在數據庫中,這時候查看url欄能夠發現

嗯這個就有SQL注入內味了,而後試一下id=2或者id=3,發現id=2時候能夠出來提示爲test,而後再日後就什麼都不出來了,這時候我先僞裝id後面的東西是一個數字變量,輸入id=1 and 1=1,發現網頁給出提示是這是SQL注入代碼,這說明這個網站是有對SQL注入作基本的防禦的,因此如今的問題就變成了如何繞過服務器的過濾規則。mysql

對過濾or、and、xor、not的繞過

對這些的繞過通常的操做是sql

  • and = &&
  • or = ||
  • xor = | # 異或
  • not = !
    如今咱們換一下把輸入變成id=1 && 1=1,發現並無報錯,這說明咱們成功進行了注入的第一步。這時候咱們能夠發現,頗有可能該數據庫僅對咱們展現了表中某一列的數據,因此如今就要判斷這個表到底有幾列,這裏使用的方法是order by。url裏輸入id=1 order by 1,報錯提示這是sql注入代碼,因此如今要進行進一步的繞過

SQL關鍵字過濾繞過

  • 改變大小寫:例如select變爲SELect(本題中沒用)
  • 添加內聯註釋:把一些MYSQL的語句放在/*!...*/中,例如/*!order*/(本題中沒用)
  • 雙寫關鍵字:一些waf中替換使用的是replace()函數,所以能夠輸入selselectect,在通過waf處理後變爲select(本題中沒用)
  • 空格過濾繞過:有些waf會過濾掉注入中的空格致使沒法正常容許,這裏能夠把空格用/**/,反單引號,(),回車等進行代替(本題中暫時不用考慮)
  • 等號繞過:使用like和rlike模擬=的功能,在不添加通配符%時候,like xxxrlike xxx= xxx是等價的(本題中暫不用考慮)
  • 添加<>或者//:由於有的waf會對<>或//進行過濾,所裏能夠利用這一點,使用sel<>ect進行繞過(本題有用)
    如今進行分割,注意分割時候order不要分割爲了or<>der由於這樣又會引入or,如今咱們輸入ord<>er by x進行嘗試,發現最多到order by 3就中止了,這說明這個表只有3列。如今咱們就須要找出具體的flag位置,這就涉及到對mysql數據庫結構的瞭解。

查找flag

MYSQL數據庫

Mysql數據庫裏面有一個數據庫叫information_schema,這個數據庫中不少有用的信息都存在這個裏面數據庫

  • schemata表裏面存儲了不一樣數據庫的信息,以下所示:
  • tables表裏面存儲着每一個數據庫中包含的全部的表的信息,以下所示:
  • columns表裏面存儲着每一個數據庫中列的信息,以下所示:

查看數據庫信息

知道這些東西以後,咱們如今要找flag,我認爲flag多半是在這個數據庫裏面,首先咱們查看一下當先數據庫的名稱,由於已知查詢到的數據是3列,如今咱們要計算,輸出在前端的究竟是哪一列的數據,這裏咱們構造一個payload爲?id=1 un<>ion sel<>ect 1,2,3,發現輸出的有2,那麼能夠確定輸出在前端的就是第二列。
如今咱們想要知道這個表在哪一個數據庫,因此就能夠構造一個payload爲?id=1 un<>ion sel<>ect 1,database(),3,獲得前端的返回結果爲

如今咱們就要查找這個sqli數據庫中存在哪些表,在前面咱們說過,表的信息存在tables中,因此這裏構造一個payload爲?id=1 un<>ion sel<>ect 1,table_name,3 from information_schema.tables whe<>re table_schema='sqli',而後能夠獲得該數據庫中有兩張表,一個是info,一個是users

如今咱們分別查一下這兩個表裏面都有哪些列,信息從columns裏面查到,這時候咱們能夠構造payload爲?id=1 un<>ion sel<>ect 1,column_name,3 from information_schema.columns where table_schema='sqli' an<>d table_name='users'?id=1 un<>ion sel<>ect 1,column_name,3 from information_schema.columns where table_schema='sqli' an<>d table_name='info',分別以下所示:

服務器

找到flag

好吧看了一下列名稱,居然都有flag這個東西,那隻能一個表一個表找了,首先找一下第一個表users,這時候咱們能夠構造payload爲?id=1 un<>ion sel<>ect 1,flag_9c861b688330,3 fr<>om users,可是發現並出不來任何東西。。感到疑惑,好吧那就試下一個構造payload爲?id=1 un<>ion sel<>ect 1,flAg_T5ZNdrm,3 fr<>om info,這時候出來結果了,以下所示:

而後複製這個flag交差,就ok啦!函數

感想

這是第一次作sql注入的題,雖然這個題比較簡單,可是總的來講我仍是學到了很多東西的,好比Mysql數據庫中的表結構和sql注入的繞過等,我以爲仍是頗有教育意義的。網站

相關文章
相關標籤/搜索