在本地搭建服務器,httpd-vhosts.conf 中設置本地綁定的域名:
其中,zzzphp為下載的zzzphp cms的內容。
然后,本機上的zzzphp cms的目錄結構為如下:
在按照要求安裝好cms后,本地cms的后臺地址訪問地址為admin264.
在登陸后臺后,使用postman發送如下請求:
必須在cookie中設置登陸服務器后返回的cookie值,否則執行將失敗:
該cookie值在成功登陸服務器后臺后會自動獲得。
在postman中綁定cookie之后,發送請求:
http://[本地綁定的域名]/[后臺地址]/save.php?act=content
需要注意的是,需要在act中傳參數act=content。
使用post傳的參數中其他都是無關項,但是c_content為關鍵項。
c_content參數需要先使用單引號和括號閉合語句,然后插入想要執行的sql語句,
這里c_content的值為content’,1,9);create database kaixinjiuhao;//
開始在phpstorm中進行跟蹤:
可以看見此時$act=”content”,繼續跟進:
然后在phpstorm中跟蹤,跟蹤到save_content()方法:
其中getform函數為獲得我們之前通過post提交的各種參數,需要注意的是$c_content參數
此時,$c_content參數的取值貌似被轉義,但是不用著急,往下看。
在第299行,$c_pagedesc參數在post不傳值的情況下,成功獲得我們輸入的$_content的值,并且該值未經過轉義:
繼續跟蹤,在第237行執行db_insert函數,跟進:
然后在在db_insert函數的第243行執行db_exec函數,繼續跟進:
最后$d->exec($sql)執行命令。
最后postman返回消息:
繼續往下執行,postman接收到返回回來的數據:
可見命令執行成功。
最后,可以成功在數據庫中找到新創建的kaixinjiuhao數據庫:
證明sql語句執行成功。
同理,save_content()函數中的$c_title2同樣在post請求未傳值時從$c_title處獲取值,也存在sql注入的風險。