生活随笔
收集整理的這篇文章主要介紹了
【网络安全】代码审计-zzcms2021前台写shell?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本次是對zzcms2021前臺一個可能的寫配置文件的點進行分析(已交cnvd,不知道收不收呀),為什么說是可能,各位師傅往下看就好啦
【學習資料】
從官網下載最新源碼后,本地搭建環境進行分析
主要利用在/3/ucenter_api/api/uc.php中
在/3/ucenter_api/api/uc.php中,通過get傳參code,再將_authcode解密后的code利用parse_str解析并賦值給$get
跟進到_authcode函數:
function
_authcode($string
, $operation
= 'DECODE', $key
= '', $expiry
= 0) {$ckey_length
= 4;$key
= md5($key
? $key
: UC_KEY
);$keya
= md5(substr($key
, 0, 16));$keyb
= md5(substr($key
, 16, 16));$keyc
= $ckey_length
? ($operation
== 'DECODE' ? substr($string
, 0, $ckey_length
): substr(md5(microtime()), -$ckey_length
)) : '';$cryptkey
= $keya
.md5($keya
.$keyc
);$key_length
= strlen($cryptkey
);$string
= $operation
== 'DECODE' ? base64_decode(substr($string
, $ckey_length
)) : sprintf('%010d', $expiry
? $expiry
+ time() : 0).substr(md5($string
.$keyb
), 0, 16).$string
;$string_length
= strlen($string
);$result
= '';$box
= range(0, 255);$rndkey
= array();for($i
= 0; $i
<= 255; $i
++) {$rndkey
[$i
] = ord($cryptkey
[$i
% $key_length
]);}for($j
= $i
= 0; $i
< 256; $i
++) {$j
= ($j
+ $box
[$i
] + $rndkey
[$i
]) % 256;$tmp
= $box
[$i
];$box
[$i
] = $box
[$j
];$box
[$j
] = $tmp
;}for($a
= $j
= $i
= 0; $i
< $string_length
; $i
++) {$a
= ($a
+ 1) % 256;$j
= ($j
+ $box
[$a
]) % 256;$tmp
= $box
[$a
];$box
[$a
] = $box
[$j
];$box
[$j
] = $tmp
;$result
.= chr(ord($string
[$i
]) ^ ($box
[($box
[$a
] + $box
[$j
]) % 256]));}if($operation
== 'DECODE') {if((substr($result
, 0, 10) == 0 || substr($result
, 0, 10) - time() > 0) && substr($result
, 10, 16) == substr(md5(substr($result
, 26).$keyb
), 0, 16)) {return substr($result
, 26);} else {return '';}} else {return $keyc
.str_replace('=', '', base64_encode($result
));}}
對傳參進行加密,可以看到若$key為空的話,則為UC_KEY
搜索UC_KEY
這樣就可以進行加密傳參
但是這里需要通過一個判斷,在傳參中加入time()就可以通過
接著通過 post=xmlunserialize(filegetcontents(′php://input′));獲取post,因為這里沒有過濾,所以就發生了寫入
然后進入if判斷
如果傳入的action操作在數組里,則實例化uc_note()類并調用action操作。因為post沒有被過濾,所以選擇一個接受post的方法
在updateapps中
傳入UCAPI=post[‘UC_API’],通過正則匹配
$configfile
= preg_replace("/define\('UC_API',\s*'.*?'\);/i", "define('UC_API', '$UC_API');", $configfile
);
將config.inc.php中define(‘UC_API’, ‘http://demo.zzcms.net’) ;進行替換
可以看出,這樣便可以構造$UC_API=’);phpinfo();//進行閉合
但是這里有個尷尬的地方就是,源碼里的正則寫錯了,/define(‘UC_API’,\s’.?’);/i中;的前面少了個空格,導致匹配不到config.inc.php里面的define(‘UC_API’, ‘http://demo.zzcms.net’) ;
不過按照源碼想實現的功能應該是可以寫入的
在正則的地方添加空格后走一遍的流程
首先構造code傳參
接著將poc添加并post
可以看到已經將phpinfo寫入
關注我,持續更新!!!
私我獲取【網絡安全學習資料·攻略】
總結
以上是生活随笔為你收集整理的【网络安全】代码审计-zzcms2021前台写shell?的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。