sqlmap --os-shell執行原理
對於mysql數據庫來說,--os-shell的本質就是寫入兩個shell文件,其中的一個可以讓我們用來執行命令,而另外一個,如果在網站訪問的話,可以讓我們可以上傳文件。
說到寫入shell,就要說一下兩個限制條件,首先,我們需要知道上傳文件的兩個限制條件,首先我們要知道網站的絕對路徑(我們的shell寫入到哪里),然后要有導入導出的權限。
導入導出的權限在mysql數據庫中是由secure_file_priv參數來控制的,當這個參數后面為null時,表示不允許導入導出,如果為具體文件夾時,表示僅允許在這個文件夾下導入導出,如果后面沒有值(為空)時,表示可以在任何文件夾下導入導出。
當mysql 5.7版本以上的時候,secure_file_priv參數的值默認為null,也就是說,如果管理員沒有修改過這個參數后面的數值的話,我們沒辦法在5.7以上版本使用--os-shell。
過程演示
(本次實驗環境是本機上搭建的sqli-libs,目的為了研究--os-shell的原理,所以假設我們已知網站絕對路徑)
首先,我們先打開sqli-labs,找一個頁面添加參數,然后放置到sqlmap中,測試是否為dba權限。
可以看到,我們擁有dba的權限,接下來就可以使用--os-shell了。
這里需要關注一下紅框框起來的地方,在一般正常滲透測試情況下,可能在成功執行--os-shell之后,不會給出這個提示信息,我們將這句話翻譯一下。
可以看到,在我們成功執行了--os-shell之后,sqlmap對目標服務器寫入了兩個文件,一個是tmpugjwq.php,一個是tmpbvjfi.php,首先,這兩個里面肯定有一個文件的目的是為了讓我們能夠執行系統命令,另外一個文件的目的是什么,我們可以直接在網頁上訪問一下。
假設第二個文件是讓我們執行命令的文件。
假設是成立的,第一個文件的目的是給我們寫了一個文件上傳的頁面,讓我們可以通過這個頁面上傳腳本文件。
然后,我們可以去網站根目錄看一下這兩個文件里面的內容
tmpbvjfi.php
在開始看到這個文件的時候,我以為這是個一句話木馬,嘗試以cmd為密碼使用蟻劍進行連接,但是最后發現無法成功連接,隨后嘗試在url里面往cmd傳參,發現該文件給我們返回了一個cmdshell,我們可以直接通過該文件在網站url里面執行系統命令。
tmpugjwq.php
這個腳本是寫了一個文件上傳的頁面,那我們嘗試往網站上上傳一個phpinfo,看能否成功執行。
上傳成功,嘗試訪問。
文件執行成功。
總結
從剛才的實驗結果來看,sqlmap的--os-shell在mysql數據庫中的原理,其實就是往服務器上寫入了兩個shell,其中一個給我們提供了一個文件上傳的頁面,可以通過這個上傳頁面上傳腳本文件到當前目錄下,另外一個則是返回了一個可以讓我們執行系統命令的命令行,命令行也可以在網頁url中通過對cmd參數傳參執行系統命令。