欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Web網(wǎng)絡(luò)安全漏洞分析SQL注入原理詳解

 更新時間:2021年11月03日 14:04:59   作者:Phanton03167  
這篇文章主要為大家介紹了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)文章

最新評論