Web網(wǎng)絡(luò)安全漏洞分析SQL注入原理詳解
一、SQL注入的基礎(chǔ)
1.1 介紹SQL注入
SQL注入就是指Web應(yīng)用程序?qū)τ脩糨斎霐?shù)據(jù)的合法性沒(méi)有判斷,前端傳入后端的參數(shù)是攻擊者可控的,并且參數(shù)帶入數(shù)據(jù)庫(kù)查詢,攻擊者可以通過(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ù)查詢,所以非法用戶可以任意拼接SQL語(yǔ)句進(jìn)行攻擊。
當(dāng)然,SQL注入攻擊按照不同的分類方法可以分為很多種,如報(bào)錯(cuò)注入、盲注、Unicode注入等。
1.2 注入的原理
SQL注入漏洞的的產(chǎn)生需要滿足一下兩個(gè)條件。
參數(shù)用戶可控:前端傳給后端的參數(shù)內(nèi)容是用戶可以控制的。
參數(shù)帶入數(shù)據(jù)庫(kù)查詢:傳入的參數(shù)拼接到SQL語(yǔ)句,且?guī)霐?shù)據(jù)庫(kù)查詢。
 當(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)境中,泛式滿足上述兩個(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ǔ)該用戶創(chuàng)建的所有數(shù)據(jù)庫(kù)的庫(kù)名,我們需要記住表中記錄數(shù)據(jù)庫(kù)名的字段名為SCHEMA_NAME。

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

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

圖3 COLUMNS表
常用的MySQL查詢語(yǔ)句核函數(shù)如下所示。
MySQL查詢語(yǔ)句
在不知道任何條件時(shí),語(yǔ)句如下所示。
SELECT 要查詢的字段名FROM 庫(kù)名.表名
在知道一條已知條件時(shí),語(yǔ)句如下所示。
SELECT 要查詢的字段名 FROM 庫(kù)名.表名 WHERE 已知條件的字段名='已知條件的值'
在知道兩條已知條件時(shí),語(yǔ)句如下所示。
SELECT 要查詢的字段名 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查詢的結(jié)果分別如圖4和圖5所示,可以明顯地看出二者的區(qū)別。

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

圖5 使用limit時(shí)的查詢結(jié)果
需要記住的幾個(gè)函數(shù)
database():當(dāng)前網(wǎng)站使用的數(shù)據(jù)庫(kù)。
version():當(dāng)前MySQL的版本。
user():當(dāng)前MySQL的用戶。
注釋符
常見(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)文章
網(wǎng)絡(luò)安全滲透測(cè)試反序列化漏洞分析與復(fù)現(xiàn)工作
這篇文章主要為大家介紹了網(wǎng)絡(luò)安全滲透測(cè)試反序列化漏洞分析與復(fù)現(xiàn)的工作流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02
Web網(wǎng)絡(luò)安全分析SQL注入繞過(guò)技術(shù)原理
這篇文章主要為大家介紹了Web網(wǎng)絡(luò)安全分析SQL注入繞過(guò)技術(shù)原理的詳細(xì)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11
DDoS攻擊與CC攻擊網(wǎng)絡(luò)安全的兩大挑戰(zhàn)如何應(yīng)對(duì)防御
這篇文章主要為大家介紹了面對(duì)DDoS攻擊與CC攻擊網(wǎng)絡(luò)安全的兩大挑戰(zhàn)應(yīng)該如何應(yīng)對(duì),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2023-10-10
防御SQL注入攻擊時(shí)需要注意的一個(gè)問(wèn)題
SQL注入算是一個(gè)極為普通的問(wèn)題了,解決方案也多如牛毛,但是新的注入方式仍然層出不窮。2009-02-02
網(wǎng)絡(luò)安全流量分析工具蟻劍詳細(xì)介紹
蟻劍(AntSword)是一款開(kāi)源的跨平臺(tái)WebShell管理工具,它主要面向于合法授權(quán)的滲透測(cè)試安全人員以及進(jìn)行常規(guī)操作的網(wǎng)站管理員,蟻劍推崇模塊化的開(kāi)發(fā)思想,遵循開(kāi)源,就要開(kāi)得漂亮的原則,致力于為不同層次的人群提供最簡(jiǎn)單易懂、方便直接的代碼展示及其修改說(shuō)明2022-09-09

