逆向路由器固件之SQL注入:web應用上的漏洞
在前面的內容中,我們使用TEW-654TR路由器的tftp服務實現了獲取目標的管理權限。但是要是tftp沒有開放到外網怎么辦?另尋他徑:在這一篇中會我們來分析一個web應用上的漏洞。
初步分析
使用代理軟件抓登錄時候的數據包,可以看到發送的http請求如上圖所示。數據發送給了my_cgi.cgi這個腳本。我們分析一下這個文件看看。
➜ rootfs git:(master) ✗ find . -name my_cgi.cgi ./usr/bin/my_cgi.cgi ➜ rootfs git:(master) ✗ file ./usr/bin/my_cgi.cgi ./usr/bin/my_cgi.cgi: ELF 32-bit LSB executable, MIPS, MIPS-II version 1 (SYSV), dynamically linked (uses shared libs), stripped
通過抓包知道用戶在登錄頁面輸入的兩個參數分別是’user_name’和’user_pwd’,那么我們在CGI腳本中搜索這兩個字符串看看。
有幾行字符串看起來是SQL查詢的語句,尤其是:
select level from user where user_name='%s' and user_pwd='%s'
看起來應該是根據用戶名和密碼去數據庫查詢,看密碼是否正確。上一篇文章的分析我們可以知道,這個路由器是使用SQLite做數據庫存儲密碼的。
使用IDA載入my_cgi.cgi。查詢”select level from user where user_name“字符串,可以定位到do_login函數。
假設&猜想
用戶提交的用戶名和密碼大概是傳遞給sprintf函數生成SQL語句。存儲在sql變量中,***進入exec_sql函數。看起來這個過程沒有對數據進行轉義。除非數據在進入do_login函數之前或者在exec_sql中有做轉義,不然很可能存在SQL注入的漏洞。如果我們的假設是正確的,數據沒有經過處理進入了SQL語句中,那么我們可以使用最傳統的***密碼來繞過登錄驗證:
' or '1'='1
***執行的sql就會變成
select level from user where user_name='admin' and user_pwd='' or '1'='1'
這樣查詢語句就會返回成功的結果。
驗證猜想
我們實驗一下:
果然跟我們預期的一樣。這里需要注意的是能夠以管理員身份登陸是需要一定運氣的。我們構造的SQL語句where條件是or 1=1所以會返回所有的數據。恰好管理員的記錄是***條所以以管理員的身份登陸了。如果***條是一個普通用戶的數據,那么就會以普通用戶的身份登陸了。為了確保一定以管理員身份登陸,可以構造如下語句:
' or level = (select level from user order by level desc limit 1)/*
上面這個語句可以確保***查詢出來的數據室level***的用戶的數據。
這次我們終于看到了逆向分析的冰山一角。下一篇將會討論使用Qemu虛擬機運行路由器固件,動態調試相關的內容。