WEB:ics-07

背景知识

php弱类型

文件上传漏洞

一句话木马

floatval函数

题目

点击项目管理

点击查看源代码,发泄一个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');
}

如果传入的参数page的值不是index.php,则包含flag.php,否则重定向到?page=flag.php。

isset() 函数:检测变量是否已设置并且非 NULL

show_source()函数:对文件进行语法高亮显示

header() 函数:向客户端发送原始的 HTTP 报头

复制代码
<?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\'] = True的情况下,POST提交**con和file** 两个参数,对`filename`进行正则判断 ,如果判断正确文件会被上传到uploaded/backup目录下。正则匹配这里把一些后缀加入了黑名单

preg_match 函数:执行一个正则表达式匹配

chdir() 函数:改变当前的目录,需规定新目录

fopen() 函数:打开文件或者 URL(并伴随权限)

fwrite () 函数:向文件写入字符串,成功返回写入的字符数,否则返回 FALSE

fclose() 函数:关闭文件

复制代码
<?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;
}
?>

流程是:

1、先传入

2、进行正则过滤

3、改变目录

4、打开文件

5、写入文件

6、关闭文件

(这有不就是文件上传漏洞嘛,上传一句话木马,或者图片马)

且上传的路径为/uploaded/backup/

代码3:

floatval():返回变量的浮点值

substr():截取,这里是截取id的最后以为 必须是9

mysql_real_escape_string() :转义 SQL 语句中使用的字符串中的特殊字符

mysql_query() :执行一条 MySQL 查询

mysql_fetch_object() :从结果集(记录集)中取得一行作为对象

这一段可以使$_SESSION[\'admin\'] = True。需要获取一个id参数, 并且id不为1,且最后一位等于9

这里用到了floatval这个函数,floatval 函数用于获取变量的浮点值 ,但是floatval在遇到字符时会截断后面的部分 ,比如-,+,空格等,所以可以构造id=1xx9来满足第一个if条件 ,if条件满足可以使得result变量为TRUE。成功使_SESSION[\'admin\'] = True;

构造payload

复制代码
?page=flag.php&id=1xx9

这里遇到了一个问题

Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

参考学习链接:
【攻防世界WEB】难度五星15分进阶题:ics-07_wx617e2c956ef44的技术博客_51CTO博客

【愚公系列】2023年06月 攻防世界-Web(ics-07)_愚公搬代码的博客-CSDN博客

相关推荐
黑云压城After3 小时前
H5使用环信实现视频或语音通话
前端·javascript·vue.js
未来之窗软件服务4 小时前
自己写算法(九)网页数字动画函数——东方仙盟化神期
前端·javascript·算法·仙盟创梦ide·东方仙盟·东方仙盟算法
你的人类朋友5 小时前
什么是断言?
前端·后端·安全
FIN66686 小时前
昂瑞微:实现精准突破,攻坚射频“卡脖子”难题
前端·人工智能·安全·前端框架·信息与通信
椎4956 小时前
苍穹外卖前端nginx错误之一解决
运维·前端·nginx
@。1246 小时前
对于灰度发布(金丝雀发布)的了解
开发语言·前端
我有一棵树6 小时前
前端图片加载失败、 img 出现裂图的原因全解析
前端
FIN66686 小时前
昂瑞微冲刺科创板:硬科技与资本市场的双向奔赴
前端·人工智能·科技·前端框架·智能
im_AMBER6 小时前
杂记 14
前端·笔记·学习·web
牧杉-惊蛰6 小时前
disable-devtool 网络安全 禁止打开控制台
前端·css·vue.js