网鼎杯 2020

Web

[朱雀组]phpweb

查看源代码可以发现 form 表单存在注入点,默认执行函数为 date(Y-m-d h:i:s a)

<form  id=form1 name=form1 action="index.php" method=post>
    <input type=hidden id=func name=func value='date'>
    <input type=hidden id=p name=p value='Y-m-d h:i:s a'>
</form>

尝试使用 system() 函数直接进行注入,构造 payload func=system&p=cat /flag 发现 system() 函数被过滤了。

尝试通过 file_get_contents() 函数获取 index.php 的内容查看被过滤关键字,构造 payload func=file_get_contents&p=index.php 可以得到。

分析上述代码可以发现存在类 Test ,并且黑名单中并没有 unserialize() 函数,因此可以尝试通过反序列化来解决,先进行序列化的构造。

构造 payload func=unserialize&p=O:4:"Test":2:{s:1:"p";s:4:"ls /";s:4:"func";s:6:"system";}

发现 flag 并没有如愿以偿地出现在根目录,因此通过 find 命令与上面同理构造 payload func=unserialize&p=O:4:"Test":2:{s:1:"p";s:19:"find / -name *flag*";s:4:"func";s:6:"system";}

排除开系统文件可以发现 /tmp/flagoefiu4r93 文件,通过构造 payload func=unserialize&p=O:4:"Test":2:{s:1:"p";s:22:"cat /tmp/flagoefiu4r93";s:4:"func";s:6:"system";} 就得到 flag 了。

[朱雀组]Nmap

先随便输入 127.0.0.1 可以得到回显并且发现 Param f=6f859

构造 Payload 如下

可以得到报错回显如下

可以推断出是 xml 输出的,假设当前表达式为

可以通过 -oG 输出到文件中,构造 Payload 如下

回显 Hacker... ,说明存在一定的过滤,试试改成 phtml

构造 Payload 如下

回显 Host maybe down ,说明传入成功,但是并不能访问 shell.phtml ,通过查看源代码才发现还需要进行单引号的绕过(存在 escapeshellarg()escapeshellcmd() ),因此需要修改 Payload 如下

结尾的空格是为了防止 escapeshellcmd() 函数使得文件名变成 shell.phtml\\

通过蚁剑一把梭就可以得到 flag 了。

[玄武组]SSRF Me

题目源码

解题过程

在 safe_request_url 函数中,接受了 URL 参数后调用 check_inner_ip 函数判断是否是内网IP,不是的话才会执行 safe_request_url 函数下方的 curl 。而 check_inner_ip 函数指定 URL 必须为 http://, https://, gopher://, dict:// 这几种协议开头,后通过 parse_url 函数进行解析,而这里检测的 IP 段包括 127.0.0, 10.0.0, 172.16.0, 192.168.0 这几个网段。因此这里绕过有两种方式:

  1. 绕过 parse_url 函数

  2. 绕过被检测的 IP 段

第一种方法即是在构造 Payload 时使得该函数无法正常解析 URL,即 http:/// 等。第二种方法即是使用 0.0.0.0 来进行绕过。通过构造 Payload 如下

即可得到 hint.php 的源码如下

可以得知 Redis 的密码为 root ,开始尝试 Redis SSRF ,先通过在本地抓包构造出 Payload ,再通过 gopher 发送。

通过 WireShark 抓包(右键->Follow->TCP stream),并过滤掉服务端返回的值并以原始数据显示后即可得到 Payload 。

通过编写脚本转为 Gopher 协议数据

通过构造 Payload 如下

访问后虽然会显示 504 ,但通过访问 webshell.php 可以发现 Shell 已经成功上传,就可以得到 flag 了。

Last updated