Bugku-web(源代码)

WriteUp

题目信息

解题思路

打开页面,

提示看源代码

按F12查看源代码

javascript 复制代码
var p1 = '%66%75%6e%63%74%69%6f%6e%20%63%68%65%63%6b%53%75%62%6d%69%74%28%29%7b%76%61%72%20%61%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%70%61%73%73%77%6f%72%64%22%29%3b%69%66%28%22%75%6e%64%65%66%69%6e%65%64%22%21%3d%74%79%70%65%6f%66%20%61%29%7b%69%66%28%22%36%37%64%37%30%39%62%32%62';

var p2 = '%61%61%36%34%38%63%66%36%65%38%37%61%37%31%31%34%66%31%22%3d%3d%61%2e%76%61%6c%75%65%29%72%65%74%75%72%6e%21%30%3b%61%6c%65%72%74%28%22%45%72%72%6f%72%22%29%3b%61%2e%66%6f%63%75%73%28%29%3b%72%65%74%75%72%6e%21%31%7d%7d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%6c%65%76%65%6c%51%75%65%73%74%22%29%2e%6f%6e%73%75%62%6d%69%74%3d%63%68%65%63%6b%53%75%62%6d%69%74%3b';

eval(unescape(p1) + unescape('%35%34%61%61%32' + p2));

// 定义 p1 和 p2 两个变量,值是一种 %xx 这种格式是 URL 编码,例如:%20 代表空格

// 第三行代码意思是 unescape() 解码把 URL 编码解析还原为我们认识的字符串,例如: unescape("%62") 结果是 b 字符

//eval() 的意思是执行小括号里的表达式把结果输出

用随波逐流解码

得到

javascript 复制代码
function checkSubmit(){

  var a = document.getElementById("password"); // 获取 id 叫 password 标签

  if ("undefined" != typeof a){ // 如果标签类型不是 undefined 证明获取到了进入 if 体里执行

    if("67d709b2b54aa2aa648cf6e87a7114f1" == a.value) return !0; // 如果标签的值是左边那一串字符串,则 return 个 !0 也就是 true 的 意思通过

    alert("Error"); // 如果上面 if 不成立走这里,弹出错误

    a.focus(); // 标签失去激活效果

    return !1 // 返回 !1 也就是 false

  }

}

document.getElementById("levelQuest").onsubmit = checkSubmit; // 把上面函数赋予给 id 叫 levelQuest 的标签的提交事件

把代码中的字符串67d709b2b54aa2aa648cf6e87a7114f1填入即可

使用工具

随波逐流

Flag

flag{acdd38d04b3edc2025aebcf6ec642c8f}

总结

通过本题学到:

源码审计

URL 编码

URL 编码的定义

URL 编码(Percent-Encoding)是一种将特殊字符转换为安全格式的机制,用于在 URL 中传输非 ASCII 字符或保留字符。编码后的字符以 % 开头,后跟两位十六进制数表示字符的 ASCII 值。

需要编码的字符类型

  • 保留字符 :如 /, ?, &, =, # 等,在 URL 中有特殊用途,需编码。
  • 非 ASCII 字符:如中文、日文等,需转换为 UTF-8 字节序列后编码。
  • 不安全字符 :如空格(编码为 %20)、<, >, " 等可能破坏 URL 结构的字符。

编码规则示例

  • 空格 → %20
  • 斜杠 /%2F
  • 中文字符"你" → UTF-8 字节序列为 E4 BD A0 → 编码为 %E4%BD%A0

编程语言中的实现

Python
python 复制代码
from urllib.parse import quote  
encoded = quote("参数=值/测试", safe="")  # 输出 "%E5%8F%82%E6%95%B0%3D%E5%80%BC%2F%E6%B5%8B%E8%AF%95"
JavaScript
javascript 复制代码
encodeURIComponent("参数=值/测试");  // 输出 "%E5%8F%82%E6%95%B0%3D%E5%80%BC%2F%E6%B5%8B%E8%AF%95"
Java
java 复制代码
import java.net.URLEncoder;  
String encoded = URLEncoder.encode("参数=值/测试", "UTF-8");  // 输出 "%E5%8F%82%E6%95%B0%3D%E5%80%BC%2F%E6%B5%8B%E8%AF%95"

解码方法

解码是编码的逆过程,将 %xx 恢复为原始字符。

Python
python 复制代码
from urllib.parse import unquote  
decoded = unquote("%E4%BD%A0")  # 输出 "你"
JavaScript
javascript 复制代码
decodeURIComponent("%E4%BD%A0");  // 输出 "你"

注意事项

  • 区分 encodeURIencodeURIComponent
    • encodeURI 不编码完整 URL 中的保留字符(如 :/)。
    • encodeURIComponent 编码所有非字母数字字符,适用于 URL 参数部分。
  • safe 参数 :在 Python 的 quote 中可通过 safe 指定不编码的字符(如 quote("/", safe="/") 保留斜杠)。
相关推荐
oscar9993 小时前
在浏览器中使用 OpenCode
web·browser·opencode
曲幽7 小时前
用了loguru我才明白,Python日志还能这么写
python·logging·fastapi·web·async·loguru·handler·uvicorn
牧码岛8 小时前
Web前端之JavaScrip中的Array、Object、Map和Set详解
前端·javascript·web·web前端
℡終嚸♂6802 天前
n8n 未初始化接管到读取 Flag Writeup
服务器·web安全·web·n8n
曲幽2 天前
FastAPI配置管理避坑指南:从硬编码到 .env 与 pydantic_settings 类,连路由用法都给你捋清楚
python·fastapi·web·settings·config·pydantic·.env·dotenv·.env.prod
rannn_1112 天前
【FastAPI|快速入门】第一个FastAPI程序、路由、参数、相应类型、自定义响应数据格式、异常响应处理
python·ai·fastapi·web·开发
tryqaaa_3 天前
学习日志(二)【linux全部命令,http请求头{有例题},Php语法学习】
linux·学习·http·php·web
曲幽3 天前
FastAPI 文件上传避坑全指南:分块存盘、类型校验与安全兜底
python·upload·fastapi·web·file·chunk·validate·filetype
JTaoX4 天前
WriteUp-Reverse(Hello,CTF、re1、simple-unpack)
ida·web·writeup·reverse·upx
曲幽4 天前
FastAPI + Pydantic 模型终极实战手册:从能跑就行到固若金汤,这些技巧你一定用得上
python·fastapi·web·model·field·pydantic·validator·basemodel