题目:
<?php #flag in http://192.168.7.68/flag if(isset($_GET['url'])){ $url = $_GET['url']; $protocol = substr($url, 0,7); if($protocol!='http://'){ die('仅限http协议访问'); } if(preg_match('/\.|\;|\||\<|\>|\*|\%|\^|\(|\)|\#|\@|\!|\`|\~|\+|\'|\"|\.|\,|\?|\[|\]|\{|\}|\!|\&|\$|0/', $url)){ die('仅限域名地址访问'); } system('curl '.$url); }
有个注释,是写的flag在 http://192.168.7.68/flag 这个地址下,有一个url参数可以传参。
第一个限制是前七位必须是 http://
第二个是正则过略,把.
过滤了。这就很难办了,因为地址中肯定是有.
的
就肯定需要来绕过,首先想到的是ip地址编码 ip地址转十六进制
http://192.168.7.68/flag
就可以写成http://C0A80744/flag
还是被过滤了,后来发现,在过滤的众多字符中,把0也过滤了
但是IP地址转十进制、十六进制、二进制中都有0,这个想法走不通了
后来在一篇文章中发现在url中 .
可以用。
替代
那么就是可以写成http://192。168。7。68/flag
果然,得到flag