0


ctfshow-web入门——爆破(web21-web28)

爆破

爆破下下之策,平时题目直接是常见路径和文件名,多试试,而不是直接爆破

1.bp工具的使用

  • bp爆破的大概步骤:

抓包,Send to Intruder,Positions页面,add$(加入想要爆破的值),Payloads页面,Payload Options,Load,导入想跑的字典,点击Start attack

  • custom iterator(自定义迭代器)模式:

在这里插入图片描述在这里插入图片描述

payload type选Custom iterrator,position1填admin,position2填: ,position3导入字典,按照上面步骤直接爆破

  • 提高爆破效率的小技巧
1.加前缀和编码(Payloads中的Payload Options)

对payload进行加工:

  • add prefix—添加前缀;
  • add suffix—添加后缀;
  • Match/replace—一旦匹配到了xxx就替换成XXX;
  • reverse substring—对字符进行反转;
  • Encode—编码;
  • Hash—Hash计算

在这里插入图片描述

【注意:取消Palyload Encoding编码 因为在进行base64加密的时候在最后可能存在 == 这样就会影响base64 加密的结果】

2.添加匹配关键字,减少等待时间(Options模块)
  • Number of retries on network failure ——网络连接失败重试的次数
  • Pause before retry (milliseconds) ——重试之前时间的间隔是多少毫秒
  • Grep-Match——匹配响应信息中的关键字

在这里插入图片描述

关于base64编码的一些特点

  1. 标准base64只有64个字符(英文大小写、数字和+、/)以及用作后缀等号
  2. base64是把3个字节变成4个可打印字符,所以base64编码后的字符串一定能被4整除(不算用作后缀的等号)
  3. 等号一定用作后缀,且数目一定是0个、1个或2个。这是因为如果原文长度不能被3整除,base64要在后面添加\0凑齐3n位。为了正确还原,添加了几个\0就加上几个等号。显然添加等号的数目只能是0、1或2
  4. 严格来说base64不能算是一种加密,只能说是编码转换。使用base64的初衷。是为了方便把含有不可见字符串的信息用可见字符串表示出来,以便复制粘贴

2.爆破网站子域名

子域名检测工具: phpinfo.me

3.md5爆破

<?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: [email protected]
# @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__);}?>
  • 阅读代码,了解到需要使用get传参,得到flag
  • token需要满足两个条件:1.经过MD5加密后的token的第二位 ,第十五位,第十八位相等2.(第二位+第十五位+第十八位)/ 第二位 = 第三十二位
  • 注意的小点:

【写python代码,需要注意看清楚php代码第二个if的括号层数,以防python脚本的条件搞错了】

【如果可以,建议用和题目相同的环境去写脚本,可以直接省掉好多问题】

【python脚本需要注意分母为零的情况的异常处理,如果不处理,则会未跑出ZE,直接终止】

【php在分母为零的情况下,INF这个值在PHP中代表的是无穷大的意思,计算不当,或者计算值超过服务器的上限都会显示】

【此题也可以php直接for循环数字】

  • web23-python脚本
import hashlib
dic ="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"for a in dic:for b in dic:
        t = a + b
        md5 = hashlib.md5(t.encode("utf-8")).hexdigest()if md5[1]== md5[14]and md5[14]== md5[17]:try:if(int("0x"+md5[1],16)+int("0x"+md5[14],16)+int("0x"+md5[17],16))/int("0x"+md5[1],16)==int("0x"+md5[31],16):print(t)except:continue
  • web23-php脚本
<?phperror_reporting(0);$string='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';#62位for($a=0;$a<62;$a++){for($b=0;$b<62;$b++){$flag=$string[$a].$string[$b];$token=md5($flag);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."\n";}}}}?>
  • web23-php脚本,纯数字token
<?phpfor($i=0;$i<10000;$i++){$token=md5($i);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'token'.$i.'md5'.$token;}}}?>
  • 相关知识点
  1. md5加密特点通常用一个32位的16进制字符串表示。
  2. PHP intval() 函数整型转换函数,用户来获取变量的整数值。
  3. PHP substr() 函数
substr(string,start,length)

在这里插入图片描述

4.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: [email protected]
# @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__);echosystem('cat /proc/version');}?>
  • mt_scrand()函数&mt_rand()函数mt_scrand(seed)这个函数,是通过分发seed种子,然后有了种子后,利用mt_rand()生成随机数。
  • 当种子不变时,产生的随机数是一样的,这就是伪随机数漏洞。
  • 随机数并不随机
<?PHPmt_srand(0);echomt_rand();echomt_rand();echomt_rand();?>

将随机数播种为0,每次运行都会获得相同的序列

<?PHPechomt_rand();echomt_rand();echomt_rand();?>

