美文网首页ctf
XCTF攻防世界 Web Writeup (持续更新中)

XCTF攻防世界 Web Writeup (持续更新中)

作者: NoelleMu | 来源:发表于2019-07-31 15:39 被阅读15次

高手进阶区

ics-06

很简单的题,考察使用burpsuite爆破

进去之后随便点了几下发现这么一个页面:

送分题?(手动滑稽)

发现url里有个id,那么应该不是SQL注入就是爆破或者是伪协议读源码之类的。一番尝试之后觉得应该是爆破。

于是用BurpSuite抓包之后爆破,payload为2333时回显有变化,查看响应信息得到flag。

News Center

用sqlmap就能跑出来的SQL注入题

进去之后看到一个搜索页面,前端还是用的MDUI,233333

一般遇到这种都是SQL注入,看了一下network标签发现是POST方式提交的search参数,于是上sqlmap

sqlmap -u http://111.198.29.45:34382/ --data="search=1"

接下来就是sqlmap一把梭的事情了。

最后的过程有点慢,但是可以跑出来:

mfw

也是比较简单的题,考察的是git源码泄露和php assert任意命令执行

在about页面找到了这些:

Git?那肯定要上githack了。

看了一下flag.php发现啥也没有:

翻了翻源码,在index.php里发现了一些可以利用的东西——熟悉的assert()函数:

我在总结里写过关于这个函数的知识:

https://www.jianshu.com/p/5fd1b624fd7a

assert函数的参数为字符串时,会将字符串当做PHP命令来执行。

例如:assert('phpinfo()')相当于执行<?php phpinfo() ?>

所以只要用一个不存在的文件名闭合掉assert函数并令其等于false,再用system()和strpos()函数读一下./templates/flag.php就可以了。

payload:?/page=about.php', '123') === false and system('cat templates/flag.php') and strpos('templates/flag

flag在网页源代码里,F12就看到了。

NaNNaNNaNNaN-Batman

前端题,主要是考察对JavaScript的熟悉程度

下载附件,用VSCode打开,发现是乱码,但能看到HTML标签和类似于JavaScript的代码:

把这个文件的扩展名改为.html,保存,可以稍微看清楚一点(需要VSCode装插件,就是保存的时候自动把代码格式化的那种插件,想不起来叫什么了):

从上面的代码中可以看出“_”是一个字符串变量,会用后面的eval()函数执行,其他的因为都是乱码所以看不出来了。

卡了一段时间之后忽然想到为什么不能把这个字符串输出一下呢?于是把eval改为console.log,可以在console里得到没有乱码的字符串:

得到的字符串是标准的JavaScript代码,丢进VSCode看一下:

简单来说就是经过一系列正则匹配之后执行一部分代码,但是既然我们有了要执行的代码,那还管正则匹配干什么呢,直接把需要执行的那部分扔到console里执行一下就可以了。

flag到手。

PHP2

考察.phps源码泄露、URL二次编码绕过

一开始我也没明白这个题是什么意思,看了大佬的wp才知道是有.phps源码泄露:

phps文件就是php的源代码文件,通常用于提供给用户(访问者)查看php代码,因为用户无法直接通过Web浏览器看到php文件的内容,所以需要用phps文件代替。其实,只要不用php等已经在服务器中注册过的MIME类型为文件即可,但为了国际通用,所以才用了phps文件类型。

访问index.phps得到源码:

看源码就可以知道这个是很简单的URL二次编码绕过,所以payload:?id=ad%256din

flag到手。

unserialize3

绕过魔法函数sleep()和wakeup()的反序列化漏洞

题目名叫unserialize3,那应该是跟反序列化有关的题目。

看一下源码,出现了__wakeup()这个魔法函数:

unserialize()执行时会检查是否存在一个wakeup()方法。如果存在则先调用wakeup()方法,预先准备对象需要的资源。wakeup()经常用在反序列化操作中。sleep()则相反,是在序列化一个对象的时候被调用。

这个漏洞的核心是:序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup()的执行。

将题目中的类序列化得到结果:O:4:"xctf":1:{s:4:"flag";s:3:"111";}

简单解释一下这个字符串:

O代表结构类型为4表示类名长度,然后是类名成员个数

大括号内的值是:属性名类型长度名称值类型长度

如果我们把传入序列化字符串的属性个数改成比1更大的值,就不会触发__wakeup()方法,进而得到flag。

payload:?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}

Cat

个人感觉比较综合也比较难的题目,考察的是url编码和django的知识

打开网页发现是一个ping功能,但是输入正常的用户名没有反应,输入ip地址有反应:

本来因为题目名叫cat,又是ping,以为是命令执行,但是尝试了|&等都报错,提示Invalid URL。看来题目的本意并不是命令执行。

看了网上一个大佬的wp才知道这个是跟Django有关的。网站本身是用PHP写的,但是可能有Django的组成部分。

在url里传参%80报错(URL编码是0~127,80的十六进制是128自然报错),从报错信息的目录结构可以知道这个是Django的项目:

其他的没什么信息,又去看了看大佬的wp,发现这个原来还需要用PHP的@前缀:

全部数据协议使用HTTP协议中的POST操作来发送。要发送文件,在文件名前加上@前缀并使用完整路径……

根据Django的目录特性,用@进行文件传递,对文件进行读取之后将内容传给url参数,如果有错误信息就可以得到回显,进而取得更多错误信息、帮助我们拿到flag。

先看看settings.py:

payload: ?url=@/opt/api/api/settings.py

找到数据库文件的存放位置:

看看这个文件:

payload: ?url=@/opt/api/database.sqlite3

搜索CTF得到flag。

相关文章

网友评论

    本文标题:XCTF攻防世界 Web Writeup (持续更新中)

    本文链接:https://www.haomeiwen.com/subject/pgozrctx.html