打开 发现提示flag在flag.php里边
查看页面源代码
$lan = $_COOKIE['language'];
这句话是关键 变量lan是用cookie传参的
@include("english.php");
这句话表明了文件包含 include函数用php伪协议 filer绕过
@include($lan.".php");
这句话表明了变量lan是和后边的php拼接的 所以传参的时候就不用在加.php了
分析完代码 用bp抓包换cooike的值
Cookie: language=php://filter/read=convert.base64-encode/resource=/var/www/html/flag
base64解密得到答案 cyberpeace{5d4463d367bc49c7767a96cfec72c6ee}
分析源码:
get传参 file1,file2
file1,file2不能为空
涉及到一个函数:
file_get_contents()函数,它是PHP中最常用的文件处理函数之一。
file_get_contents()函数用于读取文件中的内容,并将其作为字符串返回。它通常用于读取文本文件或从远程URL获取内容。
要让file2强等于hello ctf
文件包含file1
这里也是用php伪协议
file_get_contents可以用php://input绕过
文件包含用php://filter绕过
payload:
file1=php://filter/convert.base64-encode/resource=flag.php&file2=php:input
php://input还需要传参post hello ctf
cyberpeace{301551117bf02b4c38abeebf68998878}
get传参filename 用filter来绕过
发现用正常的filter绕过不成功 去百度了一下filter绕过方式 发现了很多不一样的绕过姿势
用手测?filename=php://filter//convert.iconv.SJIS*.UCS-4*/resource=flag.php 可以绕过 换了一个过滤器
这题扫描也没扫出来
看了别人的wp 发现了新的知识点
点击副页发现了这个url
观察URL,可以发现URL上使用get请求传递了一个名为file的参数,所以猜测可能存在文件包含漏洞。
在URL上传递参数file=../../../etc/passwd发现存在漏洞
读取当前进程的命令行参数?file=../../../../proc/self/cmdline,发现有一个通过python启动app.py的命令。 所以可以得出该网站使用Python框架,并且因为有app.py可知使用的是flask框架。
以我现在的能力做不出来 先去了解了知识点的这些东西
XCTF-Web-catcat-new_weixin_45723896的博客-CSDN博客
大佬博客 一周之内会复现成功
重点在include($page),使用了include这个文件包含函数,被include包含的$page通过get方式传入且可控。所以存在文件包含漏洞。但在判断中通过strstr过滤了"php://"
当传入的page存在php://时候替换为空
可以利用php伪协议。而strstr是区分大小写的,所以可以通过大小写绕过过滤
首先通过大小写及报错,确定是linux系统
也可以用data协议来做
data://伪协议可以执行php代码,格式如下:
data://text/plain,要执行的代码
如果特殊字符被过滤,还可以使用base64编码
data://text/plain;base64,编码后的代码
?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCdscycpPz4=
发现了flag文件 再次编码之后放包 ?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmw0Z2lzaXNpc2gzcjMucGhwJyk/Pg==
得到flag
文件包含漏洞
也是一种“注入型漏洞”,其本质就是输入一段用户能够控制的脚本或者代码,并让服务器端执行。
require(),找不到被包含的文件时会产生致命错误,并停止脚本运行。
include(),找不到被包含的文件时只会产生警告,脚本将继续运行。
include_once()与include()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
require_once()与require()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
string.rot13(自 PHP 4.3.0 起)使用此过滤器等同于用 str_rot13()函数处理所有的流数据。
str_rot13—对字符串执行ROT13转换. ROT13编码简单地使用字母表中后面第13个字母替换当前字母,同时忽略非字母表中的字符。编码和解码都使用相同的函数,传递一个编码过的字符串作为参数,将得到原始字符串。
string.tolower(自 PHP 5.0.0 起)使用此过滤器等同于用 strtolower()函数处理所有的流数据。
strtoupper—将字符串转化为大写
(自 PHP 5.0.0 起)使用此过滤器等同于用 strtolower()函数处理所有的流数据。
strtolower—将字符串转化为小写
使用此过滤器等同于用 strip_tags()函数处理所有的流数据。可以用两种格式接收参数:一种是和strip_tags()函数第二个参数相似的一个包含有标记列表的字符串,一种是一个包含有标记名的数组。
strip_tags—从字符串中去除 HTML 和 PHP 标记.该函数尝试返回给定的字符串str去除空字符、HTML 和 PHP 标记后的结果。它使用与函数fgetss()一样的机制去除标记。
如同 string.* 过滤器,convert.* 过滤器的作用就和其名字一样。转换过滤器是 PHP 5.0.0 添加的。对于指定过滤器的更多信息,请参考该函数的手册页。
convert.base64-encode和 convert.base64-decode使用这两个过滤器等同于分别用base64_encode()和base64_decode()函数处理所有的流数据。convert.base64-encode支持以一个关联数组给出的参数。如果给出了line-length,base64 输出将被用line-length个字符为 长度而截成块。如果给出了line-break-chars,每块将被用给出的字符隔开。这些参数的效果和用base64_encode()再加上 chunk_split()相同。
convert.quoted-printable-encode和convert.quoted-printable-decode使用此过滤器的decode版本等同于用 quoted_printable_decode()函数处理所有的流数据。没有和convert.quoted-printable-encode相对应的函数。convert.quoted-printable-encode支持以一个关联数组给出的参数。除了支持和convert.base64-encode一样的附加参数外,convert.quoted-printable-encode还支持布尔参数binary和 force-encode-first。convert.base64-decode只支持line-break-chars参数作为从编码载荷中剥离的类型提示。
这个过滤器需要php支持 iconv ,而iconv是默认编译的。使用convert.iconv.*过滤器等同于用iconv()函数处理所有的流数据。
iconv — 字符串按要求的字符编码来转换
convery.iconv.*的使用有两种方法:
1.convert.iconv.. 2.convert.iconv.
/
支持的字符编码有以下几种
UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*
还有压缩过滤器,加密过滤器,这里不做过多阐述
可见大佬博客 详解php://filter以及死亡绕过_w0s1np的博客-CSDN博客
该文件储存了该Linux系统中所有用户的一些基本信息,只有root权限才可以修改。其具体格式为 用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell(以冒号作为分隔符)
proc是一个伪文件系统,它提供了内核数据结构的接口。内核数据是在程序运行时存储在内部半导体存储器中数据。通过/proc/PID可以访问对应PID的进程内核数据,而/proc/self访问的是当前进程的内核数据。
该文件包含的内容为当前进程执行的命令行参数。
/proc/self/mem是当前进程的内存内容,通过修改该文件相当于直接修改当前进程的内存数据。但是注意该文件不能直接读取,因为文件中存在着一些无法读取的未被映射区域。所以要结合/proc/self/maps中的偏移地址进行读取。通过参数start和end及偏移地址值读取内容。
/proc/self/maps包含的内容是当前进程的内存映射关系,可通过读取该文件来得到内存数据映射的地址。
flask_session是flask框架实现session功能的一个插件。其session结构分为三部分:序列化内容+时间+防篡改值,这三部分内容加密后以符号 “.”来进行分隔。flask_session默认session的储存是在用户Cookie中。但也可以指定存储在数据库,缓存中间件,服务器本地文件等等之中。
/proc/self/environ文件包含了当前进程的环境变量
这是一个目录,该目录下的文件包含着当前进程打开的文件的内容和路径。这个fd比较重要,因为在Linux系统中,如果一个程序用 open() 打开了一个文件,但是最终没有关闭它,即使从外部(如:os.remove(SECRET_FILE))删除这个文件之后,在/proc这个进程的fd目录下的pid文件描述符目录下还是会有这个文件的文件描述符,通过这个文件描述符我们即可以得到被删除的文件的内容。通过/proc/self/fd/§pid§来查看你当前进程所打开的文件内容。
当pid不知道时,我们可以通过bp爆破,pid是数字。
获取当前进程的可执行文件的路径