目录
[第五空间 2021]WebFTP
[LitCTF 2023]PHP是世界上最好的语言!!
[SWPUCTF 2021 新生赛]PseudoProtocols
[LitCTF 2023]导弹迷踪
[NISACTF 2022]easyssrf
[第五空间 2021]WebFTP
1.进入页面,发现是登录页面,想到
弱口令;
sql万能密码;
webftp2011的漏洞;
扫目录;
看前端源代码有没有泄露些内容;
2.经过尝试,最后使用disearch来扫描,发现.git文件和phpinfo.php
3.访问phpinfo.php找到flag
[LitCTF 2023]PHP是世界上最好的语言!!
1.根据题目提示,flag在根目录下,所以在右边边框执行php代码,并且查看根目录
2.找到flag,使用cat命令得到flag
[SWPUCTF 2021 新生赛]PseudoProtocols
1.根据题目提示,需要用到php伪协议,构造payload+php://filter/read=convert.base64-encode/resource=hint.php,来读取文件
2.很明显是一串base64编码,解码可得test的php文件
3.访问这个文件,得到php代码
代码可翻译为:<?php
ini_set("max_execution_time", "180"); //脚本的最大执行时间为 180 秒。
show_source(__FILE__); //使用 show_source 函数显示当前文件的源代码。
include('flag.php'); //使用 include 语句包含另一个 PHP 文件 flag.php
$a= $_GET["a"];//从 GET 请求中获取名为 "a" 的参数,并将其值赋给变量 $a。
if(isset($a)&&(file_get_contents($a,'r')) === 'I want flag'){ //使用 isset 函数检查 $a 是否被设置,即它是否有一个值。使用 file_get_contents 函数读取由 $a 指定的文件的内容。如果文件的内容是 "I want flag",则条件为真。echo "success\n";echo $flag;
}
?>
4.分析可得与文件包含有关,有两种解法
解法一:php://input
----可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。
php://input是php语言中一个只读的数据流;通过"php://input",可以读取从Http客户端以POST方式提交、请求头“Content-Type”值非"multipart/form-data"的所有数据;
"php://input"一般用来读取POST上来,除已被处理以外的剩余数据。
说白了就是当遇到正则匹配时GET传参不能出现的敏感字符,可以通过php://input在POST上传最后绕过了检测。
解法二:data://
示例用法:
1、data://text/plain,
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>
2、data://text/plain;base64,
http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
知识点:
file://伪协议 (读取文件内容)
通过file协议可以访问本地文件系统,读取到文件的内容
data://(读取文件)和php伪协议的input类似,碰到file_get_contents()来用
data:// 数据流封装器,以传递相应格式的数据。可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行
php://input(任意代码执行)
遇到file_get_contents()要想到用php://input绕过。
php://input 可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。从而导致任意代码执行。
[LitCTF 2023]导弹迷踪
通过这道题,学到了新的解题思路,查看源代码时应该注意js文件(game.js)
1.通过查看js文件,找到flag
[NISACTF 2022]easyssrf
1.题目提示了使用 curl 连接输入的网站并返回响应包,想到使用php伪协议,使用file://伪协议 (读取文件内容)用法:
file://[文件的绝对路径和文件名]
了解什么是curl命令:curl是一个利用 URL 语法在命令行下工作的文件传输工具,该工具支持以下多种类型的传输方式,这当中包含多种协议,最常使用的有FILE、FTP、HTTP、HTTPS等协议。
资料参考:Linux curl命令最全详解-CSDN博客
强大的curl命令的介绍和一般用法_curl命令参数-CSDN博客
2.根据提示,查看/fl4g文件
3.访问这个php文件,得到代码
stristr()函数的介绍:
<?phphighlight_file(__FILE__);
error_reporting(0);$file = $_GET["file"]; //从 GET 请求中获取名为 "file" 的参数,并将其值赋给 $file 变量
if (stristr($file, "file")){ //使用 stristr 函数检查 $file 变量中是否包含 "file" 字符串。die("你败了.");
}//flag in /flag
echo file_get_contents($file); //使用 file_get_contents 函数读取 $file 变量指定的文件内容。
4.使用php伪协议,构造payload:url+?file=php://filter/write=convert.base64-encode/resource=/flag
或者进行依次的查找flag