Web網(wǎng)絡(luò)安全漏洞分析SQL注入原理詳解
一、SQL注入的基礎(chǔ)
1.1 介紹SQL注入
SQL注入就是指Web應(yīng)用程序?qū)τ脩糨斎霐?shù)據(jù)的合法性沒有判斷,前端傳入后端的參數(shù)是攻擊者可控的,并且參數(shù)帶入數(shù)據(jù)庫查詢,攻擊者可以通過構(gòu)造不同的SQL語句來實現(xiàn)對數(shù)據(jù)庫的任意操作。
下面以PHP語句為例。
$query = "SELECT * FROM users WHERE id = $_GET['id']";
由于這里的參數(shù)ID可控,且?guī)霐?shù)據(jù)庫查詢,所以非法用戶可以任意拼接SQL語句進行攻擊。
當(dāng)然,SQL注入攻擊按照不同的分類方法可以分為很多種,如報錯注入、盲注、Unicode注入等。
1.2 注入的原理
SQL注入漏洞的的產(chǎn)生需要滿足一下兩個條件。
參數(shù)用戶可控:前端傳給后端的參數(shù)內(nèi)容是用戶可以控制的。
參數(shù)帶入數(shù)據(jù)庫查詢:傳入的參數(shù)拼接到SQL語句,且?guī)霐?shù)據(jù)庫查詢。
 當(dāng)傳入的ID參數(shù)為1'時,數(shù)據(jù)庫執(zhí)行的代碼如下所示。
select * from users where id = 1'
這不符合數(shù)據(jù)庫語法規(guī)范,所以會報錯。當(dāng)傳入的ID參數(shù)為and 1=1時,執(zhí)行的SQL語句如下所示。
select * from users where id = 1 and 1 = 1
因為1=1為真,且where語句中id=1也為真,所以頁面會返回與id=1相同的結(jié)果,當(dāng)傳入的ID參數(shù)為and 1=2時,由于1=2不成立,所以返回假,頁面就會返回與id=1不同的結(jié)果。
由此可以初步判斷ID參數(shù)存在SQL注入漏洞,攻擊者可以進一步拼接SQL語句進行攻擊,致使數(shù)據(jù)庫信息泄露,甚至進一步獲取服務(wù)器權(quán)限等。
在實際開發(fā)環(huán)境中,泛式滿足上述兩個條件的參數(shù)皆可能存在SQL注入漏洞,因此開發(fā)者需秉持“外部參數(shù)皆不可信的原則”進行開發(fā)。
1.3 與MySQL注入相關(guān)的知識
在MySQL 5.0版本之后,MySQL默認在數(shù)據(jù)庫中存放一個“information_schema”的數(shù)據(jù)庫,在該庫中,需要記住三個表名,分別是SCHEMATA、TABLES和COLUMNS。
SCHEMATA表存儲該用戶創(chuàng)建的所有數(shù)據(jù)庫的庫名,我們需要記住表中記錄數(shù)據(jù)庫名的字段名為SCHEMA_NAME。
圖1 SCHEMATA表
TABLES表存儲該用戶創(chuàng)建的所有數(shù)據(jù)庫的庫名和表名,我們需要記住該表中記錄數(shù)據(jù)庫庫名和表名的字段分別為TABLE_SCHEMA和TABLE_NAME。
圖2 TABLES表
COLUMNS表存儲改用戶創(chuàng)建的所有數(shù)據(jù)庫的庫名、表名和字段名,我們需要記住該表中記錄數(shù)據(jù)庫庫名、表名和字段名的字段名分別為TABLE_SCHEMA、TABLE_NAME和COLUMN_NAME。
圖3 COLUMNS表
常用的MySQL查詢語句核函數(shù)如下所示。
MySQL查詢語句
在不知道任何條件時,語句如下所示。
SELECT 要查詢的字段名FROM 庫名.表名
在知道一條已知條件時,語句如下所示。
SELECT 要查詢的字段名 FROM 庫名.表名 WHERE 已知條件的字段名='已知條件的值'
在知道兩條已知條件時,語句如下所示。
SELECT 要查詢的字段名 FROM 庫名.表名 WHERE 已知條件1的字段名='已知條件1的值' AND 已知條件2的字段名='已知條件2的值'
limit的用法
limit的使用格式為limit m,n,其中m是指記錄開始的位置,從0開始,表示第一條記錄;n是指取n條記錄。例如limit 0,1表示從第一條記錄開始,取一條記錄,不使用limit和使用limit查詢的結(jié)果分別如圖4和圖5所示,可以明顯地看出二者的區(qū)別。
圖4 不使用limit時的查詢結(jié)果
圖5 使用limit時的查詢結(jié)果
需要記住的幾個函數(shù)
database()
:當(dāng)前網(wǎng)站使用的數(shù)據(jù)庫。
version()
:當(dāng)前MySQL的版本。
user()
:當(dāng)前MySQL的用戶。
注釋符
常見注釋的表達方式;#或–空格或/**/。
內(nèi)聯(lián)注釋
內(nèi)聯(lián)注釋的形式:/*!code*/。內(nèi)聯(lián)注釋可以用于整個SQL語句中,用來執(zhí)行我們的SQL語句,如下面的例子。
index.php?id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3
以上就是Web網(wǎng)絡(luò)安全漏洞分析SQL注入原理詳解的詳細內(nèi)容,更多關(guān)于Web安全漏洞SQL注入的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Web網(wǎng)絡(luò)安全分析堆疊查詢注入攻擊原理
這篇文章主要為大家介紹了Web網(wǎng)絡(luò)安全分析堆疊查詢注入攻擊的原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-11-11Web網(wǎng)絡(luò)安全分析XFF注入攻擊原理詳解
這篇文章主要為大家介紹了Web網(wǎng)絡(luò)安全分析XFF注入攻擊原理的詳解,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進步早日升職加薪2021-11-11網(wǎng)絡(luò)安全中流量加密實現(xiàn)工具冰蝎4.0介紹
冰蝎是一個動態(tài)二進制加密網(wǎng)站管理客戶端。在實戰(zhàn)中,第一代webshell管理工具"菜刀"的流量特征非常明顯,很容易就被安全設(shè)備檢測到?;诹髁考用艿膚ebshell變得越來越多,"冰蝎"在此應(yīng)運而生2022-09-09