9/1
文章共计4652个词
今天的内容有一些图,流量用户注意哦
9月的第一天,和我一起阅读吧
文章转载来源:先知社区https://xz.aliyun.com/t/8163
如何优雅地写一篇文章是我一直以来不解的问题
之前打了WMCTF,题目还行,只是非预期很快乐,比赛时checkin2感觉很有意思,就来思考个专题;
首先来说,file_put_content大概有三种情形出现;
file_put_contents($filename,"<?php exit();".$content);
file_put_contents($content,"<?php exit();".$content);
file_put_contents($filename,$content . "\nxxxxxx");
这里我们的思路一般是想要将杂糅或者死亡代码分解掉;这里思路基本上都是利用php伪协议filter,结合编码或者相应的过滤器进行绕过;其原理不外乎是将死亡或者杂糅代码分解成php无法识别的代码;
1
首先对于第一种情况
直观的看到,我们的文件名和文件内容都是可控的,这种的相对来说简单的多,我们直接控制文件名,和文件内容即可,下面分享几种方式;
1. base64编码绕过
原理其实很简单,利用base64解码,将死亡代码解码成乱码,使得php引擎无法识别;
$filename='php://filter/convert.base64-decode/resource=s1mple.php';$content = 'aPD9waHAgcGhwaW5mbygpOz8+';
这里之所以将$content加了一个a,是因为base64在解码的时候是将4个字节转化为3个字节,又因为死亡代码只有phpexit参与了解码,所以补上一位就可以完全转化;载荷效果如下:
2.rot13编码绕过
原理和base64一样,可以直接转码分解死亡代码;这里不再多说;直接看如下实验结果即可;
只是这种方法有点尴尬的是;因为我们生成的文件内容之中前面的并没有分解掉,这时,如果服务器开启了短标签,那么就会被解析,所以所以后面的代码就会错误;也就失去了作用;
3. .htaccess的预包含利用
利用 .htaccess的预包含文件的功能来进行攻破;自定义包含我们的flag文件。
$filename=php://filter/write=string.strip_tags/resource=.htaccess$content=?>php_value%20auto_prepend_file%20G:\s1mple.php
同时传入如上的代码,首先来解释$filename的代码,这里引用了string.strip_tags过滤器,可以过滤.htaccess内容的html标签,自然也就消除了死亡代码;$content即闭合死亡代码使其完全消除,并且写入自定义包含文件;实验结果如下所示:
但是这种方法也是具有一定的局限性,首先我们需要知道flag文件的位置,和文件的名字,一般的比赛中可以盲猜 flag.php flag /flag /flag.