在Web
表單遞交,輸入域名或頁面請求的查詢字符串中插入SQL
命令,從而欺騙服務器執行惡意的SQL
命令
SQL
是一種ANSI
的標準計算機語言
除SQL
標準外,大部分SQL
數據庫程序都有自己的私有擴展
RDBMS
(關係型數據庫管理系統)是SQL
的基礎,也是所有現代數據庫系統的基礎
MySQL
注入基本流程
- 判斷
sql
注入 - 數據庫權限判斷
- 判斷字段數
- 查詢庫名
- 查表名
- 查字段
- 查數據
判斷sql
注入
- 提交單引號
'
:判斷是否爲字符型 - 加法和減法:區別是數字型還是字符型的注入.
- 判斷搜索型注入的方法:
keywords% 'and 1=1 and '%'='
和keywords% 'and 1=2 and '%'='
數據庫權限判斷
and ord(mid(user(),1,1))=114
判斷ROOT
權限
and (select count(*) from mysql.user)>0
判斷讀寫權限
判斷字段數
UNION SELECT
,order by
大部分程序只會調用數據庫查詢的第一條數據就返回,而UNION SELECT
的數據在第二條數據
兩種方法,第一種是讓第一條數據返回假,第二種是使用limit
查詢庫名
and ord(mid(version(),1,1))>51
,確認數據庫版本
使用mysql
自帶函數database()
查詢得到數據庫名
得到所有的數據庫名schema_name
查表名
MySQL
中,表名在information_schema
數據庫下tables
表table_name
字段,對應庫名table_schema
字符型可以使用'+and+(select+count(*)+from+表名)>0+and+''='
猜解
搜索型%'and(select count(*)from admin)>0 and '%'='
查字段
MySQL
中,字段名存放在information_schema
數據庫下columns
表column_name
字段
查數據
用前面獲得的信息即可
常見的SQL
注入
- 數字型
- 字符型
- 搜索型(
POST/GET
) - 堆疊注入
數字型
$sql = "SELECT * FROM sqltest WHERE id=$id";
字符型
字符型SQL
注入的關鍵:單引號的閉合
MySQL
數據庫對於單引號的規則:
1. 單引號必須成對出現,否則數據庫就會報錯.
2. 如果兩個單引號之間內容爲空,數據庫自動忽略.
字符型注入與數字型注入的區別
數字型:SELECT
列 FROM
表 WHERE
數字型列=值
字符型:SELECT
列 FROM
表 WHERE
字符型列=’值’
$sql="select * from user where username = '$name'";
搜索型
分爲POST/GET
,GET
型一般用在網站的搜索,POST
則用在用戶名的登錄,從form
表單的method="get"
屬性區分.又稱爲文本框注入.
GET
$sql="select * from user where password like '%$pwd%' order by password";
POST
類似字符型,中間用and
連接
堆疊注入
原理:SQL
中,分號;
是用來表示語句的結束.在;
結束一條sql
語句後繼續下一條語句.這就是堆疊注入.但使用有侷限性