做题(1)

1.fileinclude

打开 发现提示flag在flag.php里边

做题(1)_第1张图片

查看页面源代码

做题(1)_第2张图片

$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 

做题(1)_第3张图片

base64解密得到答案 cyberpeace{5d4463d367bc49c7767a96cfec72c6ee}

做题(1)_第4张图片

2.fileclude

做题(1)_第5张图片 做题(1)_第6张图片

分析源码:

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

做题(1)_第7张图片 得到base64编码 解码 得到flag

cyberpeace{301551117bf02b4c38abeebf68998878}

做题(1)_第8张图片

 3.file_include

做题(1)_第9张图片

做题(1)_第10张图片 打开发现是文件包含

get传参filename 用filter来绕过

做题(1)_第11张图片

发现用正常的filter绕过不成功 去百度了一下filter绕过方式 发现了很多不一样的绕过姿势

用手测?filename=php://filter//convert.iconv.SJIS*.UCS-4*/resource=flag.php 可以绕过 换了一个过滤器

做题(1)_第12张图片 

4.catcat-new 

做题(1)_第13张图片 进入环境,先用dirsearch扫描一下

这题扫描也没扫出来

看了别人的wp 发现了新的知识点

点击副页发现了这个url

观察URL,可以发现URL上使用get请求传递了一个名为file的参数,所以猜测可能存在文件包含漏洞。

在URL上传递参数file=../../../etc/passwd发现存在漏洞

读取当前进程的命令行参数?file=../../../../proc/self/cmdline,发现有一个通过python启动app.py的命令。 所以可以得出该网站使用Python框架,并且因为有app.py可知使用的是flask框架。 

解体思路:Linux系统敏感文件,flask_session_cookie_manager伪造session并执行,session存储在cookie中

以我现在的能力做不出来 先去了解了知识点的这些东西

XCTF-Web-catcat-new_weixin_45723896的博客-CSDN博客 

大佬博客 一周之内会复现成功

5.Web_php_include 

做题(1)_第14张图片 

重点在include($page),使用了include这个文件包含函数,被include包含的$page通过get方式传入且可控。所以存在文件包含漏洞。但在判断中通过strstr过滤了"php://"

当传入的page存在php://时候替换为空

可以利用php伪协议。而strstr是区分大小写的,所以可以通过大小写绕过过滤

首先通过大小写及报错,确定是linux系统

做题(1)_第15张图片 这时候就可以利用php伪协议+linux命令执行语句来做

也可以用data协议来做

data://伪协议可以执行php代码,格式如下:

data://text/plain,要执行的代码

如果特殊字符被过滤,还可以使用base64编码

data://text/plain;base64,编码后的代码 

?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCdscycpPz4= 

做题(1)_第16张图片 发现了flag文件 再次编码之后放包  ?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmw0Z2lzaXNpc2gzcjMucGhwJyk/Pg==

 

做题(1)_第17张图片

得到flag

做题(1)_第18张图片

 

 

知识点

 1.2.3题

文件包含漏洞

也是一种“注入型漏洞”,其本质就是输入一段用户能够控制的脚本或者代码,并让服务器端执行。

    require(),找不到被包含的文件时会产生致命错误,并停止脚本运行。
    include(),找不到被包含的文件时只会产生警告,脚本将继续运行。
    include_once()与include()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
    require_once()与require()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。

 做题(1)_第19张图片

过滤器
字符串过滤器

string.rot13

string.rot13(自 PHP 4.3.0 起)使用此过滤器等同于用 str_rot13()函数处理所有的流数据。

str_rot13—对字符串执行ROT13转换. ROT13编码简单地使用字母表中后面第13个字母替换当前字母,同时忽略非字母表中的字符。编码和解码都使用相同的函数,传递一个编码过的字符串作为参数,将得到原始字符串。

string.toupper

string.tolower(自 PHP 5.0.0 起)使用此过滤器等同于用 strtolower()函数处理所有的流数据。

strtoupper—将字符串转化为大写

string.tolower

(自 PHP 5.0.0 起)使用此过滤器等同于用 strtolower()函数处理所有的流数据。

strtolower—将字符串转化为小写

string.strip_tags

使用此过滤器等同于用 strip_tags()函数处理所有的流数据。可以用两种格式接收参数:一种是和strip_tags()函数第二个参数相似的一个包含有标记列表的字符串,一种是一个包含有标记名的数组。

strip_tags—从字符串中去除 HTML 和 PHP 标记.该函数尝试返回给定的字符串str去除空字符、HTML 和 PHP 标记后的结果。它使用与函数fgetss()一样的机制去除标记。

转换过滤器

如同 string.* 过滤器,convert.* 过滤器的作用就和其名字一样。转换过滤器是 PHP 5.0.0 添加的。对于指定过滤器的更多信息,请参考该函数的手册页。

convert.base64

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

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参数作为从编码载荷中剥离的类型提示。

convert.iconv.*

这个过滤器需要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博客

4题

/etc/passwd

该文件储存了该Linux系统中所有用户的一些基本信息,只有root权限才可以修改。其具体格式为 用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell(以冒号作为分隔符)

/proc/self

proc是一个伪文件系统,它提供了内核数据结构的接口。内核数据是在程序运行时存储在内部半导体存储器中数据。通过/proc/PID可以访问对应PID的进程内核数据,而/proc/self访问的是当前进程的内核数据。

/proc/self/cmdline

该文件包含的内容为当前进程执行的命令行参数。

/proc/self/mem

/proc/self/mem是当前进程的内存内容,通过修改该文件相当于直接修改当前进程的内存数据。但是注意该文件不能直接读取,因为文件中存在着一些无法读取的未被映射区域。所以要结合/proc/self/maps中的偏移地址进行读取。通过参数start和end及偏移地址值读取内容。

/proc/self/maps

/proc/self/maps包含的内容是当前进程的内存映射关系,可通过读取该文件来得到内存数据映射的地址。

flask-session结构

flask_session是flask框架实现session功能的一个插件。其session结构分为三部分:序列化内容+时间+防篡改值,这三部分内容加密后以符号 “.”来进行分隔。flask_session默认session的储存是在用户Cookie中。但也可以指定存储在数据库,缓存中间件,服务器本地文件等等之中。

/proc/self/environ

/proc/self/environ文件包含了当前进程的环境变量

/proc/self/fd

这是一个目录,该目录下的文件包含着当前进程打开的文件的内容和路径。这个fd比较重要,因为在Linux系统中,如果一个程序用 open() 打开了一个文件,但是最终没有关闭它,即使从外部(如:os.remove(SECRET_FILE))删除这个文件之后,在/proc这个进程的fd目录下的pid文件描述符目录下还是会有这个文件的文件描述符,通过这个文件描述符我们即可以得到被删除的文件的内容。通过/proc/self/fd/§pid§来查看你当前进程所打开的文件内容。

当pid不知道时,我们可以通过bp爆破,pid是数字。

/proc/self/exe

获取当前进程的可执行文件的路径

 

 

 

你可能感兴趣的:(android)