SQL注入(SQL Injection)是一種常見的Web安全漏洞,攻擊者利用這個漏洞,可以訪問或修改數據,或者利用潛在的數據庫漏洞進行攻擊。
SQL注入基礎
漏洞原理
針對SQL注入的攻擊行為可描述為通過用戶可控參數中注入SQL語法,破壞原有SQL結構,達到編寫程序時意料之外結果的攻擊行為。其成因可以歸結外以下兩個原因疊加造成的:
1、程序編寫者在處理程序和數據庫交互時,使用字符串拼接的方式構造SQL語句。
2、未對用戶可控參數進行足夠的過濾便將參數內容拼接進入到SQL語句中。
注入點可能存在的位置
根據SQL 注入漏洞的原理,在用戶“可控參數”中注入SQL 語法,也就是說Web 應用在獲取用戶數據的地方,只要帶入數據庫查詢,都有存在SQL 注入的可能,這些地方通常包括:
@ GET 數據@ POST 數據@ HTTP 頭部(HTTP 請求報文其他字段)@ Cookie 數據 …
漏洞危害
攻擊者利用SQL注入漏洞,可以獲取數據庫中的多種信息(例如:管理員后臺密碼),從而脫取數據庫中內容(脫庫)。在特別情況下還可以修改數據庫內容或者插入內容到數據庫,如果數據庫權限分配存在問題,或者數據庫本身存在缺陷,那么攻擊者可以通過SQL注入漏洞直接獲取webshell或者服務器系統權限。
注入分類
SQL 注入漏洞根據不同的標準,有不同的分類。但是從數據類型分類來看,SQL 注入分為數字型和字符型。
數字型注入就是說注入點的數據,拼接到SQL 語句中是以數字型出現的,即數據兩邊沒有被單引號、雙引號包括。字符型注入正好相反。
根據注入手法分類,大致可分為以下幾個類別:
- UNION query SQL injection(可聯合查詢注入) 聯合查詢(查)
- Error-based SQL injection(報錯型注入) 報錯注入(查)
- Boolean-based blind SQL injection(布爾型注入) 布爾盲注(查)
- Time-based blind SQL injection(基于時間延遲注入) 延時注入(查)
- Stacked queries SQL injection(可多語句查詢注入) 堆疊查詢(增刪改)
MySQL相關
注釋 mysql 數據庫的注釋大概有以下幾種。
#
-- (杠杠空格)
/* ..... */
/*! .... */ 內聯查詢
mysql 元數據(庫名、表名、字段名)庫數據庫information_schema
information_schema (存了庫名、表名、字段名) 一個數據庫
tables (存了所有的表名) 一個表
table_name (存了所有的表名) 一個字段
table_schema (表名所屬的數據庫) 一個字段
columns (存了所有字段的名字) 一個表
column_name (存了所有的字段名) 一個字段
table_name (字段所屬的表名) 一個字段
table_schema (字段所屬的數據庫名) 一個字段
MYSQL 常用函數與參數
=|>|>=|<=|<> 比較運算符【select 1<>2】
and|or 邏輯運算符【select true and false】
version() mysql 數據庫版本【select version()】
database() 當前數據庫名【select database()】
user() 用戶名
current_user() 當前用戶名
system_user() 系統用戶名
@@datadir 數據庫路徑
@@versoin_compile_os 操作系統版本
length() 返回字符串的長度【select length('123456')】
substring() 截取字符串
substr()
mid() 這三個函數都有以下3個參數【select substr(database(),1,1)】
1、截取的字符串2、截取起始位置,從1開始計數3、截取長度,為1
left() 從左側開始取指定字符個數的字符串【select left('123456'),3】從左取3個
concat() 沒有分隔符的連接字符串【select concat('a','b','c')】
concat_ws() 含有分割符的連接字符串【select concat_ws('-','a','b','c')】第一個參數是分隔符
group_conat() 連接一個組的字符串
ord() 返回ASCII 碼【select ord(a)】
ascii() 返回ASCII 碼【select ascii(a)】
hex() 將字符串轉換為十六進制
unhex() hex 的反向操作
md5() 返回MD5 值
floor(x) 返回不大于x 的最大整數
round() 返回參數x 接近的整數
rand() 返回0-1 之間的隨機浮點數
load_file() 讀取文件,并返回文件內容作為一個字符串
sleep() 睡眠時間為指定的秒數
if(true,t,f) if 判斷【select if (true,1,2)】
find_in_set() 返回字符串在字符串列表中的位置
benchmark() 指定語句執行的次數
name_const() 返回表作為結果