WEB16
备份是一个好习惯。题目既然给出了这样的提示,也就是说网站的源代码被管理员放在了网页服务器之上,我们这里直接在KALI中使用disreach扫描网站,发现有一个index.php.bak格式的文件,这个就是存放网站代码的备份代码。
1.用记事本打开这个代码,看看有什么发现。
<?php
/**
* Created by PhpStorm.
* User: Norse
* Date: 2017/8/6
* Time: 20:22
*/
include_once "flag.php"; //包含一次这个文件
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);//空格绕过,这个函数
//就是一个字符串代替的函数,在str中检测'key'这个字符串然后使用空格代替,所以我们需要过滤这个函数。
parse_str($str);
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){//考PHP特性,就是一个简单的MD5碰撞绕过,直接用数组绕过快一点。
echo $flag."取得flag";
}
?>
所以,我们需要考虑空格绕过和碰撞绕过就好了,空格绕过,因为我们需要在参数中传递key这个变量,但是会被函数过滤换成空格,所以我们需要双写绕过即key1—>kekeyy1,key2—>kekeyy2,然后数组绕过,给变量赋值为数组达到字符串不相同,但是他们的MD5返回值都为NULL,即相等,实现绕过。
WEB18
让我们用POST请求返回计算的结果显然是不太可能的,这里就需要我们写一个PY脚本来跑,获取flag。
本人没学过相关库的使用,这里借用别人的的脚本来测试。
import requests
import re
url = "http://114.67.246.176:14873/"
s = requests.session() #用session会话保持表达式
response = s.get(url)
equation = re.search(r'(\d+[+\-*])+(\d+)',response.text).group()
result = eval(equation) #eval()函数用来执行一个字符串表达式,并返回表达式的值。
key = {'value':result} #创建一个字典类型用于传参
flag = s.post(url,data=key) #用post方法传上去
print(flag.text) #打印flag文件
print(response.content.decode('utf-8')) #将源码转化格式打印出来
print(response.status_code) #打印状态码
拿到flag。
这个时候就该喊出我们的口号:”python 永远的神!!!“。