【小迪安全】Day52代码审计-PHP项目类RCE及文件包含下载删除
沙漠里的鲸
2022年02月08日 16:54
收录于文集
共92篇

【小迪安全】Day52代码审计-PHP项目类RCE及文件包含下载删除

相关知识基本原理

1.漏洞关键字:

#SQL 注入:

---select insert update mysql_query mysqli

#文件上传:

---$_FILES,type="file&#​34;,上传,move_uploaded_file()等

#XSS 跨站:

---print print_r echo sprintf die var_dump var_export

#文件包含:

---include include_once require require_once

#代码执行:

---eval assert preg_replace call_user_func call_user_func_array

#命令执行:

---system exec shell_exec `` passthru pcntl_exec popen proc_open

#变量覆盖:

---extract() parse_str() importrequestvariables() $$

#反序列化:

---serialize() unserialize() __construct __destruct

#其他漏洞:

---unlink() file_get_contents() show_source() file() fopen()

 

2.通用关键字:

---$_GET,$_POST,$_REQUEST,$_FILES,$_SERVER

---功能点或关键字分析可能存在漏洞

---抓包或搜索关键字找到代码出处及对应文件

---追踪过滤或接受的数据函数,寻找触发此函数或代码的地方进行触发测试

http://192.168.0.102:91/?r=../../index.txt%00

http://192.168.0.102:94/admin/save.php?act=delfile

path=/upload/../install/install.lock

xhcms-无框架-文件包含跨站-搜索或应用-include

1.  进入靶场

---源代码全局搜索echo

---这里发现很多,优先看非后台的文件,而且输出的为变量,不是固定值

---选择contact.php进行查看

---这里输出了数组navs的一个name键值

---全文追踪数组navs,发现这是MySQL执行语句的返回

---下面输出了数组navs的name键的值和content键的值

---可以发现result是变量$llink的查表的结果

---变量$llink是get传参r的结果

---这里要找的XSS的输出漏洞,虽然可以构造r,但是数据库查询的语句不可能构成XSS的攻击语句()

