flower-power

  • DNS Rebinding

查看源码发现是一个flask框架的页面
使用以下代码检查是否是内网地址

if r_ip in ipaddress.ip_network('192.168.0.0/16') \
        or r_ip in ipaddress.ip_network('172.16.0.0/12') \
        or r_ip in ipaddress.ip_network('10.0.0.0/8') \
        or r_ip in ipaddress.ip_network('127.0.0.0/8'):
        return "Definitely not a flower!"

flag.png位于/special_flower,但是只能内网访问。
通过/filter_flower,可以输入图片url,如果检测是图片,则返回图片内容。

_ = (proprietary_secret_ai_algorithm := 'Cih2Oj1yYW5kb20uY2hvaWNlcyhbMTQyNSwyMzQsMTIsMHg3QiwtOTEyLDU2LDg3LDI5NCwweDIwLDM5NCwzOCwweDRELDgwMCwxMjMsMzU2LDB4N0QsMTI4NywxNzEyLDMyLDBdLGs9NCksdls6Oi0xXVtpbnQuZnJvbV9ieXRlcyhieXRlcyhmbG93ZXJbMTAwOjEwNF0pKSAlIDRdLy84ICsgdlszXSUyMCA8IDI2MCBhbmQgKHBhdGgubG93ZXIoKS5lbmRzd2l0aCgoJy5wbmcnLCcuanBnJywnLmpwZWcnLCcuYm1wJykpIG9yIGZsb3dlci5zdGFydHN3aXRoKGJ5dGVzKFsweDg5LCAweDUwLCAweDRFLCAweDQ3LCAweDBELCAweDBBLCAweDFBLCAweDBBXSkpKSlbMV0gCg=='                                          ,proprietary_secret_ai_algorithm:=base64.b64decode(proprietary_secret_ai_algorithm))
is_flower = compile(proprietary_secret_ai_algorithm, "<0x1172947815>", "eval")
...
    check = eval(is_flower,None,{"flower":r.content,"path":path})

这里is_flower函数使用的python字节码形式,有点难看懂
base64解码一下

(v:=random.choices([1425,234,12,0x7B,-912,56,87,294,0x20,394,38,0x4D,800,123,356,0x7D,1287,1712,32,0],k=4),
     v[::-1][int.from_bytes(bytes(flower[100:104]),'little') % 4]//8 + v[3]%20 < 260 and 
     (path.lower().endswith(('.png','.jpg','.jpeg','.bmp')) or 
      flower.startswith(bytes([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]))))[1]

具体就是检测路径结尾是否是图片后缀,或者图片内容有png魔术头。
前面有一个随机数比大小,不知道干嘛用的,基本都能通过。
代码先对ip检测通过后,再访问url地址,这里可以使用DNS Rebinding绕过
检测时返回正常ip,访问时再返回本地ip。

使用http://ceye.io/dns-rebinding
payload

http://r.fc6p8y.ceye.io/special_flower

彩蛋

发现其他人的解法更简单

http://0.0.0.0/special_flower

原因是在linux中会将0.0.0.0修改为127.0.0.1