【学习笔记】PHP之文件包含与文件穿越
一:配置PHP文件上传的指令 file_uploads = on/off —PHP脚本是否可接受文件上传 max_input_time = integer ----确定脚本在注册一个致命错误之前解析所需最长时间 max_file_uploads = integer —可以同时上传的最大文件数 memory_limit = integer M ---- 脚本最大分配内存 post_max_size = integer —对通过POST方法提交的数据大小设置上限 upload_max_filesize = integer —确定上传文件的最大大小 upload_tmp_dir = string – 指定一个位置来临时放置这些文件
二:超级变量数组$_FILES[]
三:目录穿越
目录穿越是由于Web服务器或Web应用程序对用户输入文件名称的安全性验证不足而导致的一种安全漏洞,使得攻击者通过HTTP请求和利用一些特殊字符就可以绕过服务器的安全限制,访问任意受限的文件(可以是Web根目录以外的文件),甚至执行系统命令。
通常是由于代码没有判断 拼接路径的真实路径是否合法,最终导致文件读取
./ 当前目录 …/ 上级目录 通过多层跳跃…/…/…/+路径 能够成功访问
目录穿越绕过方法
进行URL编码:点–>%2e 反斜杠–>%2f 正斜杠–>%5c 进行16为Unicode编码:点–>%u002e 反斜杠–>%u2215 正斜杠–>%u2216 进行双倍URL编码:点–>%252e 反斜杠–>%u252f 正斜杠–>%u255c 进行超长UTF-8 Unicode编码: 点–>%c0%2e %e0$40%ae %c0ae 反斜杠–>%c0af %e0%80af %c0%af 正斜杠–>%c0%5c %c0%80%5c
白名单防护 黑名单防护
文件包含
文件包含漏洞的产生原因是在通过引入文件时,引用的文件名,用户可控,由于传入的文件名没有经过合理的校验,或者校验被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。当被包含的文件在服务器本地时,就形成的本地文件包含漏洞,被包涵的文件在第三方服务是,就形成了远程文件包含漏洞。
本地包含 本地文件包含,允许攻击者通过浏览器包含本机上的文件。当一个WEB应用程序在没有正确过滤输入数据的情况下,就有可能存在这个漏洞,该漏洞允许攻击者操纵输入数据、注入路径遍历字符、包含web服务器的其他文件。
远程包含 远程文件包含,允许攻击者包含远程文件,远程文件包含需要设置allow_url_include = On,四个文件都支持HTTP、FTP等协议,相对本地文件包含更容易利用,出现的频率没有本地包含多
加载文件的四种语句 include() require() include_once()、require_once()
require: require函数一般放在PHP脚本的最前面,PHP执行前就会先读入require指定引入的文件,包含并尝试执行引入的脚本文件。require的工作方式是提高PHP的执行效率,当它在同一个网页中解释过一次后,第二次便不会解释。但同样的,正因为它不会重复解释引入文件,所以当PHP中使用循环或条件语句来引入文件时,需要用到require。
include:可以放在PHP脚本的任意位置,一般放在流程控制的处理部分中。当PHP脚本执行到include指定引入的文件时,才将它包含并尝试执行。这种方式可以把程序执行时的流程进行简单化。当第二次遇到相同文件时,PHP还是会重新解释一次,include相对于require的执行效率下降很多,同时在引入文件中包含用户自定义函数时,PHP在解释过程中会发生函数重复定义问题。
require_once / include_once:分别与require / include作用相同,不同的是他们在执行到时会先检查目标内容是不是在之前已经导入过,如果导入过了,那么便不会再次重复引入其同样的内容。
include 有返回值 遇到错误继续执行 require 无返回值 遇到错误停止执行
题目链接: [link](https://buuoj.cn/challenges#[HCTF%202018]WarmUp.
|