zyNo.8 andNo.9(包含sql相关笔记)

[GXYCTF2019]CheckIn(Crypto)

先用随波逐流base64解码,后来搜了一下后面要用rot解码(以下是解码程序给出的解释很明白,总的来说就是和凯撒密码很像偏移代换)

ROT5、ROT13、ROT18、ROT47 编码是一种简单的码元位置顺序替换暗码。此类编码具有可逆性,可以自我解密,主要用于应对快速浏览,或者是机器的读取,而不让其理解其意。

ROT5 是 rotate by 5 places 的简写,意思是旋转5个位置,其它皆同。下面分别说说它们的编码方式:
ROT5:只对数字进行编码,用当前数字往前数的第5个数字替换当前数字,例如当前为0,编码后变成5,当前为1,编码后变成6,以此类推顺序循环。
ROT13:只对字母进行编码,用当前字母往前数的第13个字母替换当前字母,例如当前为A,编码后变成N,当前为B,编码后变成O,以此类推顺序循环。
ROT18:这是一个异类,本来没有,它是将ROT5和ROT13组合在一起,为了好称呼,将其命名为ROT18。
ROT47:对数字、字母、常用符号进行编码,按照它们的ASCII值进行位置替换,用当前字符ASCII值往前数的第47位对应字符替换当前字符,例如当前为小写字母z,编码后变成大写字母K,当前为数字0,编码后变成符号_。用于ROT47编码的字符其ASCII值范围是33-126,具体可参考ASCII编码

稍微改一下就能得到flag

荷兰宽带数据泄露(Misc)

因为题目是宽带数据泄露,搜了一下有个软件叫Router Pass View路由密码查看器

导入bin文件,查找username或者password等关键词试了一下发现username是要找的flag(说实话这个写不出啥知识点就是让我认识了一个软件,哈哈那就再送一道misc吧)

哈哈下面这个知识点这个本来是找的一道misc题显示CRC校验错误,但是后来发现能直接用随波逐流炸出来就当了解知识点了

CRC校验是数据通信领域中最常用的一种查错校验码(CRC校验-优快云博客),是嵌入式软件开发者得必备看了简单介绍总结一句话和一张图。嵌入式开发就是你写程序控制硬件电路去实现电子产品的智能控制功能具体知识这上面很全但是目前没有必要了解,先放在这里吧,感兴趣可以看一看什么是嵌入式开发?-优快云博客

[MRCTF2020]千层套路(Misc)

下载压缩包发现要密码

牛逼了,真是千层只能去偷脚本了

一开始的脚本只能找到flag文件,没有解压

import zipfile(用于处理.zip压缩文件的相关操作,如解压等)
import os

os 模块的作用和功能:

  • 文件和目录操作
    • 创建和删除目录:可以使用 os.mkdir() 创建单个目录,os.makedirs() 创建多层嵌套目录;os.rmdir() 删除单个空目录,os.removedirs() 删除多层空目录(如果它们都是空的)。
    • 检查文件和目录是否存在:通过 os.path.exists() 函数来检查指定路径的文件或目录是否存在。
    • 获取文件和目录信息:例如 os.path.getsize() 获取文件大小,os.path.getmtime() 获取文件的最后修改时间等。
    • 遍历目录:可以使用 os.walk() 函数递归地遍历目录树,获取每个目录下的文件和子目录信息。
  • 路径操作
    • 拼接路径os.path.join() 函数可以根据当前操作系统的规则正确地拼接路径,避免因操作系统不同(Windows 和 Linux 等)而导致的路径分隔符问题。
    • 获取路径的不同部分:如 os.path.dirname() 获取路径中的目录部分,os.path.basename() 获取路径中的文件名部分等。
  • 环境变量操作
    • 获取和设置环境变量:可以通过 os.environ 获取所有环境变量的字典,使用 os.environ.get('变量名') 获取特定环境变量的值,os.environ['变量名'] = '值' 设置环境变量的值(注意:设置环境变量可能需要管理员权限,并且在某些情况下可能不会持久化)。
    • 获取当前工作目录os.getcwd() 函数返回当前工作目录的路径。
    • 切换工作目录os.chdir() 函数可以改变当前工作目录。


import shutil

