phpcms9.6 注入分析

漏洞促发点\phpcms\modules\content\down.php

  1. $a_k = trim($_GET['a_k']);
  2. if(!isset($a_k)) showmessage(L('illegal_parameters'));
  3. $a_k = sys_auth($a_k, 'DECODE', pc_base::load_config('system','auth_key'));
  4. if(empty($a_k)) showmessage(L('illegal_parameters'));
  5. unset($i,$m,$f);
  6. parse_str($a_k);
  7. if(isset($i)) $i = $id = intval($i);
  8. if(!isset($m)) showmessage(L('illegal_parameters'));
  9. if(!isset($modelid)||!isset($catid)) showmessage(L('illegal_parameters'));
  10. if(empty($f)) showmessage(L('url_invalid'));
  11. $allow_visitor = 1;
  12. $MODEL = getcache('model','commons');
  13. $tablename = $this->db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
  14. $this->db->table_name = $tablename.'_data';
  15. $rs = $this->db->get_one(array('id'=>$id));
  16. $siteids = getcache('category_content','commons');
  17. $siteid = $siteids[$catid];
  18. $CATEGORYS = getcache('category_content_'.$siteid,'commons');
  19. $this->category = $CATEGORYS[$catid];
  20. $this->category_setting = string2array($this->category['setting']);

$a_k = trim($_GET['a_k']);

首先看到的是GET传入了一个参数只是经过了trim消除空格

跟进看这个参数

$a_k = sys_auth($a_k, 'DECODE', pc_base::load_config('system','auth_key'));

经过了sys_auth处理跟进看看在/phpcms/libs/function/globals.func.php的384到430行


  1. function sys_auth($string, $operation = 'ENCODE', $key = '', $expiry = 0) {
  2. $ckey_length = 4;
  3. $key = md5($key != '' ? $key : pc_base::load_config('system', 'auth_key'));
  4. $keya = md5(substr($key, 0, 16));
  5. $keyb = md5(substr($key, 16, 16));
  6. $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
  7. $cryptkey = $keya.md5($keya.$keyc);
  8. $key_length = strlen($cryptkey);
  9. $string = $operation == 'DECODE' ? base64_decode(strtr(substr($string, $ckey_length), '-_', '+/')) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
  10. $string_length = strlen($string);
  11. $result = '';
  12. $box = range(0, 255);
  13. $rndkey = array();
  14. for($i = 0; $i <= 255; $i++) {
  15. $rndkey[$i] = ord($cryptkey[$i % $key_length]);
  16. }
  17. for($j = $i = 0; $i < 256; $i++) {
  18. $j = ($j + $box[$i] + $rndkey[$i]) % 256;
  19. $tmp = $box[$i];
  20. $box[$i] = $box[$j];
  21. $box[$j] = $tmp;
  22. }
  23. for($a = $j = $i = 0; $i < $string_length; $i++) {
  24. $a = ($a + 1) % 256;
  25. $j = ($j + $box[$a]) % 256;
  26. $tmp = $box[$a];
  27. $box[$a] = $box[$j];
  28. $box[$j] = $tmp;
  29. $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
  30. }
  31. if($operation == 'DECODE') {
  32. if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
  33. return substr($result, 26);
  34. } else {
  35. return '';
  36. }
  37. } else {
  38. return $keyc.rtrim(strtr(base64_encode($result), '+/', '-_'), '=');
  39. }
  • 这是一个phpcms的加密函数,这里就只是单纯的加密,没有进行安全处理

重点是这个parse_str($a_k);

  • 好了明显的变量覆盖函数,$a_k直接GET传入除了加密没有别的处理,这就别的导致变量变成可控的了

    $rs = $this->db->get_one(array('id'=>$id));

  • 这里直接入库


  1. function get_one($query)
  2. {
  3. $this->querynum++;
  4. $rs = $this->conn->Execute($query);
  5. $r = $this->fetch_array($rs);
  6. $this->free_result($rs);
  7. return $r;
  8. }
  • 这里结果被return1出来了。接下来就是看他如何加密了。

  • 比较懒直接去看别人是怎么处理的~~

看了看veneno师傅的文章 他是直接找到一个能够返回加密数值的点


  1. public static function set_cookie($var, $value = '', $time = 0) {
  2. $time = $time > 0 ? $time : ($value == '' ? SYS_TIME - 3600 : 0);
  3. $s = $_SERVER['SERVER_PORT'] == '443' ? 1 : 0;
  4. $var = pc_base::load_config('system','cookie_pre').$var;
  5. $_COOKIE[$var] = $value;
  6. if (is_array($value)) {
  7. foreach($value as $k=>$v) {
  8. setcookie($var.'['.$k.']', sys_auth($v, 'ENCODE'), $time, pc_base::load_config('system','cookie_path'), pc_base::load_config('system','cookie_domain'), $s);
  9. }
  10. } else {
  11. setcookie($var, sys_auth($value, 'ENCODE'), $time, pc_base::load_config('system','cookie_path'), pc_base::load_config('system','cookie_domain'), $s);
  12. }
  13. }
  • 然后set_cookie一般能截到cookie

  1. public function swfupload_json() {
  2. $arr['aid'] = intval($_GET['aid']);
  3. $arr['src'] = safe_replace(trim($_GET['src']));
  4. $arr['filename'] = urlencode(safe_replace($_GET['filename']));
  5. $json_str = json_encode($arr);
  6. $att_arr_exist = param::get_cookie('att_json');
  7. $att_arr_exist_tmp = explode('||', $att_arr_exist);
  8. if(is_array($att_arr_exist_tmp) && in_array($json_str, $att_arr_exist_tmp)) {
  9. return true;
  10. } else {
  11. $json_str = $att_arr_exist ? $att_arr_exist.'||'.$json_str : $json_str;
  12. param::set_cookie('att_json',$json_str);
  13. return true;
  14. }
  15. }
  • 不过这里要绕过phpcms的安全函数

  1. function safe_replace($string) {
  2. $string = str_replace('%20','',$string);
  3. $string = str_replace('%27','',$string);
  4. $string = str_replace('%2527','',$string);
  5. $string = str_replace('*','',$string);
  6. $string = str_replace('"','&quot;',$string);
  7. $string = str_replace("'",'',$string);
  8. $string = str_replace('"','',$string);
  9. $string = str_replace(';','',$string);
  10. $string = str_replace('<','&lt;',$string);
  11. $string = str_replace('>','&gt;',$string);
  12. $string = str_replace("{",'',$string);
  13. $string = str_replace('}','',$string);
  14. $string = str_replace('\\','',$string);
  15. return $string;
  16. }
  • 他这里把'转义了,并且把url编码两次的'也转义了。

  • 看看v师傅的黑科技&id=3%*27and updatexml(1,concat(0x7e,user((),1)%23&catid=1&m=1&modellid=1&f=1

  • 把这个url编码过后传入就绕过了waf

  • %*27这个姿势是真的骚

  • 截取到cookie后就是加密过的上面的语句直接传入就可注入了。

总结一下

  • 因为phpcms搭建需要phpsso有点懒,没有搭建。后面复现过程只是看了一下v师傅的文章。但是这次还是给我了一些思路,首先是变量覆盖导致注入,这个没什么说的。主要是下面的加密算法,v师傅是直接找到一个返回点,比我去写脚本跑快多了~~然后就是这个waf绕过姿势,感觉以后会有用上的地方,自己还需要多测测。

phpcms9.6 注入分析的更多相关文章

  1. 技能提升丨Seacms 8.7版本SQL注入分析

    有些小伙伴刚刚接触SQL编程,对SQL注入表示不太了解.其实在Web攻防中,SQL注入就是一个技能繁杂项,为了帮助大家能更好的理解和掌握,今天小编将要跟大家分享一下关于Seacms 8.7版本SQL注 ...

  2. Java EE中的容器和注入分析,历史与未来

    Java EE中的容器和注入分析,历史与未来 java中的容器 java中的注入 容器和注入的历史和展望 一.java中的容器 java EE中的注入,使我们定义的对象能够获取对资源和其他依赖项的引用 ...

  3. 帝国CMS(EmpireCMS) v7.5 代码注入分析(CVE-2018-19462)

    帝国CMS(EmpireCMS) v7.5 代码注入分析(CVE-2018-19462) 一.漏洞描述 EmpireCMS7.5及之前版本中的admindbDoSql.php文件存在代码注入漏洞.该漏 ...

  4. 报错注入分析之(count()、rand()、group by)分析,被大佬称为floor报错注入

    PS:在这几天的学习当中很多的文章都将此注入方式称之为“floor报错分析”但经过我这几天的学习.个人觉得不该如此称呼!若君有意请详细阅读此篇文章.特别感谢米怀特的开导,说句实在的研究这个注入有四天了 ...

  5. Dedecms v5.7 最新注入分析

    该漏洞是cyg07在乌云提交的, 漏洞文件: plus\feedback.php.存在问题的代码: view source 01 ... 02 if($comtype == 'comments') 0 ...

  6. 动态调试|Maccms SQL 注入分析(附注入盲注脚本)

    0x01 前言 已经有一周没发表文章了,一个朋友叫我研究maccms的代码审计,碰到这个注入的漏洞挺有趣的,就在此写一篇分析文. 0x02 环境 Web: phpstudySystem: Window ...

  7. 动态分析小示例| 08CMS SQL 注入分析

    i春秋作家:yanzm 0×00 背景 本周,拿到一个源码素材是08cms的,这个源码在官网中没有开源下载,需要进行购买,由某师傅提供的,审计的时候发现这个CMS数据传递比较复杂,使用静态分析的方式不 ...

  8. ThinkPHP 5.0.x SQL注入分析

    前言 前段时间,晴天师傅在朋友圈发了一张ThinkPHP 注入的截图.最近几天忙于找工作的事情,没来得及看.趁着中午赶紧搭起环境分析一波.Think PHP就不介绍了,搞PHP的都应该知道. 环境搭建 ...

  9. Thinkphp 3.2.3 parseWhere设计缺陷导致update/delete注入 分析

    目录 分析 总结 分析 首先看一下控制器,功能是根据用户传来的id,修改对应用户的密码. 13行把用户传来的id参数送入where()作为SQL语句中的WHERE语句,将pwd参数送入save()作为 ...

随机推荐

  1. BZOJ 1601 [Usaco2008 Oct]灌水:最小生成树

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1601 题意: Farmer John已经决定把水灌到他的n(1<=n<=300 ...

  2. BZOJ 1207 [HNOI2004]打鼹鼠:dp【类似最长上升子序列】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1207 题意: 有一个n*n的网格,接下来一段时间内会有m只鼹鼠出现. 第i只鼹鼠会在tim ...

  3. static语句块的执行时间

    package utfTest; public class Test01 { public static void main(String[] args) { //Person.show(); Sys ...

  4. centos6.3 安装python2.7.3

    现在比较流行python2.7版本,centos6.3的默认版本是2.6.6,所以需要安装下2.7版本 1.下载安装python2.7 #wget http://www.python.org/ftp/ ...

  5. html5--1.19 通用属性

    html5--1.19 通用属性 学习要点: 1.通用属性的概念及几个常用的通用属性2.对属性值的若干点补充 通用属性 通用属性(全局属性)可以用于任何的HTML5元素:通用属性有十几种:这节课不会全 ...

  6. laravel 在apache或nginx的配置

    laravel 下载后,如何运行起来呢,根据自己的应用,记录了几个关键点: 1.apache 配置: 打开http.conf文件,将mod_rewrite前面的#去掉(启用重写模块): 2.nginx ...

  7. Struts2与ServletAPI解耦

    什么是与Servlet API解耦? 为了避免与servlet API耦合在一起,方便Action做单元测试, Struts2对HttpServletRequest,HttpSession,和Serv ...

  8. 事件驱动模式--Reactor

    原文:https://www.cnblogs.com/harvyxu/p/7498763.html 1 Reactor模型 Reactor模式是处理并发I/O比较常见的一种模式,用于同步I/O,中心思 ...

  9. [acm]HDOJ 2064 汉诺塔III

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=2064 汉诺塔变种,只能从中间专业,递归关系为:f(n)=3*f(n-1)+2. //汉诺塔变种,只能 ...

  10. P2024 [NOI2001]食物链[扩展域并查集]

    大水题一道啊,几分钟切掉. 还是扩展域,每个点拆3个点,之间连边表示有关系(即捕食关系).然后随便判定一下就好了,不难,毕竟NOI上古题目. #include<iostream> #inc ...