前言:
感觉这次强网的难度还是一如既往的高,我本人主要负责web方向的题,这次比赛就只做出了三道(ezphp做了几个小时没整出来。。。),最后也是和队友一起拿了700分打到了139名(最后排名还在审核中)。赛后自己尝试搭一下ezphp的环境进行复现。
SecretVault
描述:小明最近注册了很多网络平台账号,为了让账号使用不同的强密码,小明自己动手实现了一套非常“安全”的密码存储系统 – SecretVault,但是健忘的小明没记住主密码,你能帮他找找吗
考点:http走私请求、hop-by-hop的逻辑利用
观察源代码

跟进fernet

可以看到要得到flag就需要从环境数据库中读取
接着分析代码,在longin_required可以发现绕过身份验证的关键,代码只会检查用户ID是否存在,不验证用户是否真的登录。当uid匹配时就可以跳转dashboad,而uid为anonymous时则跳转login

绕过身份认证后就可以在环境数据库中得到flag
构造请求(这里就默认X-User:0),但是发现并没有绕过
观察代码发现有一个main.go中的main()会将X-User请求头删除

所以这里直接构造请求头X-User都会失败
接着观察main.go中的main()可以发现无论登录都会向flask发送一个X-User并赋值为anonymous

接着观察代码可以发现如果请求中没有X-User头,那么Flask应用会使用默认值0

并且我们可以看到admin用户的id是0

那么这里尝试构造一个不合法的请求头”Connection: close,X-User“,Go 的 HTTP 库会解析 Connection 头,并将 X-User 标记为 hop-by-hop 头,该头在转发时被删除。Flask应用收到请求后,没有 X-User 头,因此使用默认值 ‘0’,从而以 admin 用户身份访问 dashboard,并看到 flag
构造后最终得到flag

bbjv
描述:a baby spring
考点:SpEL注入
分析代码找到关键点

测试是否存在注入,发现是SpEL注入(注意需要用url编码)
1 | /check?rule=%23%7B7*7%7D |

尝试命令执行,但是发现没有java.lang.Runtime和java.lang.ProcessBuilder
接着往下分析代码,可以发现直接就读取flag.txt的内容了

但是为什么读取不到呢,说明user.home属性所对应的目录是普通用户无法读取的。那么我们只需要改变flag.txt所在的目录为一个所有用户都可以读取的目录即可得到flag。
那么这里我们利用SpEL注入将user.home改为/tmp目录就可以了。这里还需要注意一个点,这里没有java.lang.System所以没法使用T(),所以直接使用#systemProperties访问user.home属性
构造payload:
1 | #{#systemProperties['user.home'] = '/tmp'} |
最终payload(url编码):
1 | /check?rule=%23%7B%23systemProperties%5B%27user.home%27%5D%20%3D%20%27%2Ftmp%27%7D |

yamcs
描述:How to rce?
考点:yamcs工控系统、MLVEL引擎RCE
打开环境,找了一圈有几个文件上传的点但是没有什么用,传入后不知道路径

又看了半天,发现一个java代码,根据题目提示的要打rce可以猜测这里可能是利用点

问一波ai这个代码在干嘛

还是不太清楚能不能进行RCE
观察dockerfile下载源码到本地(猜测可能是同一个版本)

将整个文件丢给ai分析


接着问一下ai这个MLVEL能不能进行RCE

尝试直接命令执行但是发现直接报错了
1 | Runtime.getRuntime().exec("whoami"); |

接着问ai,直接就给出了修改后的payload
1 | try { |
返回copySunsensor运行,发现返回ok但是也没有执行结果

结合上面分析的会将执行的数据复制到Sunsensor_Beta那么直接去查看发现命令执行成功了

那么接着就是获取flag即可
最终payload:
1 | try { |

ezphp
描述:real ez php
考点: