Web網(wǎng)絡(luò)安全漏洞分析SQL注入原理詳解
一、SQL注入的基礎(chǔ)
1.1 介紹SQL注入
SQL注入就是指Web應(yīng)用程序?qū)τ脩?hù)輸入數(shù)據(jù)的合法性沒(méi)有判斷,前端傳入后端的參數(shù)是攻擊者可控的,并且參數(shù)帶入數(shù)據(jù)庫(kù)查詢(xún),攻擊者可以通過(guò)構(gòu)造不同的SQL語(yǔ)句來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的任意操作。
下面以PHP語(yǔ)句為例。
$query = "SELECT * FROM users WHERE id = $_GET['id']";
由于這里的參數(shù)ID可控,且?guī)霐?shù)據(jù)庫(kù)查詢(xún),所以非法用戶(hù)可以任意拼接SQL語(yǔ)句進(jìn)行攻擊。
當(dāng)然,SQL注入攻擊按照不同的分類(lèi)方法可以分為很多種,如報(bào)錯(cuò)注入、盲注、Unicode注入等。
1.2 注入的原理
SQL注入漏洞的的產(chǎn)生需要滿(mǎn)足一下兩個(gè)條件。
參數(shù)用戶(hù)可控:前端傳給后端的參數(shù)內(nèi)容是用戶(hù)可以控制的。
參數(shù)帶入數(shù)據(jù)庫(kù)查詢(xún):傳入的參數(shù)拼接到SQL語(yǔ)句,且?guī)霐?shù)據(jù)庫(kù)查詢(xún)。
 當(dāng)傳入的ID參數(shù)為1'時(shí),數(shù)據(jù)庫(kù)執(zhí)行的代碼如下所示。
select * from users where id = 1'
這不符合數(shù)據(jù)庫(kù)語(yǔ)法規(guī)范,所以會(huì)報(bào)錯(cuò)。當(dāng)傳入的ID參數(shù)為and 1=1時(shí),執(zhí)行的SQL語(yǔ)句如下所示。
select * from users where id = 1 and 1 = 1
因?yàn)?=1為真,且where語(yǔ)句中id=1也為真,所以頁(yè)面會(huì)返回與id=1相同的結(jié)果,當(dāng)傳入的ID參數(shù)為and 1=2時(shí),由于1=2不成立,所以返回假,頁(yè)面就會(huì)返回與id=1不同的結(jié)果。
由此可以初步判斷ID參數(shù)存在SQL注入漏洞,攻擊者可以進(jìn)一步拼接SQL語(yǔ)句進(jìn)行攻擊,致使數(shù)據(jù)庫(kù)信息泄露,甚至進(jìn)一步獲取服務(wù)器權(quán)限等。
在實(shí)際開(kāi)發(fā)環(huán)境中,泛式滿(mǎn)足上述兩個(gè)條件的參數(shù)皆可能存在SQL注入漏洞,因此開(kāi)發(fā)者需秉持“外部參數(shù)皆不可信的原則”進(jìn)行開(kāi)發(fā)。
1.3 與MySQL注入相關(guān)的知識(shí)
在MySQL 5.0版本之后,MySQL默認(rèn)在數(shù)據(jù)庫(kù)中存放一個(gè)“information_schema”的數(shù)據(jù)庫(kù),在該庫(kù)中,需要記住三個(gè)表名,分別是SCHEMATA、TABLES和COLUMNS。
SCHEMATA表存儲(chǔ)該用戶(hù)創(chuàng)建的所有數(shù)據(jù)庫(kù)的庫(kù)名,我們需要記住表中記錄數(shù)據(jù)庫(kù)名的字段名為SCHEMA_NAME。

圖1 SCHEMATA表
TABLES表存儲(chǔ)該用戶(hù)創(chuàng)建的所有數(shù)據(jù)庫(kù)的庫(kù)名和表名,我們需要記住該表中記錄數(shù)據(jù)庫(kù)庫(kù)名和表名的字段分別為T(mén)ABLE_SCHEMA和TABLE_NAME。

