逆向路由器固件之SQL注入:web應(yīng)用上的漏洞
在前面的內(nèi)容中,我們使用TEW-654TR路由器的tftp服務(wù)實現(xiàn)了獲取目標(biāo)的管理權(quán)限。但是要是tftp沒有開放到外網(wǎng)怎么辦?另尋他徑:在這一篇中會我們來分析一個web應(yīng)用上的漏洞。
初步分析
使用代理軟件抓登錄時候的數(shù)據(jù)包,可以看到發(fā)送的http請求如上圖所示。數(shù)據(jù)發(fā)送給了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
通過抓包知道用戶在登錄頁面輸入的兩個參數(shù)分別是’user_name’和’user_pwd’,那么我們在CGI腳本中搜索這兩個字符串看看。
有幾行字符串看起來是SQL查詢的語句,尤其是:
select level from user where user_name='%s' and user_pwd='%s'
看起來應(yīng)該是根據(jù)用戶名和密碼去數(shù)據(jù)庫查詢,看密碼是否正確。上一篇文章的分析我們可以知道,這個路由器是使用SQLite做數(shù)據(jù)庫存儲密碼的。
使用IDA載入my_cgi.cgi。查詢”select level from user where user_name“字符串,可以定位到do_login函數(shù)。
假設(shè)&猜想
用戶提交的用戶名和密碼大概是傳遞給sprintf函數(shù)生成SQL語句。存儲在sql變量中,***進(jìn)入exec_sql函數(shù)??雌饋磉@個過程沒有對數(shù)據(jù)進(jìn)行轉(zhuǎn)義。除非數(shù)據(jù)在進(jìn)入do_login函數(shù)之前或者在exec_sql中有做轉(zhuǎn)義,不然很可能存在SQL注入的漏洞。如果我們的假設(shè)是正確的,數(shù)據(jù)沒有經(jīng)過處理進(jìn)入了SQL語句中,那么我們可以使用最傳統(tǒng)的***密碼來繞過登錄驗證:
' or '1'='1
***執(zhí)行的sql就會變成
select level from user where user_name='admin' and user_pwd='' or '1'='1'
這樣查詢語句就會返回成功的結(jié)果。
驗證猜想
我們實驗一下:
果然跟我們預(yù)期的一樣。這里需要注意的是能夠以管理員身份登陸是需要一定運氣的。我們構(gòu)造的SQL語句where條件是or 1=1所以會返回所有的數(shù)據(jù)。恰好管理員的記錄是***條所以以管理員的身份登陸了。如果***條是一個普通用戶的數(shù)據(jù),那么就會以普通用戶的身份登陸了。為了確保一定以管理員身份登陸,可以構(gòu)造如下語句:
' or level = (select level from user order by level desc limit 1)/*
上面這個語句可以確保***查詢出來的數(shù)據(jù)室level***的用戶的數(shù)據(jù)。
這次我們終于看到了逆向分析的冰山一角。下一篇將會討論使用Qemu虛擬機(jī)運行路由器固件,動態(tài)調(diào)試相關(guān)的內(nèi)容。