shutil 模块的主要功能:

  • 文件复制
    • shutil.copy(src, dst):将源文件 src 复制到目标路径 dst 。如果 dst 是一个目录,那么会将源文件复制到该目录下,文件名不变;如果 dst 是一个完整的路径(包括文件名),则将源文件复制到该路径并覆盖同名文件(如果存在)。
    • shutil.copy2(src, dst):与 shutil.copy 类似,但会尽可能保留源文件的元数据(如访问时间、修改时间等)。
    • shutil.copytree(src, dst):递归地复制整个目录树,从源目录 src 复制到目标目录 dst 。如果目标目录已存在,会抛出 FileExistsError 异常,除非设置 dirs_exist_ok=True 。
  • 文件移动
    • shutil.move(src, dst):将源文件或目录 src 移动到目标路径 dst 。如果 dst 是一个目录,那么会将源文件或目录移动到该目录下;如果 dst 是一个完整的路径(包括文件名),则将源文件或目录移动到该路径并可能重命名。
  • 文件和目录删除
    • shutil.rmtree(path):递归地删除整个目录树,包括目录下的所有文件和子目录。使用时要小心,因为删除操作是不可逆的。


def extract_all_layers(zip_file, max_layers=100(最大解压层数,默认为 100,最后一行()调用时设置为 10000。)):
    current_file = zip_file
    layer_count = 0

    # 设置一个临时的工作目录,尽量减少路径长度
    base_dir = os.path.join(os.getcwd(), "temp_extraction")(创建一个临时工作目录,用于存放解压过程中的中间文件)
    os.makedirs(base_dir, exist_ok=True)(确保基础目录存在)
    relative_path = os.path.basename(current_file)(获取当前文件的文件名)

    # 复制初始压缩文件到临时目录
    shutil.copy(current_file, os.path.join(base_dir, relative_path))(将初始压缩文件复制到临时目录中)
    current_file = os.path.join(base_dir, relative_path)

    while True:
        if layer_count >= max_layers:
            print("达到最大解压层数限制")
            break(循环解压)

        try:
            # 获取当前压缩包名称作为密码
            password = os.path.basename(current_file).replace('.zip', '')(将当前文件的文件名(去掉.zip后缀)作为密码。)
            extract_folder = os.path.join(base_dir, password)(创建一个以密码命名的文件夹,用于存放当前层解压后的文件。)

            os.makedirs(extract_folder, exist_ok=True)(确保该文件夹存在)

            with zipfile.ZipFile(current_file, 'r') as zip_ref:

1. zipfile.ZipFile 类

zipfile.ZipFile 是 Python 标准库 zipfile 模块中的一个类,用于处理 ZIP 格式的压缩文件。它提供了一系列方法来读取、写入和操作 ZIP 文件内容。

2. with 语句

with 语句用于确保在代码块执行完毕后,相关资源会被正确关闭。在这里,它确保在 with 代码块结束后,打开的 ZIP 文件会自动关闭,无论代码块中是否发生异常。这是一种更安全、更 Pythonic 的资源管理方式,避免了手动调用 zip_ref.close() 可能遗漏的情况。

3. 参数说明

