File Inclusion
产生场景:
由于服务器脚本根据用户点击页面传入的参数进行文件包含的时候,没有对点击页面传入的参数进行有效过滤,导致可能包含任意文件。若还对传入的参数,在页面上进行输出,那么还可能存在XSS漏洞。
错误的过滤机制示范:
完全没有过滤:若对参数完全没有过滤,直接引入相关文件,那么将会导致直接包含任意文件(前提是知道可能存在的文件名、路径)。若还将传入的参数值在页面进行输出,那么还必将导致XSS攻击。
由于dvwa的源码中,并未对传入的参数进行页面上的输出,所以,这里不存在xss漏洞。
黑名单的方式进行过滤:我个人的感悟是,只要是使用黑名单的过滤方式,那么就非常有可能有某种奇淫技巧进行绕过。
下面是dvwa中进行的错误的过滤方法,一一提供绕过方式。
第一种
源码中的黑名单只有四个,而对于str_replace()这个函数来说,它是区分大小写的进行替换。因此,若你想包含远程文件,比如你自己的服务器上的钓鱼网页,那么只需要将http进行大小写转换即可。亦或是其他的能让电脑认识你的输入是http,而却不属于这个黑名单之中的写法都可以。
很多人都喜欢../../../../../etc/password这样的包含linux系统本地文件的方法。亦或者是..\..\..\..\..\..\..\windows\win.ini包含windows系统文件的方法。但是,这里却对这种方法进行了过滤。绕过的方法也非常简单,只需要变成/etc/password这类格式即可。原理就是前者是不知道目录格式的情况下为了到达跟目录。后者是直接猜测网站目录。如果知道真实目录路径,那是最好的情况了。
第二种
源码中依旧使用了黑名单策略。当然也可以理解为范围比较广泛的白名单策略。他的代码逻辑就是,只要传入的参数值是以file开头,那么便可以直接包含。若不是以file开头,并且不是include.php文件,那么就报错。
这样咋一看是无法绕过,但是,实验中发现若是参数值为"file1.php../../../../../etc/password"或者"file1.php..\..\..\..\..\..\..\windows\win.ini"那么便满足了过滤条件。直接执行逻辑包含该文件。这就是我说的“计算机能认识你的输入,但是过滤机制却能绕过”的思路。
正确的白名单机制:
可以看到,对传入的参数值限定的非常死,只能是提前规定好的值才能传入、包含该文件。否则,一律报错。
总结:防止各种绕过的重点就一句话——白名单!而绕过各种过滤的重点也只有一句话——思路一定要骚!