sql注入的原理和分類:
sql注入就是指web應用程式對使用者輸入資料的合法性沒有判斷,前端傳入後端的引數是攻擊者可控的,並且引數帶入資料庫查詢。攻擊者可以構造不同的sql語句來實現對資料庫的操作。
sql注入按照請求方式分類可以分為字元型注入、數字型注入和搜尋型注入,按照提交方式分類可以分為get型注入、post型注入、cookie型注入和http請求頭注入,按照執行效果分類可以分為大致分為聯合查詢注入、報錯型注入、盲注(bool、時間)、堆查詢注入……
一次完整的sql查詢過程應該為:1、使用者向前端輸入引數。2、前端按照使用者提交的引數對資料庫中的資料進行查詢。3、資料庫返回查詢結果。4、後台資料處理給前端,返回給使用者。
注入點的判斷:
假如乙個sql查詢語句為: $query = "select * from users where id = $_get['id']";
正常使用者提交的資料應該為id=1,但是攻擊者提交的引數將構造成新的sql語句。
當傳入的引數為id=1'時,資料庫執行的**如下所示:
select * from users where id = 1' 這時候的語句不符合資料庫的語法規範,所以返回給使用者的資訊是報錯。
當傳入的引數為id=1 and 1=1時,資料庫執行的**如下:
select * from users where id = 1 and 1=1 因為id=1為真且1=1為真,所以頁面返回的結果與id=1返回的結果是相同的。
攻擊者根據上面的返回結果已經知道了**中存在sql注入,接下來將進一步拼接sql語句連線資料庫,爆出自己想要的資料。
sql注入之前首先需要知道的知識點:
mysql中的幾種注釋:
1、"#"(url編碼為%23)
2、"--"(--後面要跟上乙個或多個空格,在url中常使用"--+"來當做注釋使用)
3、"/*……*/"(在繞過waf等**的安全機制時,常使用/**/來代替空格)
4、"/*!……*/"(內斂注釋,其注釋的內容將會被執行)
注:"#"在url中會被認為是錨點,想要使用需要進行編碼。
"+"在url中會被認為是空格
sql注入中經常使用的函式:
user():當前連線資料庫的使用者。
database():當前連線的資料庫名稱
version():當前資料庫的版本資訊
@@datadir:資料庫檔案存放的目錄
.@@version_compile_os:當前使用的作業系統
連線字串的函式:
concat(str1,str2……):沒有分隔符的連線字串。
concat_ws(separator,str1,str2……):該函式第乙個引數是其他引數的分隔符,分隔符在連線字串之間加入。
group_concat(str1,str2……):將多行查詢的結果以逗號為分隔符連線成為一行結果。
information_schema庫:
在mysql5.0版本之後,mysql預設在資料庫中存放乙個名為「information_schema」的資料庫,在這個資料庫中我們需要記住三個表:schemata、tables、colunmns。
schemata表儲存該使用者建立的所有資料庫的庫名,該表中記錄資料庫的欄位名為schemata_name。
查詢所有資料庫名:select schema_name from information_scema.schemata
tables表中儲存該使用者建立的所有資料庫的庫名和表名,該表中記錄資料庫名的欄位名為table_schema,記錄表名的欄位名為table_name。
查詢指定資料庫(test)中所有的表名:select table_name from infromation_shema.tables where table_schema='test'
columns表中儲存該使用者建立的所有資料庫的庫名、表名和欄位名,該表中記錄資料庫名的欄位名為table_schema,記錄表名的欄位名為table_name,記錄欄位名的欄位名為column_name。
查詢指定資料庫(test)中指定資料表(admin)的所有欄位名:select column_name from information_schemata.columns where table_schema='test' and table_name='admin
sql注入基礎
mysqli 轉義字串函式 mysqli real escape string db,string mysqli 預編譯 拼裝sql語句 把要進行的操作的sql語句提前寫好,把需要改變的元素變成佔位符 select id,username from user where user name and ...
SQL注入基礎
最為經典的單引號判斷法 在引數後面加上單引號,比如 abc.php?id 1 如果頁面返回錯誤,則存在 sql 注入。原因是無論字元型還是整型都會因為單引號個數不匹配而報錯。如果未報錯,不代表不存在 sql 注入,因為有可能頁面對單引號做了過濾,這時可以使用判斷語句進行注入。其實所有的型別都是根據資...
SQL注入基礎
為了堅持而堅持,是撐不了多久的。sql注入就是指web應用程式對使用者輸入資料的合法性沒有判斷,前端傳入後端的引數是攻擊者可控的,並且引數代入資料庫查詢,攻擊者通過把sql命令插入到web表單提交或輸入網域名稱或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的sql命令。sql注入漏洞的產生要滿足兩...