【宝塔线两平底指标源码】【诱惑充值+源码】【雷电备份源码】tpl 源码

时间:2024-12-23 05:57:13 分类:个人主页开源码 来源:甲醛 网站源码

1.Discuz!ML 3.x任意代码执行漏洞之大佬分析之后我分析
2.用delphi写计算器
3.找tpl是什么意思?

tpl 源码

Discuz!ML 3.x任意代码执行漏洞之大佬分析之后我分析

       首先附上米斯特安全大佬们文章的链接,刚开始有些东西我没看的太懂,于是我就再添了点东西,希望像我一样的小白也能看懂。

       一、漏洞综述

       漏洞类型:代码执行漏洞

       影响系统及版本:Discuz!ML V3.2-3.4

       漏洞原因:Discuz!ML 系统对cookie中的宝塔线两平底指标源码l接收的language参数内容未过滤,导致字符串拼接,从而执行php代码。

       二、漏洞分析

       根据米斯特大佬们提供的报错界面,我对其中的三个报错点一一进行了分析,三个报错点如下图所示(还有米斯特大佬们的水印)。

       2.1 报错点一分析

       发现首先是诱惑充值+源码portal.php函数出错,把这张图放大看,发现是对cookie中的language参数进行拼接而导致的报错,根据这个参数的语义判断应该是调用语言模板的时候因为找不到相应的模板而发生的错误,那么先定位portal.php报错的第行,该文件路径:

       紧接着定位libfile函数,文件加载路径函数。

       函数介绍:

       libfile($libname, $folder = ”),包含2个参数:$libname 和 $folder,该函数读取source目录下的$folder子目录作为基础部分。

       libfile函数源代码如下图所示:

       DISCUZ_ROOT为定义网站根目录的常量,realpath函数为返回绝对路径函数,到此处第一个报错就已经分析完毕,雷电备份源码原因是系统因为找不到一个php文件而报的错。

       2.2 报错点二分析

       还是先根据错误定位到引用函数文件,文件路径source/module/portal/portal_index.php,然后定位到源函数所在的文件,引用的地方好定位,位置在/source/function/function_core.php,直接上图

       然后这个函数写的还贼长,哎,没得办法,这个时候只能靠运气了,搏一搏,单车变摩托,iapp爬虫源码首先百度,这个函数的作用也就是个调用模板的函数。

       然而这个函数写了行代码,找个大表哥的写的代码注释吧,先扔个参考链接 discuz.net/thread-...

       此时我发现了思路有些繁琐,然后就去找第三个错误的提示内容,为了找到是哪里出了问题,我把这段代码放到了txt文件中,根据第三个错误提示的信息开始了全文搜索,终于,根据关键字tpl.php值搜索到一处与language这个函数语义有关的东西DISCUZ_LANG。

       既然是etc网站源码语言参数出了问题,还是个常量,那就去找找常量定义的地方,全局搜DISCUZ_LANG,跟踪到/source/class/discuz/discuz_application.php

       可以看到,将$lng的值给了DISCUZ_LANG,追踪$lng在何处定义,全局搜索$lng,找到了定义$lng的地方(图中第一个箭头)

       到此为止,又出现个var,这是个啥,我只知道var[‘cookie’][‘language’]的意思就是cookie中的language的值。

       以上可以分析出,从获取language到DISCUZ_LANG拿到值的过程中,并没有对其进行过滤。

       那么现在必须确定报错问题是怎么出现的了,看下图:

       出现了这样的代码,直接拼接,然后RCE

       拼接单引号和'.phpinfo().'

       按理来说可以RCE

       总结下大概流程从cookie中获取了language的值,然后给了$lng,接着$lng又给了DISCUZ_LANG,系统通过template函数调用模板文件,template函数执行,执行到$cachefile的时候,执行构造的代码。

       三、漏洞复现

       访问站点www.***.com/forum.php,刷新页面抓包

       *本文作者:xxx,转载请注明来自 FreeBuf.COM在language参数处'.phpinfo().'

       返回内容:

       复现成功。

       看起来复现大佬们的漏洞还是挺有意思的,开心。

用delphi写计算器

       è¿™æ˜¯æºä»£ç ï¼š

       unit Unit1;

       interface

       uses

       Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

       Dialogs, Buttons, StdCtrls, ExtCtrls;

       type

       TForm1 = class(TForm)

       Panel1: TPanel;

       Panel2: TPanel;

       SpeedButton7: TSpeedButton;

       SpeedButton8: TSpeedButton;

       SpeedButton9: TSpeedButton;

       SpeedButton: TSpeedButton;

       SpeedButton4: TSpeedButton;

       SpeedButton5: TSpeedButton;

       SpeedButton6: TSpeedButton;

       SpeedButton: TSpeedButton;

       SpeedButton1: TSpeedButton;

       SpeedButton2: TSpeedButton;

       SpeedButton3: TSpeedButton;

       SpeedButton: TSpeedButton;

       SpeedButton: TSpeedButton;

       SpeedButton: TSpeedButton;

       SpeedButton: TSpeedButton;

       StaticText1: TStaticText;

       SpeedButton0: TSpeedButton;

       SpeedButton: TSpeedButton;

       SpeedButton: TSpeedButton;

       GroupBox1: TGroupBox;

       procedure SpeedButton1Click(Sender: TObject);

       procedure FormCreate(Sender: TObject);

       procedure SpeedButtonClick(Sender: TObject);

       procedure SpeedButtonClick(Sender: TObject);

       procedure SpeedButtonClick(Sender: TObject);

       procedure SpeedButtonClick(Sender: TObject);

       private

       { Private declarations }

       public

       { Public declarations }

       end;

       var

       Form1: TForm1;

       restart: Boolean;

       isfirst: Boolean;

       fir_num,sec_num: String;

       sign: integer;

       result: real;

       save: String;

       implementation

       { $R *.dfm}

       function count(sign: integer):real;

       begin

       case sign of

       1: result:=strtofloat(fir_num)+strtofloat(sec_num); //为加号时

       2: result:=strtofloat(fir_num)-strtofloat(sec_num); //为减号时

       3: result:=strtofloat(fir_num)*strtofloat(sec_num); //为乘号时

       4: begin

       try

       result:=strtofloat(fir_num)/strtofloat(sec_num); //为除号时

       except

       ShowMessage('错误!');

       form1.close;

       end; //除数为0时,做出异常处理

       end;

       end;

       end;

       procedure TForm1.SpeedButton1Click(Sender: TObject);

       var

       i: integer;

       begin

       if restart then //如果是重新开始输入,则清除原来的操作数,并设置isfirst为True

       begin

       isfirst:=True;

       fir_num:='';

       sec_num:='';

       restart:=False;

       end;

       if isfirst then //如果是第一个操作数

       begin

       if (sender as TSpeedButton).Caption='.' then //如果输入的是小数点

       begin

       if (strlen(pChar(fir_num))<=0) then //如果第一个操作数并未输入

       fir_num:='0.'

       else

       for i:= 1 to strlen(pChar(fir_num)) do

       if fir_num[i]='.' then exit;

       //如果第一个中已含有小数点而又输入小数点,则退出

       end;

       if (strlen(pChar(fir_num))>0) and (fir_num[1]='0') then //如果最高位为0

       begin

       if ((sender as TSpeedButton).Caption='.') then

       fir_num:='0.'

       else

       begin

       if strlen(pChar(fir_num))>1 then //如果是小数,则继续输入

       fir_num:=fir_num+(sender as TSpeedButton).Caption

       else

       fir_num:=(sender as TSpeedButton).Caption;

       //如果不是小数,则去掉最高位的0

       end;

       end

       else

       fir_num:=fir_num+(sender as TSpeedButton).Caption;

       StaticText1.Caption:=fir_num;

       end

       else

       begin

       if (sender as TSpeedButton).Caption='.' then //如果第二个操作数并未输入

       begin

       if (strlen(pChar(sec_num))<=0) then

       sec_num:='0.'

       else

       for i:= 1 to strlen(pChar(sec_num)) do

       if sec_num[i]='.' then exit;

       //如果第二个中已含有小数点而又输入小数点,则退出

       end;

       if (strlen(pChar(sec_num))>0) and (sec_num[1]='0') then //如果最高位为0

       begin

       if ((sender as TSpeedButton).Caption='.') then

       sec_num:='0.'

       else

       begin

       if strlen(pChar(sec_num))>1 then //如果是小数,则继续输入

       sec_num:=sec_num+(sender as TSpeedButton).Caption

       else

       sec_num:=(sender as TSpeedButton).Caption;

       //如果不是小数,则去掉最高位的0

       end;

       end

       else

       sec_num:=sec_num+(sender as TSpeedButton).Caption;

       StaticText1.Caption:=sec_num;

       end;

       end;

       procedure TForm1.FormCreate(Sender: TObject);

       begin

       StaticText1.Caption:='0.'; //设置StaticText1初始显示为0.

       restart:=False;

       Isfirst:=True;

       fir_num:='';

       sec_num:='';

       end;

       procedure TForm1.SpeedButtonClick(Sender: TObject);

       begin

       if (fir_num<>'') and (sec_num<>'') then

       //如果两各操作数都不为空

       begin

       result:=count(sign); //调用函数,返回计算结果

       fir_num:=floattostr(result);

       sec_num:='';

       StaticText1.Caption:=floattostr(result);

       end;

       sign:=(sender as TSpeedButton).Tag;

       isfirst:=False;

       restart:=False;

       end;

       procedure TForm1.SpeedButtonClick(Sender: TObject);

       begin

       if (sec_num<>'') then

       //如果第二个操作数不为空则返回结果

       begin

       result:=count(sign);

       fir_num:='';

       fir_num:=fir_num+floattostr(result);

       StaticText1.Caption:=floattostr(result);

       sec_num:='';

       end;

       restart:=true;

       end;

       procedure TForm1.SpeedButtonClick(Sender: TObject);

       begin

       restart:=True;

       fir_num:='';

       sec_num:='';

       self.StaticText1.Caption:='0.';

       end;

       procedure TForm1.SpeedButtonClick(Sender: TObject);

       begin

       Close;

       end;

       end.

找tpl是什么意思?

       TPL是Template缩写的意思,即中文中的模板。在计算机领域,TPL常常指代一种文件格式,通常用于存储独立而可重用的模板文件,用于快速地生成文档、网页等内容。TPL文件通常使用模板引擎进行渲染,把指定的数据填入模板中并生成最终的文档或页面。

       另外,TPL也是一种文件扩展名,代表一种程序源码文件,用于存储模板引擎的模板文件。TPL文件通常用各种编程语言编写,如php、asp、jsp等。使用TPL文件,程序员们可以更加易于维护和设计他们的网页、应用,同时也使得开发更加高效。

       TPL文件广泛应用于网络开发领域,如网站、应用程序、移动应用等。由于其灵活性和使用的方便性,很多开发人员倾向于将常见的数据放在模板文件中,以便在需要时进行重新使用和更新。在日常生活中,TPL文件也被广泛应用于各种电子文档模板中,如合同、维修报告等。