web351
没过滤
url=127.0.0.1/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');
}
?>
parse_url是PHP的一个用于解析 URL 的函数。它可以将一个 URL 字符串解析为其组成部分,包括协议、主机、路径、查询参数等。这个函数可以帮助开发人员方便地获取 URL 中的各个部分信息,从而进行相应的处理和操作。
以下是一个使用parse_url函数解析URL的示例:
$url = "https://www.example.com/path/to/page?query=123";
$url_parts = parse_url($url);
echo "Scheme: " . $url_parts['scheme'] . "<br>";
echo "Host: " . $url_parts['host'] . "<br>";
echo "Path: " . $url_parts['path'] . "<br>";
echo "Query: " . $url_parts['query'] . "<br>";
输出结果将会是:
Scheme: https
Host: www.example.com
Path: /path/to/page
Query: query=123
这里url前要求以http或https开头,并且不能出现127.0.0,这里可以试试十进制ip地址代替,127.0.0.1的十进制是2130706433。
payload:url=http://2130706433/flag.php
web353
句号一起过滤,用上题的方法也可以。也可以用下面的。这个大佬的文章总结的非常好
https://blog.csdn.net/uuzeray/article/details/136182958?spm=1001.2014.3001.5506
特殊语法绕过
Windows 下 0 代表的是0.0.0.0
而Linux 下 0 代表的是127.0.0.1
127.0.0.1 可以省略为 127.1(Windows和Linux下均可)
127。0。0。1 可以替代127.0.0.1(Linux可)
payload:url=http://0/flag.php
web354
网络上存在一个名为
sudo.cc的服务,放访问这个服务时,会自动重定向到
127.0.0.1。
sudo.cc相当于127.0.0.1,用它代替即可
web355
url=http://127.1/flag.php,linux和windows127.1都可以代替127.0.0.1。这题也可用0代替127.0.0.1
但是前面的协议用https就不得这题,奇怪。
web356
这题长度限制为3,那只能用0来代替了。url=http://0/flag.php
web357
web355
url=http://127.1/flag.php,linux和windows127.1都可以代替127.0.0.1。这题也可用0代替127.0.0.1
但是前面的协议用https就不得这题,奇怪。
web356
这题长度限制为3,那只能用0来代替了。url=http://0/flag.php
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');
}
?>
浏览网页过程中,用户在地址栏中输入包含域名的网址,浏览器通过DNS服务器将域名解析为IP地址,然后向对应的IP地址请求资源,最后展现给用户。即 域名 =>公共DNS服务器 => IP
但是作为域名的所有者,可以随时设置解析IP,举例如下:
用户第一次访问,解析域名test.gm7.org的IP为104.21.26.222
在用户第二次访问前,修改域名解析的IP为127.0.0.1
用户第二次访问,解析域名test.gm7.org的IP为127.0.0.1
[!tip]
一般来说我们的操作系统默认能够将DNS返回来的这个IP地址信息保存60秒,而超过60秒后如果需要再次访问这个域名,就会重新去请求一次dns
对于浏览器来说,两次访问的都是同一域名,是符合浏览器的同源策略的,但是第二次访问解析到其他IP,调用到了其他资源.
这样的行为被称之为域名重新绑定攻击(DNS ReBinding)。
参考原文链接:https://blog.csdn.net/wangluoanquan111/article/details/132005006
ceye.io注册个号,得到一个域名。按说明绑定俩ip地址,一个是127.0.0.1另一个看你自己喜欢哪个。
payload:url=http://r.xxxx.ceye.io/flag.php
gethostbyname来获取域名的真实ip
用dns重定向,原因:在题目代码中一共对域名进行了两次请求,第一次是 gethostbyname 方法,第二次则是 file_get_contents 文件读取,可以通过 DNS重绑定来实现攻击。你绑定两个ip地址,gethostbyname每次只会随机查到某一个,有可能过gethostbyname($x[‘host’]);
这关的时候被查到的是其他ip,file_get_contents时查的是127.0.0.1,然后flag就出来了。一次不成功多发几次,这个看概率。
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);
}
可以@绕过。url=http://ctf.@127.0.0.1/flag.php#show,#可以注释掉show。bp发包
在HTTP协议中,URL中的@符号通常用于指定用户名和密码,其后面的部分被认为是主机名。因此,当浏览器解析URL时,会将@符号后的部分(10.10.10.10)视为主机名,而不再将其解析为用户名和密码。
因此,无论是http://www.baidu.com@10.10.10.10还是http://10.10.10.10,浏览器都会将10.10.10.10视为主机名,而不会将其与www.baidu.com或http://www.baidu.com这部分进行关联。因此,这两个URL最终都会请求访问10.10.10.10这个IP地址对应的服务器。
web359
打无密码mysql,随便输入账号密码抓包,发现有个return参数,返回个地址。这里可能存在ssrf。
用gopherus构造payload,写入文件。
payload中3306/_后面的内容要再url编码一次,然后bp传。再蚁剑连接传的木马,即可拿下网站。
web360
打redis,参考https://blog.csdn.net/hackzkaq/article/details/135867482
<?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); ?>利用gopherus
选择redis服务,选择phpshell。写入一句话。bp里面payload的//127.0.0.1:6379/_后面的东西再url编码一次然后放包,等待响应要点时间,然后网页会重新加载,没事继续蚁剑连接木马shell.php,拿下。