title: 安洵杯2019——eazy——web.md
date: 2022-10-02 10:11:51
tags:
[安洵杯 2019]easy_web
绷不住了。。。。
看题把 上面get这里应该是可以获取文件 cmd是什么现在还不知道
那可以读文件 直接读flag?
试试把
上面这个应该是base64 加密
解密后
应该还需要再解密
这啥玩意 经过不懈努力 发现这给是十六进制。。。(其实是看别人wp的 哈哈哈哈)
然后 那直接读flag 黑黑黑
先十六进制
然后两次base64
为
TW1ZMk5qWmpOakUyTnc9PQ==
应该是过滤了flag把
反正就是不能读
这里思路有开阔 反正可以读文件了 我们就来读读文件把 看看代码执行的逻辑
十六进制 然后二次base64
之后为
TmprMlpUWTBOalUzT0RKbE56QTJPRGN3
读出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']))
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>
分析一下代码逻辑把
解码之后只能匹配 a-z A-Z 0-9 和 .
不能匹配到flag
下面定义了非常多的黑名单
然后经过一个md5强比较 就
echo `$cmd`
这里有个知识点 这个`` 里面的东西 可以当作系统命令来执行
这里试验一下
所以我们就只需要绕过md5 和 上面的过滤就可以了
这里也有一个知识点就是 \ 反斜线在linux 对一些命令没有影响
看到这里是没什么影响的
那再试一下cat
还有一个知识点就是
正则中的 反斜线 了
先看这里面的正则匹配模式
/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
这里它明明对 \ 和 \ 进行了过滤啊 没什么没有被检测呢
先来看一下这个东西
因为这个 \ 是一个转义符 然后 把后面的引号转义成字符串了 所以就没有闭合 所以报错
这样子 我们把\ 利用转义符 \ 转义成字符串了 所以它就会正常输出 \
那看如果是三个呢
它又会报错 原因也很简单 就是 前面一个字符串 \ 和一个转义符 \ 这个转义符就把后面的" 转义成字符串了 所以就报错了
这个我就不说了
那我们刚刚的猜想是正确的啊 它明明是过滤了 \ 和
\\
但是为什么没有被检测呢
这里同样是做实验来看
实验代码
<?php
$content = 'Aha! Can you type backslash characters? Yeah! Here is a \ ';
$pattern="\\";
$result=preg_match($pattern,$content);
echo $result;
英语不好 翻一下
这里它是说分隔符不能是字母数字或反斜杠 这里说的就剩 / 了 所以php报了一个没有结束分隔符的错
这里就是上面的那个东西 虽然已经被转义成字符串 \ 但是 它到正则解释器中又会变成 转义符 \ 所以我就就必须要四个转义符
\\\\
才可以
正常匹配了
为什么呢 因为这里再 php解释器中 把四个转义符转义成了两个
\\
然后再正则解释器中
\\
这两个有转义了一次 就变成一个字符串 \ 了
但是 这里 我们输入三个反斜杠的时候 他们有报错 。。。不知道为什么了
反正他匹配上了
这里反正它两个反斜杠 和四个反斜杠的时候都没有匹配上
八嘎 实验的时候匹配上了 但是 为啥放里面就匹配不上了呢 。。。不理解
......
标签:匹配,这里,cmd,安洵,eazy,转义,2019,echo,md5 From: https://www.cnblogs.com/kkkkl/p/16748366.html