'r':这是打开模式,表示以只读模式打开 ZIP 文件。这意味着只能读取 ZIP 文件中的内容,而不能对其进行修改或添加新文件。


                try:
                    zip_ref.extractall(extract_folder, pwd=bytes(password, 'utf-8'))(尝试使用密码解压文件到指定文件夹)
                except RuntimeError:
                    print(f"解压失败,可能是密码错误: {password}")
                    break
                extracted_files = zip_ref.namelist()
                print(f"解压到: {extract_folder}, 解压文件: {extracted_files}")

            if len(extracted_files) == 1:
                extracted_file = os.path.join(extract_folder, extracted_files[0])
            else:extracted_files[0] 表示列表中的第一个元素,即解压后的第一个文件或目录的名称。)
                print("无法处理多个文件或文件结构异常")
                break

            # 删除已解压的 zip 文件
            os.remove(current_file)(删除已解压的.zip文件。)

            # 更新当前文件为解压后的文件
            current_file = extracted_file
            layer_count += 1

            if not zipfile.is_zipfile(current_file):((如果当前文件不是.zip文件,说明已经解压到最终文件,打印最终文件路径并跳出循环。))
                print(f"最终解压的文件: {current_file}")
                break

        except (zipfile.BadZipFile, FileNotFoundError, OSError) as e:(
            print(f"解压失败: {e}")
            break

    # 完成后将最终文件移动到工作目录外的目标路径
    final_output = os.path.join(os.path.dirname(zip_file), os.path.basename(current_file))
    shutil.move(current_file, final_output)
    print(f"最终解压文件移动到: {final_output}")

    # 删除临时工作目录
    shutil.rmtree(base_dir, ignore_errors=True)(删除临时工作目录,即使删除过程中出现错误也忽略。)


# 初始压缩包路径
initial_zip = r'E:\\回收\\attachment (1)\\0573.zip'
extract_all_layers(initial_zip, max_layers=10000)

后来用的这个脚本得出一个文件

很明显要生成二维码

随波逐流里RGB数据转图片得到二维码,扫描得flag

SimpleRev(re)

64位

ida f5 main 函数

用户需要输入dD来开始游戏,输入qQ来退出程序,否则会提示输入格式错误。Decry函数,可能用于对输出信息进行加密或解密处理。查看函数Decry

这里的src和v9需要注意,这两个输入的是16进制是高位在前,而内存中是小端序(高位在后)()

内存中表示为

                低                       高

src            4E 44   43 4C   53
v9             68 61   64 6F    77

因为后面的程序中将其当作字符运算(逐个字节,不分高低),所以需要转换

这时如果直接按R使其变为字符串,结果则是直接将十六进制从左到右一个一个转为字符(问题所在)

这时内存中的顺序为

src    53 4C  43 44  4E       
v9     77 6F  64 61  68

src    NDCLS
v9     hadow

双击key1 key2查看

text和key分别是将key3和v9,key1和src连接起来killshadow,ADSFKNDCLS

直接爆破(

  • 变量初始化

    • list1 = "killshadow":这是一个测试字符串,用于生成flag的一部分。
    • list2 = "adsfkndcls":这是一个密钥字符串,与list1配合使用。
    • flag = "":用于存储最终生成的flag字符串,初始为空。
  • 循环逻辑

    • 外层for k in range(10):循环 10 次,因为list1list2的长度都为 10,这里依次处理每个字符位置。
    • 内层for i in range(65, 123):循环遍历从 ASCII 码 65('A')到 122('z')的所有字符。
    • if((i <= ord('Z')) or (i >= ord('a'))):这个条件用于确保当前处理的字符是字母(大写或小写),因为 ASCII 码中大写字母A - Z的范围是 65 - 90,小写字母a - z的范围是 97 - 122。
    • if(list1[k] == chr((i - 39 - ord(list2[k]) + 97) % 26 + 97)):这是核心的判断条件,通过一个复杂的表达式计算出一个字符,并与list1中对应位置的字符进行比较。
      • (i - 39 - ord(list2[k]) + 97):这部分是一个计算,其中i是当前循环的 ASCII 码值,ord(list2[k])list2中对应位置字符的 ASCII 码值,通过一些数值的加减来进行某种变换。
      • % 26:对上述计算结果取模 26,这是为了将结果限制在 0 - 25 的范围内,可能与字母表的循环有关。
      • + 97:将取模后的结果加上 97,将其转换回小写字母的 ASCII 码范围(97 - 122)。
      • chr():将计算得到的 ASCII 码值转换为字符。
      • 如果计算得到的字符与list1中对应位置的字符相等,则将当前的i对应的字符添加到flag字符串中,并使用break跳出内层循环,继续处理下一个位置。
  • 输出结果

    • print("flag{"+flag+"}"):最后将生成的flag字符串以flag{}的格式输出。

示例计算

假设当前k = 0,即处理第一个字符位置。

  • list1[0] = 'k'list2[0] = 'a'ord('a') = 97
  • 内层循环开始,当i = 75'K'的 ASCII 码)时:
    • (75 - 39 - 97 + 97) % 26 + 97 = (36) % 26 + 97 = 10 + 97 = 107chr(107) = 'k',与list1[0]相等,所以将'K'添加到flag中,然后跳出内层循环。

)得到flag

[SUCTF 2019]EasySQL(Web)

mysql数据库sql语句的默认结束符是以";"号结尾,在执行多条sql语句时就要使用结束符隔
开,而堆叠注入其实就是通过结束符来执行多条sql语句sql注入之堆叠注入-优快云博客(这个文章开头的介绍比较浅显易懂)

   只有1回显,尝试堆叠注入

暴库

爆表

暴字段,都显示Nonono应该from被否了,只能猜测一下后端代码了

传参类型为post,方式为query,根据前面的回显: [0] => 1(1可能代表Ture ),输入0或字符没有回显,可以判断出,后端可能使用的是逻辑或,即条件为真进行回显或条件不满足返回空白,

逻辑或:|| 两边,一侧为1则取1,否则取0。

(这是在wp中的知识补充有点意思的)

将或逻辑改为与(1;set sql_mode=PIPES_AS_CONCAT;select 1)

得到flag

 注入之联合查询的基本流程(Mysql数据库)。

1. 显错判断注入点。

·使用and 1=1 页面正常。and 1=2  页面不正常。

