Fork me on GitHub

[安洵杯 2019]easy_web

  打开题目如图:

  注意到url中img参数很像base64加密,于是尝试进行解密,得到MzUzNTM1MmU3MDZlNjc=,因为等号结尾所以再次进行base64解密,得到3535352e706e67 ,进行hex解码,得到 555.png 。

  于是我们猜测这里存在一个文件包含,并且要经过两次base64加密和一次hex编码。但是img参数可控,于是我们可以将index.php进行同样的步骤得到TmprMlJUWTBOalUzT0RKRk56QTJPRGN3 并且传入img参数中,尝试读取源码。

  成功在img中返回index.php的base64编码,解码后得到:

  

 1 view-source:data:image/gif;base64,PD9waHAKZXJyb3JfcmVwb3J0aW5nKEVfQUxMIHx8IH4gRV9OT1RJQ0UpOwpoZWFkZXIoJ2NvbnRlbnQtdHlwZTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCcpOwokY21kID0gJF9HRVRbJ2NtZCddOwppZiAoIWlzc2V0KCRfR0VUWydpbWcnXSkgfHwgIWlzc2V0KCRfR0VUWydjbWQnXSkpIAogICAgaGVhZGVyKCdSZWZyZXNoOjA7dXJsPS4vaW5kZXgucGhwP2ltZz1UWHBWZWs1VVRURk5iVlV6VFVSYWJFNXFZejAmY21kPScpOwokZmlsZSA9IGhleDJiaW4oYmFzZTY0X2RlY29kZShiYXNlNjRfZGVjb2RlKCRfR0VUWydpbWcnXSkpKTsKCiRmaWxlID0gcHJlZ19yZXBsYWNlKCIvW15hLXpBLVowLTkuXSsvIiwgIiIsICRmaWxlKTsKaWYgKHByZWdfbWF0Y2goIi9mbGFnL2kiLCAkZmlsZSkpIHsKICAgIGVjaG8gJzxpbWcgc3JjID0iLi9jdGYzLmpwZWciPic7CiAgICBkaWUoInhpeGnvvZ4gbm8gZmxhZyIpOwp9IGVsc2UgewogICAgJHR4dCA9IGJhc2U2NF9lbmNvZGUoZmlsZV9nZXRfY29udGVudHMoJGZpbGUpKTsKICAgIGVjaG8gIjxpbWcgc3JjPSdkYXRhOmltYWdlL2dpZjtiYXNlNjQsIiAuICR0eHQgLiAiJz48L2ltZz4iOwogICAgZWNobyAiPGJyPiI7Cn0KZWNobyAkY21kOwplY2hvICI8YnI+IjsKaWYgKHByZWdfbWF0Y2goIi9sc3xiYXNofHRhY3xubHxtb3JlfGxlc3N8aGVhZHx3Z2V0fHRhaWx8dml8Y2F0fG9kfGdyZXB8c2VkfGJ6bW9yZXxiemxlc3N8cGNyZXxwYXN0ZXxkaWZmfGZpbGV8ZWNob3xzaHxcJ3xcInxcYHw7fCx8XCp8XD98XFx8XFxcXHxcbnxcdHxccnxceEEwfFx7fFx9fFwofFwpfFwmW15cZF18QHxcfHxcXCR8XFt8XF18e3x9fFwofFwpfC18PHw+L2kiLCAkY21kKSkgewogICAgZWNobygiZm9yYmlkIH4iKTsKICAgIGVjaG8gIjxicj4iOwp9IGVsc2UgewogICAgaWYgKChzdHJpbmcpJF9QT1NUWydhJ10gIT09IChzdHJpbmcpJF9QT1NUWydiJ10gJiYgbWQ1KCRfUE9TVFsnYSddKSA9PT0gbWQ1KCRfUE9TVFsnYiddKSkgewogICAgICAgIGVjaG8gYCRjbWRgOwogICAgfSBlbHNlIHsKICAgICAgICBlY2hvICgibWQ1IGlzIGZ1bm55IH4iKTsKICAgIH0KfQoKPz4KPGh0bWw+CjxzdHlsZT4KICBib2R5ewogICBiYWNrZ3JvdW5kOnVybCguL2JqLnBuZykgIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyOwogICBiYWNrZ3JvdW5kLXNpemU6Y292ZXI7CiAgIGJhY2tncm91bmQtYXR0YWNobWVudDpmaXhlZDsKICAgYmFja2dyb3VuZC1jb2xvcjojQ0NDQ0NDOwp9Cjwvc3R5bGU+Cjxib2R5Pgo8L2JvZHk+CjwvaHRtbD4=<?php
 2 error_reporting(E_ALL || ~ E_NOTICE);
 3 header('content-type:text/html;charset=utf-8');
 4 $cmd = $_GET['cmd'];
 5 if (!isset($_GET['img']) || !isset($_GET['cmd'])) 
 6     header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
 7 $file = hex2bin(base64_decode(base64_decode($_GET['img'])));
 8 
 9 $file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
10 if (preg_match("/flag/i", $file)) {
11     echo '<img src ="./ctf3.jpeg">';
12     die("xixi~ no flag");
13 } else {
14     $txt = base64_encode(file_get_contents($file));
15     echo "<img src='data:image/gif;base64," . $txt . "'></img>";
16     echo "<br>";
17 }
18 echo $cmd;
19 echo "<br>";
20 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)) {
21     echo("forbid ~");
22     echo "<br>";
23 } else {
24     if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
25         echo `$cmd`;
26     } else {
27         echo ("md5 is funny ~");
28     }
29 }
30 
31 ?>
32 <html>
33 <style>
34   body{
35    background:url(./bj.png)  no-repeat center center;
36    background-size:cover;
37    background-attachment:fixed;
38    background-color:#CCCCCC;
39 }
40 </style>
41 <body>
42 </body>
43 </html>

  可以看到如果我们在刚刚的文件读取过程中尝试去读取flag相关文件的话会被直接ban掉。获取到源码之后img这个参数就已经没有用了,后面的cmd参数就是第二个考点。由代码第25行得知cmd参数是要作为命令在服务器上进行执行,在第20行看到一个恐怖的正则匹配,基本上禁用了我们读取文件的所有命令,同时下面第24行又缝合了一个md5的强类型比较考点。

  首先我们对md5强类型比较进行绕过:使用网上得到的md5碰撞结果相同的两个参数:

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

   这样就能够绕过md5强类型比较;

  在正则匹配中ban了ls,但是我们可以使用dir进行目录遍历,得到的结果如下:

  

  在当前目录下并不存在flag相关的文件,基本可以确定flag文件在/根目录下面了。

  最终有两种解法能够读取到flag:

1.在正则匹配中不能使用/\\/或者/\\\\/匹配\,具体原因参考

https://blog.csdn.net/weixin_41463193/article/details/83539168

https://www.thinbug.com/q/28062568

  使用ca\t绕过对cat的正则匹配,成功读取flag:(因为正则匹配中还ban了空格,所以用%20进行绕过,传参要在burp中进行,在hackbar中传参时会自动进行一次url解码)

  

2.sort函数并没有被正则匹配,sort函数的作用是将文件的每一行作为一个单位进行比较,从首字符向后依次按照ASCII🐎进行比较,最后升序输出。因为flag文件中只有一行信息,在此题目中可以用sort命令直接读取/flag

 

原文地址:https://www.cnblogs.com/M1saka/p/13807641.html,转载请标注清楚。

 

posted @ 2020-10-13 14:59  M1saka_L1gh73r  阅读(142)  评论(0编辑  收藏  举报