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博客

相关推荐
泯泷2 分钟前
「译」解析 JavaScript 中的循环依赖
前端·javascript·架构
抹茶san5 分钟前
前端实战:从 0 开始搭建 pnpm 单一仓库(1)
前端·架构
Senar32 分钟前
Web端选择本地文件的几种方式
前端·javascript·html
烛阴1 小时前
UV Coordinates & Uniforms -- OpenGL UV坐标和Uniform变量
前端·webgl
姑苏洛言1 小时前
扫码小程序实现仓库进销存管理中遇到的问题 setStorageSync 存储大小限制错误解决方案
前端·后端
烛阴1 小时前
JavaScript 的 8 大“阴间陷阱”,你绝对踩过!99% 程序员崩溃瞬间
前端·javascript·面试
lh_12542 小时前
ECharts 地图开发入门
前端·javascript·echarts
jjw_zyfx2 小时前
成熟的前端vue vite websocket,Django后端实现方案包含主动断开websocket连接的实现
前端·vue.js·websocket
Mikey_n2 小时前
前台调用接口的方式及速率对比
前端
周之鸥2 小时前
使用 Electron 打包可执行文件和资源:完整实战教程
前端·javascript·electron