bugkuctf 备份是个好习惯,秋名山老司机,速度要快

备份是个好习惯

通过地址发现有个备份,查看大佬的wp发现有。bak文件,加上之后,下载得到一份php.bak文件

include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'],'?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo md5($key1);

echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
    echo $flag."取得flag";
}
?>

分析代码:

首先看到包含了flag.php,下面是个状态更新函数,可以忽略
strstr函数将返回从被查找字符之后的字符
其实,它是有三个参数的,string strstr( string $haystack, mixed $needle[, bool $before_needle = false] )

返回 haystack 字符串从 needle 第一次出现的位置开始到 haystack 结尾的字符串。

<?php
$email  = 'name@example.com';
$domain = strstr($email, '@');
echo $domain; // 打印 @example.com

$user = strstr($email, '@', true); // 从 PHP 5.3.0 起
echo $user; // 打印 name
?> 

substr
返回字符串的子串,原型string substr( string $string, int $start[, int $length] )
返回字符串 string 由 start 和 length 参数指定的子字符串。

如果提供了正数的 length,返回的字符串将从 start 处开始最多包括 length 个字符(取决于 string 的长度)。

如果提供了负数的 length,那么 string 末尾处的 length 个字符将会被省略(若 start 是负数则从字符串尾部算起)。如果 start 不在这段文本中,那么将返回 FALSE。

如果提供了值为 0,FALSE 或 NULL 的 length,那么将返回一个空字符串。

如果没有提供 length,返回的子字符串将从 start 位置开始直到字符串结尾。

<?php
$rest = substr("abcdef", 0, -1);  // 返回 "abcde"
$rest = substr("abcdef", 2, -1);  // 返回 "cde"
$rest = substr("abcdef", 4, -4);  // 返回 ""
$rest = substr("abcdef", -3, -1); // 返回 "de"
?> 

str_replace

str_replace( mixed $search, mixed $replace, mixed KaTeX parse error: Expected 'EOF', got '&' at position 15: subject[, int &̲count] )

该函数返回一个字符串或者数组。该字符串或数组是将 subject 中全部的 search 都被 replace 替换之后的结果。

如果没有一些特殊的替换需求(比如正则表达式),你应该使用该函数替换 ereg_replace() 和 preg_replace()。

参数

如果 search 和 replace 为数组,那么 str_replace() 将对 subject 做二者的映射替换。如果 replace 的值的个数少于 search 的个数,多余的替换将使用空字符串来进行。如果 search 是一个数组而 replace 是一个字符串,那么 search 中每个元素的替换将始终使用这个字符串。该转换不会改变大小写。

如果 search 和 replace 都是数组,它们的值将会被依次处理。

例如:

<?php
// 赋值: <body text='black'>
$bodytag = str_replace("%body%", "black", "<body text='%body%'>");

// 赋值: Hll Wrld f PHP
$vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
$onlyconsonants = str_replace($vowels, "", "Hello World of PHP");

// 赋值: You should eat pizza, beer, and ice cream every day
$phrase  = "You should eat fruits, vegetables, and fiber every day.";
$healthy = array("fruits", "vegetables", "fiber");
$yummy   = array("pizza", "beer", "ice cream");

$newphrase = str_replace($healthy, $yummy, $phrase);

// 赋值: 2
$str = str_replace("ll", "", "good golly miss molly!", $count);
echo $count;
?> 

parse_str
parse_str — 将字符串解析成多个变量

所以整个代码结合起来的意思就是得到用户输入的?后面的内容,将里面的ke’y全部置换为空,然后输出key1和key2的hash值,如果key1的hash值等于key2的hash值,且他们不相等,就输出flag

我们可以用kkeyey1绕过对key的抹杀,key1和key2都用数组表示,由于hash无法对数组加密,返回false,相同,得到flag

http://123.206.87.240:8002/web16/?kekeyy1[0]=2&kekeyy2[1]=2

秋名山老司机

两秒内计算这个式子,并且赋值给value这个变量,我们可以想到用脚本,request库。
脚本如下:

import requests
import re
url="http://123.206.87.240:8002/qiumingshan/"
s=requests.session()
u=s.get(url)
p=re.findall(r'<div>(.*)=\?;</div>',u.text)[0]
r=eval(p)
payload = {'value': r}
h = s.post(url, data=payload)
print(h.text)
'''
https://www.cnblogs.com/xiaogou/p/9233392.html
'''

脚本解释:
引入库名就不说了。
我们需要请求这个session对象,以免下次它的计算的式子会发生改变,然后是正则匹配
正则匹配的findall会返回列表,匹配的是括号里面的内容,从遇到前面的div标签开始,到后面的=?;和div的结束标签结束。通过转义符将?号转义
括号中的.代表着除了换行符之外的所有都匹配*则表示匹配多次

参考匹配链接1
参考匹配链接2
匹配的结果是只剩下这个式子,用过eval计算出来结果
用字典类型,将式子的值赋给value,然后通过post传值,最后输出运行后的内容,得到flag
隐藏后面部分内容

速度要快


查看源代码发现需要传入margin这个变量,在消息的相应头部我们发现了flag,是base64加密过的,还加密了两次。

我们对它进行解密:

再次解码:

这可能就是我们需要传入的值,因为请求一次,它的flag值就会变化一次,我们需要保证传入的post传的值与我们get方式请求得到的flag值在同一个会话中,提示要快,我们就用脚本跑一下试试。

import requests
import base64
url = "http://123.206.87.240:8002/web6/"
session = requests.Session()
myrequests = session.get(url)   # 记录下session
header_flag = myrequests.headers['flag']
header_flag_decode = base64.b64decode(header_flag)  # python3这个操作会导致生成bytes对象,python2直接可以使用decodestring
header_flag_decode = header_flag_decode.decode()    # 因为上一步解码时生成了bytes类型对象,需要转化为string,decode()默认编码是utf-8
margin_value = header_flag_decode.split(": ")[1]    # 取他说的flag内容,作为margin参数值
page = session.post(url, {"margin": base64.b64decode(margin_value)})
print(page.text)

这是大佬的脚本,我们首先得获取它的会话,然后从头部得到.headers的信息,获取flag变量,这是我写不出来的部分,学了点儿爬虫,有个地方就是我们将第一次解码后的bytes对象转化为string,就是进行再次编码,用splite()分割第一次解码后的"flag",除去列表框,进行二次解码,得到的变量再传输到margin里。
运行脚本,得到flag:
省略后面几位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值