挖洞入門_union型SQL注入

簡介:在漏洞盒子挖洞已經有一段時間了,雖然說還不是大佬,但技術也有所進步,安全行業就是這樣,只有本身動手去作,才能將理論的知識變爲我的的經驗。本篇文章打算分享一下我在挖union型SQL注入漏洞過程當中的一些我的理解,若有不足也請大佬不吝指教。前端

0x00:什麼是SQL注入

SQL注入,相信大多數人一開始接觸安全,據說的第一種漏洞類型就會是SQL注入,衆所周知,其本質就是將用戶輸入的數據當成了SQL語句來執行web

開發過網站的朋友應該都清楚,大多數的小型企業或我的的站點大都採用了LAMP結構,即Linux + Apache + MySQL + PHP,固然還有一些其它常見的技術以下表:sql

操做系統 Web服務器 數據庫 編程語言
Linux Apache MySQL PHP
Windows Server Nginx Oracle JSP
Tomcat SQL Server ASP
Python

總的來講,絕大多數網站都採用了動態Web開發技術,而動態Web開發離不開數據庫,若是沒有處理好這二者之間的關係,那麼SQL注入就會隨之而來了。數據庫

舉例來講,當咱們想要經過參數id來獲取相對應的新聞時,整個過程簡單來講就是用戶經過URL請求新聞-->後臺經過用戶請求去數據庫查詢相對應的新聞-->將查詢到的新聞回傳給用戶。在第二步查詢相對應的新聞時,後臺會執行SQL語句來查詢,就像SELECT * FROM news WHERE id=''id的值是用戶來控制的,當id=1時,就會返回id=1的新聞,id=2時返回id=2的新聞,以此類推,就能夠動態的控制web界面了。編程

這時,當用戶輸入的id值不正確時,後臺就沒法獲取相對應的新聞,前端就會沒有數據顯示,可當用戶輸入的數據爲1'; DROP TABLE news-- a時,恐怖的事情就發生了,數據庫中的news表被刪除了,這就說明這個參數存在SQL注入安全

回到剛纔用戶輸入的數據,拼接到後臺查詢數據時,整個SQL語句就變成了SELECT * FROM news WHERE id='1'; DROP TABLE news-- a',分析這條語句可知,用戶輸入的單引號閉合了id的值分號閉合了SELECT語句,而後又新建了一條DROP語句刪除了表news,最後的-- a註釋掉了id值後的那個單引號,SQL注入就這麼產生了。服務器

當一個站點存在SQL注入時用戶的輸入就能夠傳入數據庫執行,理論上這樣能夠得到數據庫的所有數據,也就是常說的脫庫了。得到數據的方法也多種多樣,能夠經過頁面直接返回想要查詢的數據,也能夠經過sleep延時函數猜想數據,都不行的話咱們還可使用DNS解析日誌來得到數據。其中,最簡單的一種方法就是union型的SQL注入了。網絡

union型SQL注入只是SQL注入的其中一種,也是最簡單的一種,對於這種漏洞的防範也特別簡單,可這種漏洞在互聯網中仍不可勝數...這也可見全國乃至全球對於網絡安全知識普及的不足,接下來,我會從三個方面來說講這種漏洞,分別是爲何會產生怎麼利用以及怎麼防範編程語言

0x01:爲何會產生union型SQL注入

union型SQL注入,看名字就能知道,使用這種方法能夠直接在頁面中返回咱們要查詢的數據,方法也很簡單,即便用UNION聯合查詢便可。函數

但使用UNION聯合查詢時還要知足一個條件,那就是咱們構造的SELECT語句的字段數要和當前表的字段數相同才能聯合查詢,即首先咱們要肯定當前表的字段數。order by x是數據庫中的一個排序語句,order by 1即經過第一個字段進行排序。這時咱們就能夠構造SELECT * FROM news WHERE id='1' order by x-- a'來猜想當前表的字段數,x值遞增,當頁面返回數據異常時,即無當前字段時,用當前的x值減一便可獲得當前表的字段數了。

知道了當前表的字段數,就能夠進行UNION聯合查詢了。但聯合查詢時,頁面只會顯示查詢到數據的第一條,也就是UNION前的SELECT語句的結果,想要顯示咱們本身聯合查詢的結果時,還必須使前一條語句失效,這裏咱們構造and 1=2使前一句SELECT語句失效。回到剛纔的案例,假設當前表的字段數爲3,咱們就能夠構造SELECT * FROM news WHERE id='1' and 1=2 UNION SELECT 1,2,3-- a'來查詢當前頁面的顯錯點了,經過下圖的案例可知,當前的顯錯點爲第一字段第三字段

這個顯錯點又是什麼意思呢?好比當前表中共有三個字段,一個是標題(title)、一個是時間(time)、一個是內容(data),而咱們前端不須要顯示時間,只須要展現標題和內容便可。那麼從數據庫得到的數據中,也只有標題字段和內容字段會展現在頁面上,這兩個點就是顯錯點

經過這裏的顯錯點,用戶就能夠得到數據庫中的全部數據了。當用戶輸入的數據爲1' and 1=2 UNION SELECT 1,2,database()-- a時,即SQL語句爲SELECT * FROM news WHERE id='1' and 1=2 UNION SELECT 1,2,database()-- a'時,就能夠直接獲得數據庫的庫名

0x02:怎麼利用union型SQL注入

1.判斷是否存在注入

構造and 1=1/and 1=2查看頁面是否有異常,如有異常,即有可能存在注入,另外還可經過該語句判斷該站點是否有WAF,如有WAF的話會有攔截警告,固然,WAF也是能夠繞過的。。。

2.查詢當前表的字段數

構造order by x,當頁面返回異常時,利用x減一便可獲得當前表的字段數

3.查詢顯錯點

構造and 1=2 union select 1,2,3,若頁面顯示了咱們構造的1,2,3,則對應的字段即爲顯錯點

4.查詢數據庫庫名

構造and 1=2 union select 1,2,database(),便可在顯錯點顯示當前數據庫庫名


通常挖漏洞的話到此步驟就能夠提交了,切記千萬不可非法得到數據,挖洞有風險,同志需謹慎!


5.查詢數據庫中的表名

構造and 1=2 union select 1,2,table_name from information_schema.tables where table_schema=database() limit 0,1,便可在顯錯點顯示當前庫中的表名,由於顯錯點一次只能顯示一條數據,這時能夠經過limit語句選擇不一樣的表名進行查看。

6.查詢選擇表中的字段名

構造and 1=2 union select 1,2,column_name from information_schema.columns where table_schema=database() and table_name='XXX' limit 0,1,便可在顯錯點顯示字段名,這裏也是經過limit語句選擇不一樣的字段名進行查看。

7.查詢數據庫中的數據

構造and 1=2 union select 1,2,XXX from XXX limit 0,1,便可得到數據庫中的數據了。

0x03:怎麼防範union型SQL注入

針對union型SQL注入,咱們能夠對用戶輸入的數據進行一次篩查,設置黑名單,攔截注入經常使用的一些關鍵詞,好比andorder byunionselectfrom等。

除了設置黑名單外,還有一種比較靠譜的方法,即便用預編譯語句,而不是動態的生成SQL語句,這樣能夠有效的避免用戶輸入的數據鏈接到數據庫執行,就是實現起來比較複雜,須要設置大量的預編譯語句。

另外還有一種目前最靠譜的方法,實現起來還簡單,就是上硬件防火牆。。。就是有點小貴。

0x04:互聯網中的一些案例


依據網絡安全法,本文旨在分享我的學習經驗,內容禁止用於違法犯罪行爲!

相關文章
相關標籤/搜索