因str_replace导致的注入问题总结(2)

  2014年的漏洞,cmseasy相关版本网上已经找不到了,我改写了个cmseasy,方便测试这个replace注入:

  cmseasy环境下载:链接: https://pan.baidu.com/s/1KgHaPxuB3UI36fyx4IbW9w 提取码: 7aj3

  存在问题的目录lib/plugins/pay/alipay.php

  第87行用了str_replace替换

替换后的内容赋值给了$order_sn

  往下看发现调用了check_money函数,跟踪下这个函数查看内部实现:

  uploads/lib/table/pay.php

  先是赋值然后调用了getrow函数,跟进去看看:

  uploads/lib/inc/table.php

  condition没有啥数据库操作后跟下面那个函数,跟踪下rec_select_one:

  还在table.php文件下:

  跟下sql_select函数:

被带入数据库查询:

  默认echo $sql;是被注释的,解除注释方便查看sql语句:

  因为str_replace的缘故,可以被绕过进行sql注入:

  去除注释符,构造poc:

  http://localhost/CmsEasy/uploads/index.php/?case=archive&act=respond&code=alipay&trade_status=WAIT_SELLER_SEND_GOODS

       POST:out_trade_no=11111%00'&subject=0

 sql语句报错存在sql注入


那么修复方案是什么呢?

  回到刚开始的alipay.php

第79行

  正则匹配下\'

    然后再次访问:

直接跳转了不再停留了。

修复方案:

function respond() {
  if (!empty($_POST)) {
   foreach($_POST as $key =>$data) {
    if(preg_match('/(=|<|>|\')/', $data)){
     return false;
    }
    $_GET[$key] = $data;
   }
  }

参考文章:https://wizardforcel.gitbooks.io/php-common-vulnerability/content/23.html

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对黑区网络的支持。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/5659.html