从2021强网杯的一道题学习docx文件操作

[强网先锋]寻宝

啊对就是这道题,大佬们都贼快,菜如我还得慢慢整

key1

大佬们都一笔带过,哎,虽然简单,但是也别这么虐我们啊

我来简单写一下吧

<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);


function filter($string){
    $filter_word = array('php','flag','index','KeY1lhv','source','key','eval','echo','\$','\(','\.','num','html','\/','\,','\'','0000000');
    $filter_phrase= '/'.implode('|',$filter_word).'/';
    return preg_replace($filter_phrase,'',$string);
}

if($ppp){
    unset($ppp);
}
$ppp['number1'] = "1";
$ppp['number2'] = "1";
$ppp['nunber3'] = "1";
$ppp['number4'] = '1';
$ppp['number5'] = '1';

extract($_POST);


$num1 = filter($ppp['number1']);
$num2 = filter($ppp['number2']);
$num3 = filter($ppp['number3']);
$num4 = filter($ppp['number4']);
$num5 = filter($ppp['number5']);


if(isset($num1) && is_numeric($num1)){
    die("非数字");
}

else{

    if($num1 > 1024){
        echo "第一层";
        if(isset($num2) && strlen($num2) <= 4 && intval($num2 + 1) > 500000){
            echo "第二层";
            if(isset($num3) && '4bf21cd' === substr(md5($num3),0,7)){
                echo "第三层";
                if(!($num4 < 0)&&($num4 == 0)&&($num4 <= 0)&&(strlen($num4) > 6)&&(strlen($num4) < 8)&&isset($num4) ){
                    echo "第四层";
                    if(!isset($num5)||(strlen($num5)==0)) die("no");
                    $b=json_decode(@$num5);
                    if($y = $b === NULL){
                        echo 'NULL';
                        if($y === true){
                            echo "第五层";
                            include 'KeY1lhv.php';
                            echo $KEY1;
                        }
                    }else{
                        die("no4");
                    }
                }else{
                    die("no3");
                }
            }else{
                die("no2");
            }
        }else{
            die("no1");
        }
    }else{
        die("no111");
    }
}

先说下这个东西 extract($_POST);  

就是按post的值分配成key=》value的格式传参,然后这里就按照数组格式传就行

num1:php弱比较,num1=2048e,就绕过了

num2:科学计数法可绕过,num2=9e9,注意strlen()是计算‘\x00’的,所以只能传三个字符

num3:md5爆破,脚本如下

import hashlib
for i in range(1,1000000000):
    a=hashlib.md5(str(i).encode('utf-8')).hexdigest()
    if a[:7]=='4bf21cd':
        print(i)
        print(a)
        break
#61823470
#4bf21cdcfb6ec2d30bad53d41ebe42f2

num4:6个字符就是7的长度,弱比较,0e1234

num5: (对,就是一个空格)

 

key2

这里之前没拿python处理过docx,所以也是现学了一下,基本上有三种方法

第一种:下一个带搜索文件内容的高级搜索器

第二种:python教底层的一种,利用xml处理

import xml.etree.ElementTree as ET
import zipfile,glob,tqdm
def xml_handle(path):
    WORD_NAMESPACE ='{http://schemas.openxmlformats.org/wordprocessingml/2006/main}'
    TEXT = WORD_NAMESPACE + 't'
    word = zipfile.ZipFile(path)
    #print(word)
    xml_name = word.read('word/document.xml')
    #print(xml_name)
    #tree=ET.parse(xml_name) # 从文件
    root = ET.fromstring(xml_name) # Element
    #print(root)
    for child in root.iter(TEXT):
        if('KEY2' in child.text):
            print(child.text)
            print(path)
            return True
files=glob.glob('E:\\桌面\\比赛题目\\2021强网杯\\key2\\*\\*\\*.docx')
for doc in tqdm.tqdm(files):
    a=xml_handle(doc)
    if(a):
        break
    #秒出

这里问题蛮多的,python3.9以后和以前是不一样的,cElementTree在3.9以后被弃用了,但ElementTree会自己去调,所以没啥区别了,还要就是getiterator()函数变成了iter()

优点:速度极快,可处理其它xml类型

缺点:编写不方便,对docx支持一般

第三种:利用docx模块处理

# pip install python-docx
import docx,glob,tqdm

def docx_handle(path):
    document = docx.Document(path)
    #print(document)
    for line in document.paragraphs:
        #print(line.text)
        if('KEY2' in line.text):
            print(line.text)
            print(path)
            return True



files=glob.glob('E:\\桌面\\比赛题目\\2021强网杯\\key2\\*\\*\\*.docx')
for doc in tqdm.tqdm(files):
    a=docx_handle(doc)
    if(a):
        break
    # 14s

这个库安装时候有点坑,如果那你是python3,需要输入pip install python-docx。原本的项目已经被官方吸纳进xml库中了(但是作者你倒是把新项目地址挂出来啊,害得我找半天fuck!!!)

优点:编写简单

缺点:速度慢如老狗(3600个文件,到1200个出key,三分之一用了14s,真是垃圾)

 

ps:学习了大佬的wp后发现tqdm这个库真香啊,可以看循环进度了美滋滋。配合glob直接形成匹配的字典,tql,以后获取文件名啥的都去shi吧哈哈哈!!!

 

posted @ 2021-06-16 13:09  TJ_WaTer  阅读(148)  评论(0编辑  收藏  举报