Sqli-labs之sql注入基礎知識


(1)注入的分類

基於從服務器接收到的響應 

▲基於錯誤的SQL注入

▲聯合查詢的類型

▲堆查詢注射

▲SQL盲注

•基於布爾SQL盲注

•基於時間的SQL盲注

•基於報錯的SQL盲注

基於如何處理輸入的SQL查詢(數據類型) 

•基於字符串

•數字或整數為基礎的

基於程度和順序的注入(哪里發生了影響)

★一階注射

★二階注射

一階注射是指輸入的注射語句對WEB直接產生了影響,出現了結果;二階注入類似存儲型XSS,是指輸入提交的語句,無法直接對WEB應用程序產生影響,通過其它的輔助間接的對WEB產生危害,這樣的就被稱為是二階注入.
基於注入點的位置上的 

▲通過用戶輸入的表單域的注射。

▲通過cookie注射。

▲通過服務器變量注射。 (基於頭部信息的注射)

url編碼:一般的url編碼其實就是那個字符的ASCII值得十六進制,再在前面加個%

具體可以看http://www.w3school.com.cn/tags/html_ref_urlencode.html,這里可以查到每個字符的url編碼,當然自己編程或者用該語言應該也有自帶的函數,去實現url編碼

常用的寫出來吧: 空格是%20,單引號是%27, 井號是%23,雙引號是%22

判斷sql注入(顯錯和基於錯誤的盲注):單引號,and 1=1  和and 1=2,雙引號,反斜杠,注釋等

判斷基於時間的盲注:在上面的基礎上,加個sleep函數 ,如sleep(5) (函數不同數據庫有所不同)例子:   ' and sleep(5)    " and sleep(5)

 

(2)系統函數

常用函數:
1. version()——MySQL版本
2. user()——數據庫用戶名
3. database()——數據庫名
4. @@datadir——數據庫路徑
5. @@version_compile_os——操作系統版本

(3) 字符串連接函數

函數具體介紹: http://www.cnblogs.com/lcamry/p/5715634.html

  1. concat(str1,str2,...)——沒有分隔符地連接字符串
  2. concat_ws(separator,str1,str2,...)——含有分隔符地連接字符串
  3. group_concat(str1,str2,...)——連接一個組的所有字符串,並以逗號分隔每一條數據

(4) 一般用於嘗試的語句

Ps:--+可以用#替換,url提交過程中Url編碼后的#為%23

or 1=1--+

'or 1=1--+

"or 1=1--+

)or 1=1--+

')or 1=1--+

") or 1=1--+

"))or 1=1--+

一般的代碼為:

id=_GET['id'];

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

此處考慮兩個點,一個是閉合前面你的 ' 另一個是處理后面的 ' ,一般采用兩種思路,閉合后面的引號或者注釋掉,注釋掉采用--+ 或者 #(%23)

(5) union操作符的介紹

UNION 操作符用於合並兩個或多個 SELECT 語句的結果集。請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。

SQL UNION 語法

 

SELECT column_name(s) FROM table_name1

UNION

SELECT column_name(s) FROM table_name2

注釋:默認地,UNION 操作符選取不同的值。如果允許重復的值,請使用 UNION ALL。

SQL UNION ALL 語法

SELECT column_name(s) FROM table_name1

UNION ALL

SELECT column_name(s) FROM table_name2

另外,UNION 結果集中的列名總是等於 UNION 中第一個 SELECT 語句中的列名。

(6)sql中的邏輯運算

提出一個問題Select * from users where id=1 and 1=1; 這條語句為什么能夠選擇出id=1的內容,and 1=1到底起作用了沒有?這里就要清楚sql語句執行順序了。

同時這個問題我們在使用萬能密碼的時候會用到。

Select * from admin where username='admin' and password='admin'

我們可以用 'or 1=1# 作為密碼輸入。原因是為什么?

這里涉及到一個邏輯運算,當使用上述所謂的萬能密碼后,構成的sql語句為:

Select * from admin where username='admin' and password=''or 1=1#'

Explain:上面的這個語句執行后,我們在不知道密碼的情況下就登錄到了admin用戶了。

原因是在where子句后,我們可以看到三個條件語句 username='admin' and password=''or 1=1三個條件用and和or進行連接。在sql中,我們and的運算優先級大於or的元算優先級。因此可以看到 第一個條件(用a表示)是真的,第二個條件(用b表示)是假的,a and b = false,第一個條件和第二個條件執行and后是假,再與第三個條件or運算,因為第三個條件1=1是恆成立的,所以結果自然就為真了。因此上述的語句就是恆真了。 

①Select * from users where id=1 and 1=1;

②Select * from users where id=1 && 1=1;

③Select * from users where id=1 & 1=1;

上述三者有什么區別?①和②是一樣的,表達的意思是 id=1條件和1=1條件進行與運算。

③的意思是id=1條件與1進行&位操作,id=1被當作true,與1進行 & 運算 結果還是1,再進行=操作,1=1,還是1(ps:&的優先級大於=)

Ps:此處進行的位運算。我們可以將數轉換為二進制再進行與、或、非、異或等運算。必要的時候可以利用該方法進行注入結果。例如將某一字符轉換為ascii碼后,可以分別與1,2,4,8,16,32.。。。進行與運算,可以得到每一位的值,拼接起來就是ascii碼值。再從ascii值反推回字符。(運用較少)

(7)注入流程

 

 

我們的數據庫存儲的數據按照上圖的形式,一個數據庫當中有很多的數據表,數據表當中有很多的列,每一列當中存儲着數據。我們注入的過程就是先拿到數據庫名,在獲取到當前數據庫名下的數據表,再獲取當前數據表下的列,最后獲取數據。

現在做一些mysql的基本操作。啟動mysql,然后通過查詢檢查下數據庫:

   show databases;

 

這個實驗用到的數據庫名為security,所以我們選擇security來執行命令。

   use security;

我們可以查看下這個數據庫中有哪些表

   show tables;

 

現在我們可以看到這里有四張表,然后我們來看下這張表的結構。

   desc emails;

 

在繼續進行前台攻擊時,我們想討論下系統數據庫,即information_schema。所以我們使用它

   use information_schema;

 

讓我們來看下表格。

   show tables;

 

現在我們先來查看表的結構:

    desc tables;

 

現在我們來使用這個查詢:

 select table_name from information_schema.tables where table_schema = "security";

 

使用這個查詢,我們可以下載到表名。

Mysql有一個系統數據庫information_schema,存儲着所有的數據庫的相關信息,一般的,我們利用該表可以進行一次完整的注入。以下為一般的流程。

猜數據庫

select schema_name from information_schema.schemata

 

猜某庫的數據表

select table_name from information_schema.tables where table_schema='xxxxx'

猜某表的所有列

Select column_name from information_schema.columns where table_name='xxxxx'

獲取某列的內容

Select *** from ****

上述知識參考用例:less1-less4

-----------------------------------------------------------------------------------------------------------------------------------

附錄:

環境搭建:

1.從https://github.com/Audi-1/sqli-labs下載源代碼。
2.將源代碼復制到Apache webroot文件夾(htddocs,/var/www)。這里是用phpstudt搭建的環境,將其拷貝到D:\phpStudy\WWW目錄下

3.打開sql-connections文件夾下的“db-creds.inc”文件
4.修改MySQL用戶名和密碼為你自己的。這里我本地mysql的數據庫用戶名和密碼為root/root,因此將其db-ceds.inc的password改為root

5.打開瀏覽器,通過localhost的index.html訪問文件夾。
6.點擊setup/resetDB鏈接在你的mysql中創造數據庫

 

注:

如果有興趣也可以通過視頻進行學習,其下載地址為:

http://pan.baidu.com/s/1bo7PMaV

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM