運維利器:WEB日誌分析場景介紹

爲何要對 Web日誌進行分析

隨着 Web 技術不斷髮展,Web 被應用得愈來愈普遍,如今不少企業對外就一個網站來提供服務,因此網站的業務行爲,安全性顯得很是重要。正如安全行業的一句話:「世界上只有兩種人,一種是知道本身被黑了的,另一種是被黑了還不知道的」。php

對網站的業務行爲分析,網站的安全性分析一個很重要的途徑就是經過日誌。經過WEB日誌分析最直接明顯的幾個目的:css

  • 一爲網站安全自檢查,瞭解服務器上正在發生的安全事件;html

  • 二爲應急事件中的分析取證;node

  • 三是可根據日誌分析一些經常使用的業務行爲。mysql

如何進行日誌分析?

在進行日誌分析以前,咱們先來了解一下 Web服務器中產生的日誌是什麼樣子。咱們來看一條 Apache 的訪問日誌爲例:web

114.221.137.87 - - [10/Sep/2019:14:52:28 +0800] "GET /login HTTP/1.1" 200 1068 https://secilog.secisland.com/ Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.105 Safari/537.36 Vivaldi/2.4.1488.40

經過以上信息,咱們能夠得知服務器會記錄來自客戶端的每個請求,其中有大量來自正經常使用戶的請求,固然也包括來自惡意攻擊者的請求,那麼咱們如何區分正常請求和惡意攻擊請求呢?ajax

站在攻擊者的角度,攻擊者對網站進行滲透時,其中包含大量的掃描請求執行惡意操做的請求,而這二者在日誌中都有各自的特徵,如掃描請求會訪問大量不存在的地址,在日誌中體現則爲大量的響應狀態碼爲404,而不一樣的惡意請求都有各自相應的特徵。正則表達式

如當有人對服務器進行SQL注入漏洞探測時會有相似:/login?attack=test';select/* */1/**/from/**/1等內容。經過關鍵字分析能夠分析哪些 IP 在進行攻擊,能夠進一步的進行處置,好比封ip等。sql

日誌分析場景介紹

通常能夠按照兩種思路展開,逐步深刻,還原整個攻擊過程。shell

  • 第一種:肯定入侵的時間範圍,以此爲線索,查找這個時間範圍內可疑的日誌,進一步排查,最終肯定攻擊者,還原攻擊過程。

  • 第二種:攻擊者在入侵網站後,一般會留下後門權限,以方便再次訪問,咱們能夠找到該文件,並以此爲線索來展開分析。

曾經有人問過運維的人員的大神,該如何分析日誌?大神回答了三個字:「用命令」。

由於站在腳本操做經驗豐富的人角度來看,的確用命令足矣,但是對於通常的人員來講用Linux的shell命令仍是稍顯複雜。仍是須要藉助一些工具來提升效率。這裏用了secisland 新推出的免費工具 secsoso 來做爲示例:

spl 完整語法:secsoso ‘file=("文件名"," ") 過濾|統計…’簡化語法: secsoso ‘文件名 過濾|統計…’

業務行爲統計

列出文件中訪問次數最多的10個IP

secsoso 'file=("/export/home/20190613/access.log"," ")|stats  count($1) by $1|sort 10 -count_$1'

說明:其中/export/home/20190613/access.log爲文件路徑,「 」爲字段分割符。文件名能夠是絕對路徑(/export/home/20190613/access.log) 也能夠是相對路徑(access.log)。默認列名爲$1,$2..., count($1)後的默認名稱爲count_$1。

結果以下:

$1                    count_$1
 101.226.68.137                 972
  163.177.71.12                 972
183.195.232.138                 971
111.192.165.229                 377
  114.252.89.91                 374
   66.249.66.84                 246
 222.70.152.149                 226
 220.181.89.174                 172
 111.194.118.58                 160
  60.247.77.253                 146

你也能夠給字段重命名以友好方式顯示,這個是簡化語法:結果同上。

secsoso ‘access.log|rename $1 as ip |stats  count(ip) by ip|sort 10 -count_ip’

查看文件中有多少個不一樣的IP訪問

secsoso  'access.log|rename $1 as ip |stats  dc(ip) '

結果以下:

dc_ip
1050

查看某一個頁面被訪問的次數

好比 /nodejs-underscore/?cf_action=sync_comments爲訪問頁面

secsoso 'access.log "/nodejs-underscore/?cf_action=sync_comments"|eventcount'

紅色字是過濾的含義,結果以下:

event_count
14

查看每個IP訪問了多少個頁面

secsoso 'access.log $7="*.html*" |stats $1 as ip,count($1) as count by $1'

stats $1 as ip,count($1) as count by $1 和 stats count($1) by $1 結果同樣,只是前者能夠重新命名,命名也能夠放在後面作:

stats count($1) by $1|rename $1 as ip,結果以下:

ip                       count
 10.70.101.89                3
 10.70.101.90                3
 10.70.141.32                3
 10.70.142.18                5
10.70.146.115                2
10.70.146.120                5
 10.70.147.28                2
10.70.149.233                2

查看每個IP訪問了多少個頁面按從大到小排序

secsoso 'access.log $7="*.html*" |stats $1 as ip,count($1) as count by $1|sort -count'

結果以下:

ip            count
  10.74.52.51               21
 10.80.189.69               12
  10.71.37.20                9
    10.77.6.9                9
  10.71.48.20                9
  10.80.6.121                8
  10.77.7.244                8

查看某一個IP訪問了哪些頁面

secsoso  'access.log "10.74.52.51"  $7="*.html*" |fields $1,$7'

$7="*.html*"也支持正則表達式須要用//包起來,好比」access.log」 「10.74.52.51」  $7=」/.html./「 |fields 7,這個是查詢,選擇第一列和第7列。

結果以下:

$1                                        $7
10.74.52.51            /zmccwps/welcome/qiyewenh.html
10.74.52.51                /zmccwps/welcome/gzsl.html
10.74.52.51                /zmccwps/welcome/gsry.html
10.74.52.51                /zmccwps/welcome/cylj.html
10.74.52.51                /zmccwps/welcome/yewu.html
10.74.52.51                /zmccwps/welcome/gzsl.html
10.74.52.51                /zmccwps/welcome/gsry.html
10.74.52.51                /zmccwps/welcome/yewu.html
10.74.52.51            /zmccwps/welcome/qiyewenh.html
10.74.52.51                /zmccwps/welcome/gzsl.html

統計每一個小時的訪問次數

secsoso 'access.log|eval date=$4.to_date("[dd/MMM/yyyy:HH:mm:ss")|stats count(date) by tspan(date,"1h")'

結果以下:

date                                 count_date
2013-09-18 06:00:00                   123
2013-09-18 07:00:00                  1075
2013-09-18 08:00:00                  2167
2013-09-18 09:00:00                  1424
2013-09-18 10:00:00                   621
2013-09-18 11:00:00                   607
2013-09-18 12:00:00                   652
2013-09-18 13:00:00                   570

根據瀏覽器指紋定位記錄

secsoso 'access.log "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9) Gecko Minefield/3.0" $7!="*.js*" $7!="*.css*"|fields $1,$4,$7'

紅色是排除JS和CSS,結果以下:

$1                 $4                            $7
123.125.71.103   [18/Sep/2013:07:13:23  /nodejs-bootstrap-select/
123.125.71.81    [19/Sep/2013:01:26:14  /r-package-faster/

統計爬蟲

secsoso  'access.log "Googlebot|Baiduspider|Applebot|bingbot|YoudaoBot|Sosospider|MSNBot"|stats dc($1) as count'

結果以下:

count
63

統計每一個網段的訪問次數

secsoso  'access.log| stats rex($1,"[0-3]+\.[0-9]+\.[0-9]+") as ipper,count(1) as count by ipper |sort -count'

結果以下:

ipper                  count
 101.226.68              972
   3.177.71              972
  3.195.232              971
111.192.165              377
    2.89.91              374
 222.70.152              226
  1.135.216              185

統計狀態碼次數

secsoso  'access.log|stats $9 as stat ,count($9) as count by $9'

結果以下:

stat            count
 "-"              848
 173                1
 200            12340
 301               94
 302              152
 304              949
 400               13
 403                3
 404              201
 408                1
 499                8
 500                1
 502                8

統計每一個 URL 的訪問次數

secsoso 'access.log|eval url=$7.substring(0,POSITION("?",$7))|stats count(url) by url'

結果以下:

文件流量統計

secsoso  ‘access.log|fields $10|stats sum(casewhen($10=「\」-\」」,0,$10)) as fluxcount’

紅色是函數嵌套,casewhen表示若是第10列等於」-「爲零,不然是它本身,而後用sum累加,結果以下:

flowcount
218704890

統計單位時間內訪問包含某個URI的IP排名

secsoso 'access.log $7="*/wp-content/themes*"|eval date=$4.to_date("[dd/MMM/yyyy:HH:mm:ss")|stats count(date) as count by tspan(date,"1h"),$1|rename tspan_date as time,$1 as ip|sort time,-count'access.log 4.to_date(「[dd/MMM/yyyy:HH:mm:ss」)|stats count(date) as count by tspan(date,」1h」),< src=" https:="" chart.googleapis.com="" chart?cht="tx&chl=1%7Crename%20tspan_date%20as%20time%2C"" class="js_catchremoteimageerror">1 as ip|sort time,-count
access.log 4.to_date(「[dd/MMM/yyyy:HH:mm:ss」)|stats count(date) as count by tspan(date,」1h」),<img src=" https:="" chart.googleapis.com="" chart?cht="tx&chl=1%7Crename%20tspan_date%20as%20time%2C"" class="js_catchremoteimageerror">1 as ip|sort time,-count

其中/wp-content/themes 爲url關鍵字

結果以下:

time                         ip            count
2013-09-18 06:00:00              124.42.13.230               13
2013-09-18 06:00:00              71.96.108.116               13
2013-09-18 07:00:00              222.247.54.20               26
2013-09-18 07:00:00              111.193.224.9               13
2013-09-18 07:00:00            113.106.104.210               13
2013-09-18 07:00:00             116.226.35.135               13
2013-09-18 07:00:00               116.24.8.156               13
2013-09-18 07:00:00            118.194.195.205               13
2013-09-18 07:00:00                121.8.153.6               13

網站登陸趨勢

對後臺網站系統來講,通常會有登陸頁面,經過登陸頁面的狀態碼,能夠判斷是登陸成功仍是登陸失敗,好比/login,若是是post請求返回200,通常是登陸失敗,post請求返回302,通常表示登陸成功,能夠經過這個作一些業務的行爲分析。好比分鐘登陸趨勢:

114.221.137.86 - - [11/Sep/2019:13:44:59 +0800] "POST /login HTTP/1.1" 302 - https://secilog.secisland.com/login Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.105 Safari/537.36 Vivaldi/2.4.1488.40

secsoso 'access.log $6="*POST" $7="*/login"  $9="302"| eval date=$4.to_date("[dd/MMM/yyyy:HH:mm:ss")|stats count($1) as count by tspan(date,"1m")'

結果以下:

tspan_date            count
2019-09-11 09:22:00                1
2019-09-11 09:40:00                1
2019-09-11 13:44:00                1

賽克藍德是一家數據分析公司,本着數據改變生活的理念,致力於提供方便好用的數據分析產品。

安全統計

統計具備cc攻擊的用戶IP(單位時間內訪問次數超過閾值的用戶,不包括css 、js、png):

secsoso 'access.log  $7!="/.*\.js.*|.*\.css.*|.*\.png.*/" |eval date=$4.to_date("[dd/MMM/yyyy:HH:mm:ss")|stats $1 as ip,count(date) as count by tspan(date,"1h"),$1|search count>50'

其中 tspan (date,」1h」) 中的 「1h」 支持以下時間單位:

秒:s,分鐘:m,小時:h,天:d,星期:w,月:mon,年:year

count>50 表示訪問次數大於50。

$7!="/.*\.js.*|.*\.css.*|.*\.png.*/" 表示不包含css,js,png

結果以下:

tspan_date                         ip            count
2013-09-18 08:00:00              114.252.89.91               65
2013-09-18 08:00:00              60.247.77.253               60
2013-09-18 11:00:00               178.24.29.69               79
2013-09-18 15:00:00              114.252.89.91               53
2013-09-18 17:00:00              208.43.225.84               62
2013-09-19 03:00:00             222.70.152.149               91
2013-09-19 04:00:00              59.60.115.180               72
2013-09-19 05:00:00            111.192.165.229              142

統計具備cc攻擊的用戶IP(單位時間內訪問次數超過閾值的用戶,包括css 、js、png)

secsoso  'access.log|eval date=$4.to_date("[dd/MMM/yyyy:HH:mm:ss")|stats $1 as ip,count(date) as count by tspan(date,"1h"),$1|search count>100'

結果以下:

tspan_date                         ip            count
2013-09-18 08:00:00              114.252.89.91               79
2013-09-18 08:00:00             116.24.236.137               68
2013-09-18 08:00:00               202.84.17.41               84
2013-09-18 08:00:00               203.192.6.59               83
2013-09-18 08:00:00            221.122.104.115               72
2013-09-18 08:00:00             58.248.178.212               68
2013-09-18 08:00:00              58.56.155.203               83
2013-09-18 08:00:00                  60.10.8.5               56
2013-09-18 08:00:00              60.247.77.253              146
2013-09-18 09:00:00             183.60.177.228              121

統計發起 SQL 注入的 IP及URI

secsoso 'access.log "%20select%20|%20and%201=1|%20and%201=2|%20exec|%27exec| information_schema.tables|%20information_schema.tables|%20where%20|%20union%20|%20SELECT%20|%2ctable_name%20|cmdshell|%20table_schema"|fields $1,$7'

結果以下:

統計發起SQL注入的IP並按IP攻擊次數排名

secsoso 'access.log "%20select%20|%20and%201=1|%20and%201=2|%20exec|%27exec| information_schema.tables|%20information_schema.tables|%20where%20|%20union%20|%20SELECT%20|%2ctable_name%20|cmdshell|%20table_schema"|fields $1,$7|stats $1 as ip,count(1) as count by $1|sort -count'

結果以下:

ip                    count
   66.249.66.84                4
111.192.165.229                2

敏感文件掃描

secsoso  'access.log  ".zip|.rar|.mdb|.inc|.sql|.config|.bak|/login.inc.php|.svn|/mysql/|config.inc.php|.bak|wwwroot|網站備份|/gf_admin/|/DataBackup/|/Web.config|/web.config|/1.txt|/test.txt" |fields $1,$7 '

結果以下:

漏洞利用

secsoso 'access.log  "struts|jmx-console|ajax_membergroup.php|iis.txt|phpMyAdmin|getWriter|dirContext|phpmyadmin|acunetix.txt|/e/|/SouthidcEditor/|/DatePicker/" |fields $1,$7'

結果以下:

文件包含攻擊

secsoso 'access.log  "/passwd|%00|/win.ini|/my.ini|/MetaBase.xml|/ServUDaemon.ini|cmd.exe" |fields $1,$7'

結果以下:

getshell的攻擊

secsoso 'access.log  " eval|%eval|%execute|%3binsert|%20makewebtaski|/1.asp|/1.jsp|/1.php|/1.aspx|/xiaoma.jsp|/tom.jsp|/py.jsp|/k8cmd.jsp|/k8cmd|/ver007.jsp|/ver008.jsp|/ver007|/ver008|\.aar|%if" |fields $1,$7'

iis能夠換成:

%20exec|%27exec|%3bexec|%27%3Bexec|%eval|%20eval|%execute|%3Binsert|%20makewebtaski|%20disk%20|%3Balter|%3Bdeclare|dbo|hack523|sysname|/1.asp|/1.jsp|/1.php|/1.aspx|/xiaoma.asp|/yijuhua.asp|/yjh.asp|/hack.asp|/k8cmd.asp|/k8cmd|/ver007.asp|/ver008.asp|/ver007|/ver008|\.asa|\.cer|\.ashx|asp;|asa;|cer;|aspx;|/1.asp/|/x.asp/|/a.asp/|/2.asp/

結果以下:

xss跨站腳本攻擊

secsoso 'access.log  " (S)%3C(S+)%3E|(S)%3C(S+)%2F%3E|(S+)<(S+)>|(S+)<(S+)/>|onerror|onmouse|expression|alert|document.|prompt\()" |fields $1,$7'

結果以下:

網站登陸密碼猜想

好比5分鐘大於10次同一個IP登陸密碼錯誤,認爲是密碼猜想,而後把全部IP找到。

114.221.137.86 - - [11/Sep/2019:10:25:39 +0800] "POST /login HTTP/1.1" 200 1111 https://secilog.secisland.com/login Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.105 Safari/537.36 Vivaldi/2.4.1488.40
secsoso 'access.log $6="*POST" $7="*/login"  $9="200"| eval date=$4.to_date("[dd/MMM/yyyy:HH:mm:ss")|stats count($1) as count by tspan(date,"5m"),$1| search count>10|stats sum(count) by $1'

結果以下:

$1            sum_count
114.221.137.86                   15

經過上面示例得知,日誌中含有豐富的內容,經過這些內容能夠分析出不少有價值的信息。但這些分析的前提就是要先保存這些日誌,並記錄請求參數,但默認的WEB中間件日誌只記錄GET請求的參數,沒有記錄POST請求的參數,因此須要經過中間件配置才能夠拿到POST的請求參數來進行更多的分析。

拿到參數後還能夠繼續深刻分析更具體的業務行爲,操做記錄等,好比/asset(示例)表示訪問資產模塊,/asset/add(示例)表示資產添加模塊,/asset?id=1表示查詢id爲1的資產記錄。

文本經過分析WEB中間件日誌的示例起到拋磚引玉的目的,來講明日誌分析的重要性和思路。但願能對你們的日誌分析起到參考和幫助。

備註:內容有部分數據來源於網絡。

賽克藍德是一家數據分析公司,本着數據改變生活的理念,致力於提供方便好用的數據分析產品。

相關文章
相關標籤/搜索