去掉mt_srand()函数时,再次重复运行实例,系统会自动为rand函数播种,但也是播种一次,多次重复运行的结果也相同

  • 直接在线环境php跑一下,生成随机数
<?phpmt_srand(372619038);echomt_rand();echo"\n";?>

5.php随机数爆破

<?php/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-03 13:56:57
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-03 15:47:33
# @email: [email protected]
# @link: https://ctfer.com
*/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__);echosystem('cat /proc/version');}?>
  • isset()函数isset在php中用来判断变量是否声明,该函数返回布尔类型的值,即true/false。isset只能用于变量,因为传递任何其它参数都将造成解析错误。
  • hexdec()函数把十六进制数转换为十进制数,dechex()函数是把十进制转换为十六进制。
  • wp1. 分析代码,先传参一个r,这里可以直接传0,得出随机数的负值2. 利用r值可以推出第一个随机数3. 然后根据第一个随机数利用工具进行种子爆破,得到种子的值4. 利用种子,得出第二次,第三次的随机数

在这里插入图片描述

  • 工具

下载地址https://www.openwall.com/php_mt_seed/

工具利用参考README

第一次使用先执行make命令,利用gcc进行编译

gcc -Wall -march=native -mtune=generic -O2 -fomit-frame-pointer -funroll-loops -fopenmp php_mt_seed.c -o php_mt_seed

在这里插入图片描述

种子的选择,可以抓包看一下题目使用的PHP版本,选择PHP 5.2.1-7.0.x

在这里插入图片描述

6.数据库密码爆破

类似第一题,直接bp暴力破解数据库密码,这里GitHub找个常用密码字典就好,慢慢爆破,根据长度不同,查看响应,拿到flag
在这里插入图片描述

7.身份证出生日期爆破(也可能爆破后六位)
  • 利用bp暴力破解,或者利用脚本爆破
  • bp暴力破解出生日期###### 1.get和post请求的区别:> get请求一般用来请求获取数据> > get请求通常是通过url地址请求> > post请求一般作为发送数据到后台,传递数据,创建数据> > post常见的则是form表单请求###### 2.表单提交get和post的区别:> get(获取)重点在从服务器上获取资源,post(发送)是向服务器发送数据。> > 数据修改用post,登录用post。查询一般使用get。【注意:这里有可能连接不上数据库,需要多刷新几次,等抓包抓到数据】

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

3.Unicode在线解码工具http://www.esjson.com/unicodeEncode.html

最后利用学号和身份证号登录

  • 脚本爆破<?php//621022********5237$myfile=fopen("zid.txt","w")ordie("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);}}}for($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);}}}for($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);}}}for($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);}}}fclose($myfile);?>

8.目录爆破

  • bp暴力破解网站目录需要结合题目所给提示和url,先将文件2.txt去掉,直接爆破一级目录和二级目录
  1. 先更改攻击类型,改为Cluster bomb
  2. 设置两个需要爆破的目录在这里插入图片描述
  3. 设置payload在这里插入图片描述在这里插入图片描述
  4. 爆破完成

补充:bp-Intruder的四种模式

1.单字典(只有一个字典)
  • Sniper(狙击手):一个参数,一个字典。
  • Battering ram(攻城锤):多个参数同时遍历同一个字典。
  • 一个相当于单挑,一个相当于群殴。
2.多字典(有多少参数就有多少字典)
  • Pitchfork(草叉模式):多个参数同时进行遍历多个不同字典 示和url,先将文件2.txt去掉,直接爆破一级目录和二级目录
  1. 先更改攻击类型,改为Cluster bomb
  2. 设置两个需要爆破的目录[外链图片转存中…(img-VF3T33cY-1678966980128)]
  3. 设置payload[外链图片转存中…(img-HLouSUoh-1678966980128)][外链图片转存中…(img-aitdjKjh-1678966980129)]
  4. 爆破完成

补充:bp-Intruder的四种模式

1.单字典(只有一个字典)
  • Sniper(狙击手):一个参数,一个字典。
  • Battering ram(攻城锤):多个参数同时遍历同一个字典。
  • 一个相当于单挑,一个相当于群殴。
2.多字典(有多少参数就有多少字典)
  • Pitchfork(草叉模式):多个参数同时进行遍历多个不同字典
  • Cluster bomb(集束炸弹):像两个嵌套的for循环,参数i和参数j,i=0,然后j要从0-10全部跑完,然后i=1,然后j再从0-10跑完,一对多,多次遍历

本文转载自: https://blog.csdn.net/m0_62905745/article/details/129596940
版权归原作者 R1one 所有, 如有侵权,请联系我们删除。

“ctfshow-web入门——爆破(web21-web28)”的评论:

还没有评论