---这里可能存在SQL注入,但是addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。预定义字符是:单引号(');双引号(&#​34;);反斜杠(\);NULL

---要绕过addslashes() 函数,只有二次注入,但是这里没有update和insert,所以不存在漏洞

----网上查找了下,addslashes() 函数绕过还是有很多方法

----再看看page参数,这里只对预定义字符反斜杠,但是这个过滤是针对sql注入的,不是很针对XSS

---查看一下$pages有没有输出(发现这里输出了)

---尝试访问(发现这里的路由规则,不允许用户直接进行访问)

---在根目录的index.php文件中,定义了访问规则

---接受传参添加转义的文件名,访问files目录下对应的文件

---这里构造:r=contact

---浏览器访问(发现留言板)

---测试page=11111,发现显示的地方

http://192.168.102.140:8456/index.php?r=contact&page=11111111111

---构造XSS的payload:r=contact&page=<script>alert(1)</script>

---从功能点来看,留言板可能存在XSS,但是一般CMS都会检测这里,很少会存在漏洞

2.  文件包含漏洞,搜索关键字include

---注意,include要包含的变量,而不是固定值(这里的文件包含有后缀名的限制,限制为PHP文件)

---这里有两种方法绕过:

---1.%00截断,条件:魔术引号关闭,php版本<5.3.4

---2.长度截断,条件:windows点号>256;linux点号>4096

---读取file目录下创建内容为phpinfo的1.txt文件

---但是这里%00截断不能用(条件都满足)

---跨目录访问www目录下的phpinfo.php文件

earmusic-无框架-文件下载-搜索或应用功能-down 等

1.  进入靶场,观察功能

---这里从会员中心的功能可能存在的漏洞:音乐下载存在文件下载漏洞;头像和音乐上传存在文件上传漏洞;个人信息修改可能存在SQL注入漏洞;日志,页脚可能存在XSS漏洞;查看调用的api可能存在一些其他漏洞;查看数据包传输格式等等

---根据网站的功能,取猜测可能存在的漏洞:偏向社交,注入、XSS多一点;音乐下载,文件下载、上传漏洞多;

---这里文件下载漏洞挖掘的两种思路:1.根据文件下载的功能测试2.搜索文件下载的相关函数和关键字然后抓包分析

---先上传一个音乐,测试有没有下载漏洞(这里是通过注册用户上传的,但是我发现不能够上传电脑上的MP3文件,就上传的文字)

---这种音乐网站,主要测试文件上传和文件下载漏洞(视频中测试了上传没有漏洞,就分析文件下载漏洞)

---这里漏洞发现可以分为两个方面,一方面在源代码里面搜索关键函数、关键字发现,另一方面可以从网站的功能点取分析到对应代码。

---点击下载,抓包发现没有传输什么数据(可能是文件的属性为空)

---点击下载文件,发现下载地址为:

http://127.0.0.1:8456/template/default/source/audio.php?id=1

---访问发现可以下载

---查看该路径的源代码

---这里的传参的id通过saferequest函数过滤,原理是魔术引号或者转义(因此不太可能存在注入漏洞)

---将id值代替查询语句,查询音乐表中的id值,返回一个键值对(也就是表)

---先通过键值对中in_gade键的值判断用户的权限,在判断用户的登录状态(前面的都是用户的验证),如果=1,就需要VIP才能下载,如果=2,就需要购买才能下载,数据库里面是3

---到数据库进行查找(这里发现上传音乐的音频地址,就是数据库的in_audio)

---查抄到进行文件下载的代码,在数据库里面in_audio是文件的路径(这里有点问题,我没上传成功,因此填的aaaaaaaa,这里判断的上传的文件的路径,视频里面的有:index.php,c://1.txt等等)

---相当于直接访问目录文件,但是我测试了一下,路径写c://1.txt,并不会在C盘创建1.txt文件,下载的文件也为空;自己在C盘创建,下载的文件里面会有警告。(我怀疑只能在网站的根目录下进行操作)(这里的audio是上传音乐的路径,但是在代码审计里面在数据库中,需要去查询)

---get_header()取得服务器响应一个 HTTP 请求所发送的所有头信息(在这里是上传的文件在服务器的路径)

---array_key_exists函数检查键名 "content-length&#​34; 是否存在于所获取的要下载的文件的头部中:

---全局搜索在哪里运用了in_audo函数

---发现在上传音乐的地方,saferequest过滤传参,unescape函数解码经过url编码的编码的参数,

---checkrename函数检测文件是否存在(这里应该是文件上传的检测机制)

---如果文件是添加,且符合匹配规则,就将file字符串中的tmp(这里应该是临时文件)替换为dir(也就是attachment的路径)

---这里我们要需要知道在哪里使用了ajax.php文件(猜测是上传音乐这里)

---点击上传音乐进行抓包

---抓包分析,发现get传参

GET/source/user/music/ajax.php?ac=add&name=%u4E24%u53EA%u8001%u864E&classid=2&audio=twotiger.php&specialid=0&singerid=0&tag=1234&cover=&lyric=&text=%u4E24%u53EA%u8001%u864E%u8DD1%u5F97%u5FEB

----指向ajax.php文件

---在ajax.php的文件传参构造成键值对,插入数据库

---注意,这里的music表是数据库的prefix_music表,在配置文件中写好

2.  在ajax的目录下,构造1.txt文件,写入:我爱小迪

---通过音乐上传

---管理员审核通过

---下载成功了,但是内容不是构造的文件

---构造进行跨站下载

---进行下载

---我这里尽然可以直接下载

---这里我发现了,这里没有视频里面的对于../的过滤,应该是我的CMS版本不一样,或者修复了这个漏洞

---绕过方法,如果过滤/,可以采用\

3.总结:

----通过应用分析或搜索关键词、关键函数判断可能存在文件下载操作

----抓包分析下载地址找到对应代码块,文件下载地址由$file 控制

----$file 从数据库查询语句得知,追踪那里可更新或更改此类数据

----尝试修改发现过滤,追踪过滤机制分析绕过,采用全路径地址绕过

#代码审计步骤

---功能点或关键字分析可能存在漏洞

---抓包或搜索关键字找到代码出处及对应文件

---追踪过滤或接受的数据函数,寻找触发此函数或代码的地方进行触发测试

zzzcms-无框架-文件删除 RCE-搜索或应用-unlink,eval

1.  文件删除漏洞

---文件删除一般用于白盒审计,可以删除install.lock文件

---一个网站的安装,通过install.lock来判断是否安装(是否初次安装)

---将installlock.txt重命名,发现需要重新安装

---PHP文件删除搜索关键字unlink,对应函数 del_file,查看调用此的地方

---全局搜索unlink关键字(我下的CMS的版本比较老,应该行1.7.1版本)

---unlink() 函数删除文件。若成功,则返回 true,失败则返回 false。

---如果文件为空,返回FALSE;不为空判断文件是否存在

---如果不能删除就重命名

---视频里面还检测了文件的后缀名是否是php,db,mdb,tql防止重要文件误删

---查看del_file函数在哪里被调用(优先不看管理员文件)

---在zzz_file.php调用del_file的地方

---is_wirite和del_allfolder函数没有被调用,可以排除

---全局搜索handle_upload函数,发现被调用一次

---在upload函数中被调用

---搜索发现调用的地方很多,就先跳过,直接看之前的管理员文件调用的del_file的地方

---我这里,只有act参数==delfile才会调用,删除path变量的文件

---这里的调用是通过包含zzz_class.php文件进而包含zzz_file.php文件调用del_file函数

---action和path变量都是通过getfrom方法传参(和视频里面不一样,这里直接调用了del_file()函数),想办法让act=delfile;path=要删除的文件路径

---定位getform函数

---根据source来进行不同方式的传参赋值给date变量,返回data

---对tpye和default进行不为空检测,这里感觉没啥过滤啊

---在视频里对getform接受的参数,会有一个safe_word()过滤

--- safe_word()过滤字符串,仅仅保留a-z;A-Z;0-9;也就是说像..//等等不行(但是这里只是act无所谓,要看path是不是也有这个函数的过滤,如果有好像不能使用../../来进行文件的选择)

---在视频的delfile()函数,从post获取path

---然后通过file_path来过滤

---file_path获取路径中的路径

---strrpos查找 "/&#​34; 在字符串中path最后一次出现的位置:

---这里应该是截取的php之前的路径,如c://windows/1.php就是c://windows/1.

---split将路径以/分割成数组的形式

---然后判断返回的分隔数组

--- array_search() 函数与 in_array() 一样,在数组中查找一个键值。如果找到了该值,返回Ture。如果没找到,则返回 false。

---也就是说,path里面要包含safe_path的元素才能执行del_file

---在save.php路径下创建1.txt文件

---访问save.php文件,尝试删除1.txt(应为我这里没有过滤,应该可以直接删除)

---但是我这里也没删除,不知道怎么回事

---进行管理员登陆,再次尝试(发现删除成功)

---删除admin307\images\1.txt文件,发现删除成功

2.Rce代码执行漏洞

---查找关键函数eval或者arrest函数,只有最后一个是eval函数

---找到对应的函数,eval执行的是$ifstr变量,而这里变量来自matches变量

---matches参数的传递来自调用的parseriflabel函数

---preg_match_all 函数用于执行一个全局正则表达式匹配。$pattern: 要搜索的模式,字符串形式。$subject: 输入字符串。$matches: 多维数组,作为输出参数输出所有匹配结果, 数组排序通过flags指定。

---这里就是zcontent字符串以pattern匹配后,返回的数组matches

---public是对象的方法,要看哪里调用这个对象,执行了这个方法

---parserCommon调用了parseriflabel函数

---查看哪里调用了这个对象,优先选取非管理员

---发现这里调用了对象,并且传参

---zcontent变量由user_tql传递

---追踪user_tql的由来,最开始为空

---根据include文件是否存在来判断user_tql

---视频里面还有一重判断,即根据act的值来选择user_tql的赋值

---查看save.php后台对于该对象的调用

---这个漏洞应该产生在本地的模板管理

---在template路径下的模板,就是网站前端的界面

---而会调用对象的地方,就是修改模板的地方,也就是更换前端界面

---之前在client和admin都出现了调用对象,client是显示界面,admin有管理界面

---点击模板修改about.html写入代码执行语句

---访问,我这里没有关于我们的路线Aboutus/,phpinfo也没执行成功

---在前端的index文件包含client文件,client被调用

---client里面的代码被执行,content被赋值

3.总结

---在eval有个正则表达式,匹配if(变量)if

---更具正则表达式构造payload,使得传递assert($_POST[x])

---也就是,后台的模板文件被修改之后,前端的界面引用了这个模板,因此也会被修改

---代码执行漏洞产生在模板文件,而模板文件被调用的地方有两处,一处是后台的文件(模板管理),另外就是client文件,而client文件在index文件处被包含

---client文件调用ParserTemplate()对象,并且传参(我没有复现这个漏洞的原因,就是传参这里还是不太明白,也可能是CMS版本的文件,视频里面对于参数传递的过滤机制一笔带过,这里需要PHP基础取搞懂过滤机制,来找到功能点好构造payload)

---总之,就是修改后台模板,然后在前端根据传参的顺序和过滤机制构造payload。

---这里解析模板的时候,会将HTML的PHP代码进行识别,进行执行

---漏洞的价值:利用rce漏洞获取网站权限

4.再次总结

---后台 delfile 函数调用,如何处理delfile 函数,受参数控制,进行测试

---代码执行搜索关键字 eval,对应配置模版解析文件,查看调用此的地方

---判断后台可修改模版文件前台触发模版文件,构造 payload 进行测试

 

 

 

Earnmusic源码:https://www.tongyixiazai.com/soft/10001862.html

Zzzcms: https://download.csdn.net/download/weixin_38721405/12916675