·使用引号('或"),报错就说明存在注入

·尝试在语句末尾加注释,如果页面不变可能存在注入(不太准确)。

例如:遇到url栏中输入’报错,可是sql语句不执行的情况下,可能是有id='1'的限制。这时,可以这样输入id=1'#或id=1'--+(在#和--+前就可以执行sql语句了)

·注:#如果被吞,可以改成 %23。

·注:#注释是mysql数据库特有的。

·注:--+注释大部分常见的数据库都有。

·如果是数字型传参,可以尝试参数+1或-1 (例如id=1+1 或id=1-1)因为在SQL语句中时可以执行运算的。比较好用的是 -1,因为+有时候会当成空格执行

例如:

http://www.xxx.com/new.php?id=1   页面显示id=1的新闻

http://www.xxx.com/new.php?id=2-1  页面显示id=1的新闻

and 1=1 and 1=2 被拦截的可能性太高了

可以尝试 and -1=-1 and -1=-2

·或者直接 or sleep(5),如果页面转圈圈了,就存在SQL注入。

2. 判断当前页面字段总数。

·判断字段数的原因:是为了使用联合查询,因为在union 内部的 select 语句必须拥有相同数量的列。

·语句为:order by语句用于根据指定的列对结果集进行排序。

order by 语句默认按照升序对记录进行排序。

·order by x(x从1开始)

例如:如果 order by 3 页面不正常,说明数据库只有2个字段

3. 判断显示位。

·需要判断显示位的原因:因为页面的内容都是选择性输出的,所以要用到该语句。

比如有两个字段,第一个字段是id,第二个字段是网页的内容,用这个语句就是为了找到显示这个网页内容的字段。

·例如:页面只会显示页面数据的字段内容,不会显示id字段的内容。所以,要找到哪个地方能够输出。

·语句为:id=9.9 union select 1,2,3……(有多少个字段,就到几)

4. 查看当前的数据库。

·语句为:id=9.9 union select 1,2,x,database()

·参数必定要为假或使用and 1=2,显示位的数字改为database()

5. 查表名。

·在mysql数据库中(.)是选中的意思。

例如语句为:information_schema.tables.a

则意思为:在information_schema数据库中选择tables表的a 字段。

·语句为:id=9.9 union select 1,2,table_name from information_schema.tables where table_schema = database() limit x,1

或id=9.9 union select 1,2,table_name from information_schema.tables wheretable_schema ='数据库名' limit x,1

·注:x,用于判断还有没有其它的表,从0开始。

6. 查列名。

·语句为:id=9.9 union select 1,2,3,column_name,5,6,7,8,9,10 from information_schema.columns where table_name = '表名' limit x,1

·或id=9.9 union select 1,2,3,group_concat(column_name),5,6,7,8,9,10 from information_schema.columns where table_name = '表名' limit x,1

7. 查字段内容。

·语句为:id=9.9 union select 1,用户名段(密码段) from 表名 limit 0,1

关于sql回显注入这个文章写的太好了没什莫废话都是干货适合快速入门 mysql错误回显注入_SQL注入之显错注入-优快云博客

感觉知识点跟套娃一样,越套越多,根本学不完啊【哭泣】【求心疼】

[ACTF2020 新生赛]Exec(Web)

常见的Web漏洞——命令注入-优快云博客)命令注入这个文章写的也蛮好呢

ping了个1,炸出格式应该是(0.0.0.1)ping一下本地回环地址127.0.0.1

(补充知识点)

Loop本地回环
定义:Loop本地回环通常指的是以127开头的IP地址段(127.0.0.1 – 127.255.255.254),其中127.0.0.1是最常用的地址,被称为本地回环地址(Loop back address)。
特点:不属于任何有类别地址类,代表设备的本地虚拟接口,默认被看作是不会宕掉的接口。
主要作用:
测试本机的网络配置:通过ping 127.0.0.1检查本机网卡和IP协议安装是否正常。
应用程序的资源调用:在SERVER/CLIENT程序中,当在同一台机器上运行且没有其他SERVER时,可以将SERVER的IP设为127.0.0.1,程序可以正常运行。

根据博主以往经验(以后就是我了嘻嘻),flag一般放在根目录下。所以我们使用常见的命令拼接字符对命令进行拼接,查询下根目录。我们构造一下查询语句:127.0.0.1 && ls /([一个ip地址] [命令拼接符] [访问根目录]

(补充)

命令拼接符&、&&、|、||等
命令拼接符:
|、||、&、&&的区别:
&:无论左边是false还是true,右边都执行
&&:具有短路效果,左边是false,右边不执行。
|:无论左边是false还是true,右边都会执行
||:具有短路效果,左边是true,右边不执行。
短路效果:逻辑运算符的短路效果逻辑运算符当能得到结果时,就不会再继续运算右边的代码,以节省空间以及一定的性能,称为短路效果。

注意127.0.0.1 & cat flag是访问不到flag的因为我们当前所在的目录并不在根目录下。要输入127.0.0.1 & cat /flag成功得到flag

[强网杯 2019]随便注(Web)

爆表

暴字段

爆数据

得到flag

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值