1. 程式人生 > >實驗吧 WEB 簡單的sql注入

實驗吧 WEB 簡單的sql注入

題目連結:http://www.shiyanbar.com/ctf/1875


題目提示:通過注入獲得flag值。

點開題目,又是一個簡潔的介面讓我一臉懵逼(0.0)


好吧,開始我們的注入之旅。

首先,隨便往框裡面輸入字元和數字,發現當輸入1、2、3的時候有查詢結果。

接下來進行注入的第一步測試,輸入一個帶單引號的資料,目的是測試是否對構造SQL的字串進行了過濾。當把帶有單引號的資料(如輸入 1')提交以後,我們得到了錯誤的返回。


這意味著我們這段“有害”的輸入是被直接作為SQL語句了。

得到這個結果後我們可以猜測可能後臺的程式碼是一個普通的select語句:

select name where id = 'content'
當然這只是個簡單的猜測,肯定還是會有很多的其他過濾,但這個結果也側面表現了我們可以通過開閉合單引號來進行我們的注入。

接下來我們進行第二步的過濾測試,關鍵字過濾。

我們將一些帶有SQL關鍵字的語句輸進去,發現有用的關鍵字幾乎都被過濾掉了。


輸入了大多數的關鍵字就剩下了delect和or,這個可怕(0.0)。

接下來就是空格過濾。

小編運氣也比較好,在之前的第一步字元測試中,小編記得當時隨手輸入了一次andone,自己喜歡的美國街球品牌,驚奇的發現這裡的and關鍵字並沒有被過濾.


那也就是說這裡的關鍵字過濾實際上是過濾後面帶有一個空格的關鍵字,仔細回憶剛剛我們的關鍵字過濾,最後的結果是“1 delect or”很短,也從而證明了過濾的關鍵字都是帶有後面一個空格且過濾的過程也將後面的空格一起過濾掉了。

實驗一下果真如此:


那麼我們只需要想辦法繞過這個關鍵字後面的空格過濾就能夠達到我們的注入目的。

繞過空格的方法有很多:+、%0a、%0b、/**/……這裡小編採用/**/的方式進行過濾。

我在看別人題解的時候還發現有人通過寫兩遍關鍵字兩遍空格的形式來進行過濾,比如寫“andand  ”這樣過濾掉其中的“and ”後剩下的剛剛好還能組成一個“and ”。這***也行,人才啊!(^O^)。

過濾問題暫時就告一段落,接下來我們要繞過這些過濾去注入得到我們想要的答案。

首先,我們得確定表名。

利用單引號的開閉性,我們可以這樣去確定資料庫名錶名欄位名這些查詢必須的東西了。

(1)資料庫名:

我們通過select database()來確定當前的資料庫名。

1' union/**/select/**/database()'
通過這句話我們能夠得到資料庫名為web1:


(2)表名:

在MySQL中有一張表information_schema,這張表儲存了MySQL伺服器中所有的資訊,如資料庫名,資料庫的表,表欄的資料型別與訪問許可權等。簡言之,這臺MySQL伺服器上,到底有哪些資料庫、各個資料庫有哪些表,每張表的欄位型別是什麼,各個資料庫要什麼許可權才能訪問,等等資訊都儲存在information_schema表裡面。

那麼接下來我們對這張表進行查詢來獲取我們已知的當前資料庫的表。

1' union/**/select/**/table_name from/**/information_schema.tables/**/where/**/table_schema/**/='web1
然而驚奇的發現,這句話竟然報錯了!!!???


沒道理啊,之前也測試過了關鍵字之類的過濾情況,難道出現了我們之前沒有測試過的關鍵字被過濾了?

觀察報錯資訊,資訊端只有=後面的資訊,難道是=前面的這個table_schema這個欄位被強制過濾了嗎?

測試一下,果然如此:


table_schema這個欄位被強制過濾了。

既然過濾關鍵字後面的空格的方法這裡不能用,那麼我們用之前說到的通過兩次關鍵字拼接的方法能不能搞定呢:

1' union/**/select/**/table_name from/**/information_scheminformation_schemaa.tables/**/where/**/table_schemtable_schemaa/**/='web1

可是道高一丈啊,這裡我們發現沒有訪問的許可權:


那麼接下來該怎麼辦呢,這裡小編的想法比較單純,我想的是,或許表的個數不會太多,那麼我們乾脆把全部得到,然後再一個一個去試就行了,但是結果有點讓我大跌眼鏡。




結果多的離譜,一個一個去試感覺還是略顯麻煩,不過現在小編也想不出什麼其他的好辦法了(T.T)。

不過在這一堆表名中有一個表名叫flag:


如果不出意外的話,這個應該就是我們的目標吧(純屬猜的2333)。

那麼接下來我們就需要去確定欄位名,確定欄位名一樣的思路:

1' union/**/select/**/column_namcolumn_namee/**/from/**/information_scheminformation_schema.columnsa.columns/**/where/**/table_name='flag
幸運的是,這次我們得到了它的欄位:


這兩個欄位中,很明顯我們的目標就是flag這個欄位了吧(小小的吐槽一句,這裡居然表名欄位名都是flag,真的很好奇那些題解裡寫猜測可得的……)。

得到這個之後加上之前的繞過空格關鍵字過濾的方法書寫一下內容得到答案:

1' union/**/select/**/flag from/**/flag where/**/'1'='1

這道題雖然寫的難度中,分值也只有10分,但是小編做這題從查閱SQL語法,到學習SQL注入,到進行實戰花了3天時間,當然因為很多人的題解寫的又短又莫名其妙,中間還不乏一些完全沒思路的猜測和沒原理的結論,對小編起到了一些反面作用,不知道大家有沒有這樣的感受(發自內心的鄙視那些通過猜測幾句話得出結論的人)。因此小編全方位詳細的分析了整道題,這篇部落格小編也寫了一下午+一晚上,希望對大家有幫助(0.0)。

-

-

-

另外,慶祝小編CSDN部落格排名進入前10000名!謝謝大家的支援,我會繼續努力的(^O^)。