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

相关推荐
前端_学习之路1 小时前
React--Fiber 架构
前端·react.js·架构
伍哥的传说1 小时前
React 实现五子棋人机对战小游戏
前端·javascript·react.js·前端框架·node.js·ecmascript·js
小红卒1 小时前
upload-labs靶场通关详解:第21关 数组绕过
web安全·网络安全·文件上传漏洞
qq_424409191 小时前
uniapp的app项目,某个页面长时间无操作,返回首页
前端·vue.js·uni-app
我在北京coding1 小时前
element el-table渲染二维对象数组
前端·javascript·vue.js
布兰妮甜1 小时前
Vue+ElementUI聊天室开发指南
前端·javascript·vue.js·elementui
SevgiliD1 小时前
el-button传入icon用法可能会出现的问题
前端·javascript·vue.js
我在北京coding1 小时前
Element-Plus-全局自动引入图标组件,无需每次import
前端·javascript·vue.js
柚子8161 小时前
scroll-marker轮播组件不再难
前端·css
你的人类朋友2 小时前
🫏光速入门cURL
前端·后端·程序员