本文最后更新于:2019 , 八月 19日 星期一, 8:51 晚上
简介
可以在被访问的文件系统中读取或写入任意内容,往往能够从服务器上获取敏感信息文件
正常读取的文件内容没有经过校验或者不严格,用户可以控制这个变量读取任意文件
文件读取函数
file_get_contents()
highlight_file()
fopen()
readfile()
fread()
fgetss()
fgets()
parse_ini_file()
show_source()
file()
fpassthru
allow_url_fopen
:激活URL形式的fopen封装协议
,使得可以访问URL对象例如文件。
默认的封装洗衣提供用FTP和HTTP协议来访问远程文件
一些扩展库,例如zlib可能会注册更多的封装协议
靶场任意文件读取
avatar.php
文件
echo file_get_contents($_SESSION['avatar']);
可以看到该函数直接接收了一个$_SESSION['avatar']
全局查找该函数怎么来的
logCheck.php
文件
可以看到该参数是在登录的时候创建的,但是此处我们没有办法进行修改
继续寻找
logCheck.php
在该文件可以看到,这里存入数据库后,刷新了缓存
是先文件上传
>> 判断后缀
>> 拼接路径
>> 更新数据库
>> 更新$_SESSION['avatar']
其实看到这里,我有点懵,然后老司机(车王)说他会,看了之后觉得自己的思路太死板了
php $query = "UPDATE users SET user_avatar = '$avatar' WHERE user_id = '{$_SESSION['user_id']}'";
可以看到该语句并没有任何的过滤,直接写入$avatar
变量
车王告诉我:该update语句,可设置多个字段,只取最后一个字段为正确的
UPDATE users SET user_avatar = '$avatar' user_avatar='../sys/config.php' # WHERE user_id = '{$_SESSION['user_id']}'
直接屏蔽后where条件后,默认是把该字段全部写成统一的
(你可以自己添加where条件,可是我懒。。。)
最终只要在上传文件的时候在文件名处写上图片格式后缀并屏蔽掉即可
php 1.png' ,user_avatar=../sys/config.php #.png
结果
流程:
- 先上传文件 > 上传文件的时候,文件名是不能带路径,所以,你需要进行16进制编码
- 到数据库中,查看是否写入
- 再登录用户
- 访问
avatar.php
文件(只能在burp中看到读取的文件)
结束
该处不单单有读取文件,还有其他漏洞