介紹
SQL注入即是指web應用程序對用戶輸入數據的合法性沒有判斷或過濾不嚴,攻擊者可以在web應用程序中事先定義好的查詢語句的結尾上添加額外的SQL語句,在管理員不知情的情況下實現非法操作,以此來實現欺騙數據庫服務器執行非授權的任意查詢,從而進一步得到相應的數據信息。(來自百度百科)
分類
按照提交方式分類
GET型注入、POST型注入、cookie注入、http頭注入
按照注入類型分類
數字型注入、字符型注入、搜索型注入
按照執行效果分類
布爾盲注、時間盲注、報錯注入、聯合查詢注入、堆疊注入、寬字節注入、base64注入
SQL注入常用函數
database():數據庫名
desc():結構
@@datadir:路徑
table():表名
columns():列名
limit():返回結果中的前幾條數據或者中間的數據
group_concat():分組拼接函數
rand():返回0~1的隨機數
floor():向下取整
substr():截取字符串
ascii():返回字符串的ascii碼
尋找SQL注入
SQL注入可以出現在任何從系統或用戶接收數據輸入的前端應用程序中,這些應用程序之后被用於訪問數據庫服務器。
如果對一個網站進行SQL注入攻擊,首先就需要找到存在SQL注入漏洞的地方,也就是尋找所謂的注入點。可能的SQL注入點一般存在於登陸頁面、查找頁面或添加頁面等用戶可以查找或修改數據的地方,簡單來說,頁面與數據庫交互的地方可能會存在SQL注入。
最常用的尋找SQL注入點的方法,是在網站中尋找如下形式的頁面鏈接
http://www.123.com/xxx.php?id=xx
其中‘xx’可能是數字,也可能是字符串,分別被稱為整數型數據或者字符型數據
SQL注入流程
1、判斷是否存在注入、注入類型
2、猜解字段數
3、確定顯示位
4、獲取庫名
5、獲取庫中的表名
6、獲取表中的字段名
7、下載數據
SQL注入繞過方式
1、繞過空格
尋找可以代替空格執行的特殊字符,比如:+,%20,/**/,%a0等
2、十六進制繞過
查詢條件為用戶名等於admin的信息,admin需要使用引號引起來,如果過濾到引號,where語句就會執行失敗。
可以將amdin替換成十六進制來執行
3、大小寫/復寫
復寫就是寫兩個,過濾掉一個后,確保還會留下來一個可以使用。
4、內聯注釋
把一些特有的僅在MYSQL上的語句放在 /*!...*/
中,這樣這些語句如果在其它數據庫中是不會被執行,但在MYSQL中會執行。
5、過濾or and xor not 繞過
and = &&
or = ||
xor = | # 異或
not = !
6、過濾等號
%like% 通配符
<> 等價於 !=
在前面在加一個!表示等於
未完待續~~~
SQL注入防御方式
預編譯防止SQL注入(參數化查詢)
也就是SQL引擎會預先進行語法分析,產生語法樹,生成執行計划,也就是說,后面你輸入的參數,無論你輸入的是什么,都不會影響該sql語句的 語法結構了,因為語法分析已經完成了,而語法分析主要是分析sql命令,比如 select ,from ,where ,and, or ,order by 等等。所以即使你后面輸入了這些sql命令,也不會被當成sql命令來執行了,因為這些sql命令的執行, 必須先的通過語法分析,生成執行計划,既然語法分析已經完成,已經預編譯過了,那么后面輸入的參數,是絕對不可能作為sql命令來執行的,只會被當做字符串字面值參數。所以sql語句預編譯可以防御sql注入。