本环境采用phpstudy一键搭建,将下载的压缩包直接解压到www目录下
环境搭建
访问根目录进入安装页面环节,正确填写数据库密码和设置管理员账户,一路默认
如果安装完最后一个环节又跳至安装界面,请检查是否为解压出现的问题,我解压时少了个data目录导致报错
出现以下界面即可,如果报错,会在该页面的上方出现
上传音乐
因为目前数据库内没有除用户密码账户外任何数据,我们先添加几组数据
首页-上传音乐-填入数据
功能分析
拿到源码,首先分析他具有什么功能点可以入侵,关于音乐的,可以听音乐,上传音乐,下载音乐。但从目前已知来看 听 不好寻找漏洞。上传都是.mp3后缀肯定有过滤只能上传音频类的,于是从下载音乐下手。
php对于文件上传删除修改包含都内置了许多函数,但是关于下载方面貌似不怎么有。下载需要经过网络传递数据,传递数据就会产生流量包,可以产生流量包那我们就可以通过抓包的方式来提取数据。这一期思路就是通过抓包的方式定位是哪一个文件具有下载文件的功能,再对此文件进行分析
实战
抓包测试
在上图显示上传音乐的界面点击名称进入以下界面
F12选网络-点击下载-观察数据,弹出以下内容
定位右侧两串数据,很明显已经出来路径,并且可以猜测参数ac是对功能选择,down表示download,id是音乐的id,可以再下载一次音乐测试(见p3)
双击打开这两个文件,确定第二个文件(audio.php)才是关于文件下载的
代码审计
全局分析
找到文件,首先看到id参数,通过两个函数提纯后得到,intval是将数据转换成int类型,saferequest区分请求类型
追踪sql语句,就是执行,在music表中查找in_id字段,返回得到的数据关联成数组给row
为了更方便观察,我们连接上数据库,找到music表
对应的字段in_grade我们是3他只判断1,2不管
接着是更新下载次数,已经闭合
分析geturl函数,用到了正则表达,判断是不是来自/data/attachment
然后获取存储了in_audio的file变量的http头信息,计算大小
整段代码内容如下
信息整合
从后往前看,触发下载的过程中,最后的readfile其中的file变量是关键,它唯一一次变化就是定义的时候
这里面唯一的row变量也是只有一次变化,在if语句里面
也就是说从数据库查到的一整串关于歌曲id为 ? 的信息赋值给row,再将row内容的in_audio字段提取出来构成url给file变量,最后readfile下载。我们实际需要控制的就是歌曲信息的in_audio字段
追踪嫌疑犯in_audio
in_audio在很多地方都留下了足迹,比较让我眼前一亮的就是edit.php文件中,有一个get请求
然后对应文件路径去搜索
这不就是刚刚添加数据的界面吗?刚刚好源码内容音频地址什么的都对上了。那么我们在/add或者/edit添加数据的时候就可以控制in_audio了
捉拿in_audio
我们先在同级目录下创建一个1.php文件并写点内容进去。因为in_audio表示的是音频地址,所以在音频部分写下文件路径
提交完,成功将上面的数据写入数据库后,点开下载这个文件
但是这里并没有读到1.php内的数据
in_audio和我们展开了追逐
这里我测试,读取一个不存在的文件
可以看到我并没有创建该文件
下载的结果是里面什么信息都没有,说明确实是可以读的,由于某种不可阻挡的潜在的东西阻止了我们
ps:后面我去溯源,并没有发现类似过滤的东西
查找in_audio家属关系
于是我查找它自带的文件也在同一目录下的ajax.php
找到了!我就说可以的!
缉拿in_audio归案
我们读取数据库配置文件,是这个config.inc.php文件,需要跳三个目录能到达
Comments NOTHING