今天针对ctfshow的web3进行文件包含的知识点分享。
这道题的意图其实非常明显 因为其关键include就说明了该网页存在文件包含(include、require、include_once、require_once、highlight_file、show_source、file_get_contents、fopen、file、readfile这些都是PHP中能造成文件包含的函数)这也是利用代码审计检测出的漏洞,同样如果需要黑盒检测,那就需要一些扫描工具或者手动查看一些参数值。
再确定了漏洞之后,我们需要利用这个漏洞找到flag。已知该脚本语言为PHP,利用文件包含的漏洞一般使用脚本所支持的协议。比如这道题我们可以使用PHP支持的伪协议对服务器目标文件进行查找。网上伪协议的相关知识。注意:伪协议不是在任何情况下都可以使用,每个伪协议都有不同的使用条件,当发现一个协议无法使用时可以换一个思路。这道题的思路就是查找根目录下的文件,然后从这些文件中找到flag。
Burpsuite做法:我们使用burp suite对网页抓包。网上burp suite的安装教程
要使用协议,所以在HTTP前加上? url=php://input这样一来我们就可以访问输入输出流,还可以以POST的方式提交并执行PHP代码。在最下方则加上要执行的PHP代码<?php system("ls");?>这个代码的意思就是查看根目录的所有文件名。
请求放出后
我们发现两个文件,一个index,一个ctf_go_go_go。index是网页的索引文件。 另一个很有可能是flag的文件。已经知道文件名的情况下不需要再次抓包,可以直接在网址上操作,在该网址后加上/?url=ctf_go_go_go,正好再次利用文件包含打开该文件。
得到flag值。 如果觉得burp suite操作麻烦的话我们也可以使用hackbar。hackbar可以在浏览器的扩展或插件里自行安装。
hackbar做法:在目标网页按F12打开hackbar。其实和用burp suite一样。
上方的网址出同样加上?url=php://input。因为要上传PHP代码所以要勾选Post data开启下方post的输入栏,输入执行语句。 后面的操作同burpsuite。
关于文件包含:
首先是脚本语言,可以根据关键词或者直接查看源码判断是哪种脚本语言(常见的有ASP,PHP,JSP,ASPX,Python和Javaweb)通过不同的脚本语言来确定使用什么样的伪协议。
然后是检测漏洞,一般白盒检测就是审计代码,发现关键词判断存在漏洞。黑盒检测则需要使用漏扫工具,公开漏洞和自己手动找。
其次是包含类型,分为本地包含和远程包含。本地包含就是漏洞仅能包含本地的文件,而远程包含则可以把其他主机的文件当作代码执行。远程包含需要PHP配置的allow_url_include=on为on。这也就是为什么协议有不同的使用条件原因之一。
再其次就是开始利用漏洞,使用脚本所支持的各种协议。目标围绕如何找到关键文件。
最后注意漏洞的防御,很多文件包含会固定后缀或者固定文件,但也有解决方法,可以在执行语句后加入足够多的注释符。当注释符足够多时(Windows时256个,Linux是1024个)后方的文件限制则会被忽略。如果与waf,则还要考虑waf绕过。