ssrf学习(二)

学习绕过ssrf限制的一些姿势

Advanced 1 题目部分源码如下:

1
2
3
4
5
6
7
8
$handler = $_POST["handler"];
if (preg_match('#^https?://#i', $handler) !== 1) {
echo "Wrong scheme! You can only use http or https!";
die();
} else if(preg_match('#^https?://10.0.0.3#i', $handler) === 1) {
echo "Restricted area!";
die();
}

preg_math()里面的#是模式分隔符,与/相同,这篇回答写的很清楚:https://zhidao.baidu.com/question/519454919.html

但为了方便在本地进行测试,将源码ip改为本机ip

1
2
3
4
5
6
7
8
$handler = $_POST["handler"];
if (preg_match('#^https?://#i', $handler) !== 1) {
echo "Wrong scheme! You can only use http or https!";
die();
} else if(preg_match('#^https?://127.0.0.1#i', $handler) === 1) {
echo "Restricted area!";
die();
}

0x01.利用ip格式

过滤了常用的点分十进制的ip格式,但是可以其他格式绕过:

点分十进制:     127.0.0.1
2进制:         01111111.00000000.00000000.00000001
16进制:        7f.00.00.01(http://0x7f000001)
10进制:       2130706433  工具 https://www.ipaddressguide.com/ip
8进制:        0177.0000.0000.0001

在线转换工具: http://tool.oschina.net/hexconvert/

上述格式只有http://0x7f000001在本机上实验成功了,其他的都是400 bad request…,可能是环境导致的

0x02.利用URL解析

URL结构:

scheme://user:pass@host:port/path?query=value#fragment

如,访问需要登录的ftp服务时,可以直接指定用户名和密码:

ftp://user:pass@ctf.dropsec.xyz

这个@符号后面的就是要访问的host,请求上述URL,得到抓包数据:

GET ftp://user:pass@ctf.dropsec.xyz/ HTTP/1.1
Host: ctf.dropsec.xyz

则可以构造类似:

http://abced@127.0.0.1

形式的URL,curl实际请求的是http://127.0.0.1

0x03.利用URL重定向

关于重定向,这篇文章讲述的很好

如果服务器对URL和host均进行了检测过滤,可以通过生成短网址的方式绕过,如,利用短网址生产工具https://tinyurl.com/ ,将http://127.0.0.1转换后,访问生成的网址https://tinyurl.com/30j9,它会重定向到http://127.0.0.1

0x04.利用DNS泛域名解析

这篇文章提到:DNS的泛域名解析也可以理解为带通配符的解析记录,带通配符的解析记录是用来为不存在的子域提供解析请求响应的方法。 例如:存在一个域example.com,如果我们设置通配符记录*.example.com,对所有example.com域中不存在的子域,例如:abcd.example.com、efgh.example.com的请求都会指向example.com。

可以借助xip.ioxip.name这两个DNS泛域名进行绕过,例如:

http://abcd.127.0.0.1.xip.io
http://abcd.127.0.0.1.xip.name

参考文章:

https://www.freebuf.com/articles/web/135342.html

https://mp.weixin.qq.com/s/bjjChubAvo8iOUYYU78uaw

https://mp.weixin.qq.com/s/FXInesMfXaz1l9DibxmMKw