簡介
SQL 注入是一種專門針對SQL語句的攻擊方式。通過把SQL命令插入到web表單提交、輸入域名或者頁面請求的查詢字符串中,利用現有的程序,來非法獲取后台的數據庫中的信息。在web的測試中涉及到的會比較多些。
注入原理
存在注入的原因是后台在編寫程序時,沒有對用戶輸入的數據做過濾。 例:
1、用戶在某個輸入框提交的參數是123。
瀏覽器提交的URL為: http://www.xxx.com/index.php?id=123
服務器后台執行SQL語句:select * from table1 where id = 123
此時是沒有任何影響的。
2、 如果用戶提交的參數是 123;drop table
服務器后台執行SQL語句: select * from table1 where id =123 ; drop table
相當於后台執行了兩條SQL語句,查表,並且把table刪除, 從而導致了SQL注入
檢測注入的方法
目前主要有兩種檢測方式:
一、手工注入檢測流程:
1. 判斷是否存在注入點
www.abc.com/index.php?id=2
www.abc.com/index.php?id=2 and 1=1
www.abc.com/index.php?id=2 and 1=2
第2條返回正常,
第1,3條返回不正常說明id參數存在注入漏洞
2. 判定是否存在admin表
www.abc.com/index.php?id=2 and exists(select * from admin)
返回正常,存在admin表
3. 猜admin表中的字段名
www.abc.com/index.php?id=2 and exists(select username from admin)
返回正常 表示admin表存在username字段
4. 檢測其他sql操作
二、工具檢測:
sqlmap: sqlmap是一個開源的滲透測試工具,可以用來進行自動化檢測,利用SQL注入漏洞,獲取數據庫服務器的權限。
1. 下載地址
https://github.com/sqlmapproject/sqlmap.git
2. 常用命令

測試
以一個sqlmap檢測URL為例:
1. 檢測過程:

2. 檢測結果:

可知該次注入檢測沒有成功。
防止sql注入代碼:(1)修改php.ini magic_quotes_gpc=Off,打開開關,不常用;
(2)獲取到參數后,調用$username = addslashes($username);
說明:string addslashes ( string $str ) 返回字符串,該字符串為了數據庫查詢語句等的需要在某些字符前加上了反斜線。這些字符是單引號(')、雙引號(")、反斜線(\)與 NUL( NULL 字符)。 舉例:用戶在name中輸入' or 1=1#,其中#是sql中的注釋,#會過濾sql中的where校驗等,而or 1=1恆真,就會造成返回所有用戶列表。
(3)mysql_escape_string();原理和(2)差不多;
總結:
登錄防sql注入的方法: 1、修改php.ini配置文件中magic_quotes_gpc=On (用單引號引用用戶輸入的數據)(不實用)
2、使用函數addSlashes() (在預定義字符之前添加反斜杠)
3、使用mysql_escape_string() (在SQL語句特殊字符前添加反斜杠)
拓展:
https://www.oschina.net/translate/sql-injection-walkthrought
