1.Discuz!ML 3.x任意代码执行漏洞之大佬分析之后我分析
2.ç¨delphiå计ç®å¨
3.找tpl是什么意思?
Discuz!ML 3.x任意代码执行漏洞之大佬分析之后我分析
首先附上米斯特安全大佬们文章的链接,刚开始有些东西我没看的太懂,于是我就再添了点东西,希望像我一样的小白也能看懂。
一、漏洞综述
漏洞类型:代码执行漏洞
影响系统及版本:Discuz!ML V3.2-3.4
漏洞原因:Discuz!ML 系统对cookie中的svn解除源码管理l接收的language参数内容未过滤,导致字符串拼接,从而执行php代码。
二、漏洞分析
根据米斯特大佬们提供的报错界面,我对其中的三个报错点一一进行了分析,三个报错点如下图所示(还有米斯特大佬们的水印)。
2.1 报错点一分析
发现首先是美色源码portal.php函数出错,把这张图放大看,发现是对cookie中的language参数进行拼接而导致的报错,根据这个参数的语义判断应该是调用语言模板的时候因为找不到相应的模板而发生的错误,那么先定位portal.php报错的第行,该文件路径:
紧接着定位libfile函数,文件加载路径函数。
函数介绍:
libfile($libname, $folder = ”),包含2个参数:$libname 和 $folder,该函数读取source目录下的$folder子目录作为基础部分。
libfile函数源代码如下图所示:
DISCUZ_ROOT为定义网站根目录的常量,realpath函数为返回绝对路径函数,到此处第一个报错就已经分析完毕,sock源码原因是系统因为找不到一个php文件而报的错。
2.2 报错点二分析
还是先根据错误定位到引用函数文件,文件路径source/module/portal/portal_index.php,然后定位到源函数所在的文件,引用的地方好定位,位置在/source/function/function_core.php,直接上图
然后这个函数写的还贼长,哎,没得办法,这个时候只能靠运气了,搏一搏,单车变摩托,qslim源码首先百度,这个函数的作用也就是个调用模板的函数。
然而这个函数写了行代码,找个大表哥的写的代码注释吧,先扔个参考链接 discuz.net/thread-...
此时我发现了思路有些繁琐,然后就去找第三个错误的提示内容,为了找到是哪里出了问题,我把这段代码放到了txt文件中,根据第三个错误提示的信息开始了全文搜索,终于,根据关键字tpl.php值搜索到一处与language这个函数语义有关的东西DISCUZ_LANG。
既然是tmw源码语言参数出了问题,还是个常量,那就去找找常量定义的地方,全局搜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文件也被广泛应用于各种电子文档模板中,如合同、维修报告等。