圖2 TABLES表
COLUMNS表存儲(chǔ)改用戶(hù)創(chuàng)建的所有數(shù)據(jù)庫(kù)的庫(kù)名、表名和字段名,我們需要記住該表中記錄數(shù)據(jù)庫(kù)庫(kù)名、表名和字段名的字段名分別為T(mén)ABLE_SCHEMA、TABLE_NAME和COLUMN_NAME。

圖3 COLUMNS表
常用的MySQL查詢(xún)語(yǔ)句核函數(shù)如下所示。
MySQL查詢(xún)語(yǔ)句
在不知道任何條件時(shí),語(yǔ)句如下所示。
SELECT 要查詢(xún)的字段名FROM 庫(kù)名.表名
在知道一條已知條件時(shí),語(yǔ)句如下所示。
SELECT 要查詢(xún)的字段名 FROM 庫(kù)名.表名 WHERE 已知條件的字段名='已知條件的值'
在知道兩條已知條件時(shí),語(yǔ)句如下所示。
SELECT 要查詢(xún)的字段名 FROM 庫(kù)名.表名 WHERE 已知條件1的字段名='已知條件1的值' AND 已知條件2的字段名='已知條件2的值'
limit的用法
limit的使用格式為limit m,n,其中m是指記錄開(kāi)始的位置,從0開(kāi)始,表示第一條記錄;n是指取n條記錄。例如limit 0,1表示從第一條記錄開(kāi)始,取一條記錄,不使用limit和使用limit查詢(xún)的結(jié)果分別如圖4和圖5所示,可以明顯地看出二者的區(qū)別。

圖4 不使用limit時(shí)的查詢(xún)結(jié)果

圖5 使用limit時(shí)的查詢(xún)結(jié)果
需要記住的幾個(gè)函數(shù)
database():當(dāng)前網(wǎng)站使用的數(shù)據(jù)庫(kù)。
version():當(dāng)前MySQL的版本。
user():當(dāng)前MySQL的用戶(hù)。
注釋符
常見(jiàn)注釋的表達(dá)方式;#或–空格或/**/。
內(nèi)聯(lián)注釋
內(nèi)聯(lián)注釋的形式:/*!code*/。內(nèi)聯(lián)注釋可以用于整個(gè)SQL語(yǔ)句中,用來(lái)執(zhí)行我們的SQL語(yǔ)句,如下面的例子。
index.php?id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3
以上就是Web網(wǎng)絡(luò)安全漏洞分析SQL注入原理詳解的詳細(xì)內(nèi)容,更多關(guān)于Web安全漏洞SQL注入的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Web網(wǎng)絡(luò)安全分析堆疊查詢(xún)注入攻擊原理
這篇文章主要為大家介紹了Web網(wǎng)絡(luò)安全分析堆疊查詢(xún)注入攻擊的原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
常見(jiàn)的反爬蟲(chóng)urllib技術(shù)分享
這篇文章主要介紹了常見(jiàn)的反爬蟲(chóng)urllib技術(shù)分享,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
Web網(wǎng)絡(luò)安全分析XFF注入攻擊原理詳解
這篇文章主要為大家介紹了Web網(wǎng)絡(luò)安全分析XFF注入攻擊原理的詳解,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11
網(wǎng)絡(luò)安全中流量加密實(shí)現(xiàn)工具冰蝎4.0介紹
冰蝎是一個(gè)動(dòng)態(tài)二進(jìn)制加密網(wǎng)站管理客戶(hù)端。在實(shí)戰(zhàn)中,第一代webshell管理工具"菜刀"的流量特征非常明顯,很容易就被安全設(shè)備檢測(cè)到。基于流量加密的webshell變得越來(lái)越多,"冰蝎"在此應(yīng)運(yùn)而生2022-09-09
無(wú)線網(wǎng)攻擊工具進(jìn)攻方法及防范技巧小結(jié)
對(duì)無(wú)線網(wǎng)安全攻防有興趣的人應(yīng)該都需要一套工具,英特網(wǎng)上有很多免費(fèi)的工具。本文不求全面,但求能提供一些指導(dǎo)和建議。2008-02-02
防止絕大部份網(wǎng)頁(yè)病毒的經(jīng)典方法
防止絕大部份網(wǎng)頁(yè)病毒的經(jīng)典方法...2007-02-02

