代码审计-PHP项目类RCE及文件包含下载删除

QQ截图20220406100108.jpg

相关知识基本原理

漏洞关键字

SQL注入

  • select,insert,update,mysql_query,mysqli

文件上传

  • $_FILES,type="file",上传,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()

通用关键字

  • $_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

文件包含跨站-搜索或应用-include

QQ截图20220411092604.jpg

源代码全局搜索echo,这里发现很多,优先看非后台的文件,而且输出的为变量,不是固定值

QQ截图20220411092850.jpg

选择contact.php进行查看

QQ截图20220411092911.jpg

这里输出了$navs['name']

QQ截图20220411093023.jpg

全文追踪$navs发现这是MySQL执行语句的返回,下面输出了$navs的name键的值和content键的值

QQ截图20220411093110.jpg

可以发现$resul是变量$llink的查表的结果,变量$llink$_GET['r']的结果,这里要找的XSS的输出漏洞,虽然可以构造$_GET['r'],但是数据库查询的语句不可能构成XSS的攻击语句.这里可能存在SQL注入,但是addslashes()函数返回在预定义字符之前添加反斜杠的字符串,要绕过addslashes()函数,只有二次注入,但是这里没有updateinsert,所以不存在漏洞

QQ截图20220411094617.jpg

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

QQ截图20220411094646.jpg

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

QQ截图20220411094913.jpg

查看一下$pages有没有输出

QQ截图20220411094938.jpg

尝试访问

QQ截图20220411095003.jpg

在根目录的index.php文件中,定义了访问规则,接受传参添加转义的文件名,访问files目录下对应的文件 这里构造:r=contact

QQ截图20220411101658.jpg

浏览器访问

QQ截图20220411101721.jpg

测试page=11111

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

QQ截图20220411101846.jpg

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

QQ截图20220411101910.jpg

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

QQ截图20220411101927.jpg

文件包含漏洞搜索关键字include,include要包含的变量,而不是固定值

QQ截图20220411102024.jpg

这里有两种方法绕过

  1. %00截断,条件:魔术引号关闭,php版本<5.3.4
  2. 长度截断,条件:windows点号>256;linux点号>4096
  • 读取file目录下创建内容为phpinfo();1.txt

QQ截图20220411102243.jpg

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

QQ截图20220411102644.jpg

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

QQ截图20220411102711.jpg

文件下载-搜索或应用功能

这里从会员中心的功能可能存在的漏洞:音乐下载存在文件下载漏洞;头像和音乐上传存在文件上传漏洞;个人信息修改可能存在SQL注入漏洞;日志,页脚可能存在XSS漏洞;查看调用的api可能存在一些其他漏洞;查看数据包传输格式等等 根据网站的功能,取猜测可能存在的漏洞:偏向社交,注入、XSS多一点;音乐下载,文件下载、上传漏洞多; 这里文件下载漏洞挖掘的两种思路:1.根据文件下载的功能测试2.搜索文件下载的相关函数和关键字然后抓包分析

QQ截图20220411103717.jpg

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

QQ截图20220411103843.jpg

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

QQ截图20220411103909.jpg

这里漏洞发现可以分为两个方面,一方面在源代码里面搜索关键函数、关键字发现,另一方面可以从网站的功能点取分析到对应代码。 点击下载,抓包发现没有传输什么数据(可能是文件的属性为空)

QQ截图20220411104558.jpg

QQ截图20220411104608.jpg

点击下载文件,访问发现可以下载,地址为:http://127.0.0.1:8456/template/default/source/audio.php?id=1

QQ截图20220411104643.jpg

查看该路径的源代码

  • 这里的传参的id通过saferequest()过滤,原理是魔术引号或者转义(因此不太可能存在注入漏洞)
  • 将id值代替查询语句,查询音乐表中的id值,返回一个键值对(也就是表)
  • 先通过键值对中in_gade键的值判断用户的权限,在判断用户的登录状态(前面的都是用户的验证),如果=1,就需要VIP才能下载,如果=2,就需要购买才能下载,数据库里面是3

QQ截图20220411104843.jpg

  • 查抄到进行文件下载的代码,在数据库里面in_audio是文件的路径(这里有点问题,我没上传成功,因此填的aaaaaaaa,这里判断的上传的文件的路径,视频里面的有:index.phpc://1.txt等等)
  • 相当于直接访问目录文件,但是我测试了一下,路径写c://1.txt,并不会在C盘创建1.txt文件,下载的文件也为空;自己在C盘创建,下载的文件里面会有警告。(我怀疑只能在网站的根目录下进行操作)(这里的audio是上传音乐的路径,但是在代码审计里面在数据库中,需要去查询)
  • get_header()取得服务器响应一个 HTTP 请求所发送的所有头信息(在这里是上传的文件在服务器的路径)
  • array_key_exists()检查键名content-length是否存在于所获取的要下载的文件的头部中

QQ截图20220411105020.jpg

全局搜索在哪里运用了in_audo()

QQ截图20220411105805.jpg

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

QQ截图20220411105842.jpg

checkrename()检测文件是否存在(这里应该是文件上传的检测机制) 如果文件是添加,且符合匹配规则,就将file字符串中的tmp(这里应该是临时文件)替换为dir(也就是attachment的路径)

QQ截图20220411105917.jpg

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

QQ截图20220411105946.jpg

抓包分析,发现get传参,指向ajax.php

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的文件传参构造成键值对,插入数据库

QQ截图20220411110046.jpg

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

QQ截图20220411110109.jpg

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

QQ截图20220411110150.jpg

通过音乐上传

QQ截图20220411110216.jpg

管理员审核通过

QQ截图20220411110248.jpg

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

QQ截图20220411110309.jpg

构造进行跨站下载

QQ截图20220411110325.jpg

进行下载

QQ截图20220411110343.jpg

这里没有视频里面的对于../的过滤,应该是我的CMS版本不一样,或者修复了这个漏洞,绕过方法,如果过滤/,可以采用\

QQ截图20220411110429.jpg

总结

  • 通过应用分析或搜索关键词、关键函数判断可能存在文件下载操作
  • 抓包分析下载地址找到对应代码块,文件下载地址由$file控制
  • $file从数据库查询语句得知,追踪那里可更新或更改此类数据
  • 尝试修改发现过滤,追踪过滤机制分析绕过,采用全路径地址绕过

代码审计步骤

  • 功能点或关键字分析可能存在漏洞
  • 抓包或搜索关键字找到代码出处及对应文件
  • 追踪过滤或接受的数据函数,寻找触发此函数或代码的地方进行触发测试