我发现你们很爱PHP(误)。
前言
我只是闲得没事,但是这一统计下来确实发现了一些有意思的事情。我的个人博客由2020年6月21日建立,暂时运营到2022年1月5日为止。使用的web框架是django,并且禁用了其自带的后台插件,理论上是一个不会被事件型漏洞攻破的网站。
测试时间
2020年七月到2021年十二月。在log4j漏洞被披露后的一周内我又再次查看了一遍日志,发现已经有毛子(这是一个中义词)用这个洞扫过我的网站了(不得不说毛子这种事情上真的很快^ ^)。
测试用脚本
我简单地写了一下,其实还能够加很多功能,比如调用ip查询的接口将ip的地址也一并记录下来。由于日志的时间跨度很长,已经有十几兆了,不方便用绘图表示,所以只简单统计了一下正常访问的ip、异常访问的ip、异常访问的url。
这篇是22年的老文章,搬过来。
. . . * . * ☄️. * . * . 🔆 .* . * . 🧶 * . * . . .
'''
Author: AugustTheodor
Date: 2021-12-08 14:37:53
LastEditors: AugustTheodor
LastEditTime: 2021-12-08 16:34:49
Description: Apache网站日志的扫描脚本,用于统计恶意攻击的
'''
import
re
re_ip=
r"((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)"
re_url=
r"".*?""
def
travel
(dict,f)
:
for
i
in
dict:
if
(i[
1
]>
1
):
#过滤只访问了一次的ip/url
f.write(str(i[
0
])+
" => "
+str(i[
1
])+
"n"
)
f.write(
"n"
)
class
WebsiteLog
:
dict200={}
dict4XX={}
dicturl={}
def
__init__
(self,string)
:
try
:
self.ip=re.search(re_ip,string).group()
except
:
self.ip=
"anonymous"
self.url=re.search(re_url,string).group()
#=begin
self=self.url.replace(
"HTTP/1.1"
,
""
)
self=self.url.replace(
"HTTP/1.0"
,
""
)
self=self.url.replace(
"GET"
,
""
)
self=self.url.replace(
"POST"
,
""
)
#删这几个差不多了,要加直接在下面加(PUT DELETE这种不建议删除)
#=end
self.status=int(string.split(
'"'
)[
-1
].split()[
0
])
if
self.status==
200
:
if
not
self.ip
in
WebsiteLog.dict200.keys():
WebsiteLog.dict200[self.ip]=
1
else
:
WebsiteLog.dict200[self.ip]+=
1
if
self.status>
400
and
self.status<
499
and
self.status!=
408
:
#去掉408,这个是网络错误
if
not
self.ip
in
WebsiteLog.dict4XX.keys():
WebsiteLog.dict4XX[self.ip]=
1
else
:
WebsiteLog.dict4XX[self.ip]+=
1
if
not
self.url
in
WebsiteLog.dicturl.keys():
WebsiteLog.dicturl[self.url]=
1
else
:
WebsiteLog.dicturl[self.url]+=
1
out=open(
"output.log"
,
"w"
)
outlist=[]
with
open(
"access.log"
,
"r"
)
as
f:
line=f.readlines()
for
i
in
line:
outlist.append(WebsiteLog(i))
WebsiteLog.dict200=sorted(WebsiteLog.dict200.items(), key =
lambda
kv:(kv[
1
], kv[
0
]))
WebsiteLog.dict4XX=sorted(WebsiteLog.dict4XX.items(), key =
lambda
kv:(kv[
1
], kv[
0
]))
WebsiteLog.dicturl=sorted(WebsiteLog.dicturl.items(), key =
lambda
kv:(kv[
1
], kv[
0
]))
#为什么不写个函数重用呢 因为我懒
out.write(
"检查结果如下:n"
)
out.write(
"网站的200访问ip排名如下:n"
)
travel(WebsiteLog.dict200,out)
out.write(
"网站的异常访问ip排名如下:n"
)
travel(WebsiteLog.dict4XX,out)
out.write(
"网站的异常访问url排名如下:n"
)
travel(WebsiteLog.dicturl,out)
print(
"检查完毕!"
)
#可视化是不可能了,只能导出一份报告自己慢慢看的样子
测试结果(ip部分)
一年半的时间下:
网站遭受的最过分的爬虫扫描器(不计408访问失败)访问了3356次。
网站遭受的爬虫扫描器,访问次数在1000次以上的ip有3个,大部分人还是很讲武德的。
网站遭受的最过分的扫描器(异常请求,不是爬虫扫描器)访问了1754次(这个扫描器同时扫描了相当多的织梦CMS链接,还是一个来自上海的ip,你无敌了孩子)。
网站遭受的扫描器,访问次数在1000次以上的ip有3个,在500次以上的ip有33个,在100次以上的ip有179个(没有统计代理ip的,里面应该有数十个是挂了几个代理ip扫的)。属于是脚本小子大开会,平均每1.5天我这就要被光顾一次。
测试结果(url部分)
我向来是不惮以最惨的立场去揣测宇宙第一的PHP语言的,这次情况却有所不同:
异常访问中,最多的自然是robots.txt(11271次),这个请求其实也不算异常,但是以搜索引擎光顾我网站的次数来看很异常。
除此之外,最常使用的居然是一个网关设备的漏洞url。
异常URL排名前十的如下所示:
- 1- /.env 1049
- 2- /boaform/admin/formLogin 916 (网关设备漏洞)
- 3- /config/getuser?index=0 647
- 4- /phpmyadmin/ 621 (PHPmyadmin,一个管理数据库的,委实说这扫描器应该开到888端口)
- 5- /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php 611 (PHPunit是一个测试框架,结合url这里应该是针对Laravel)
- 6- /wp-login.php 582 (WordPress)
- 7- /api/jsonws/invoke 544 (JSON Web服务)
- 8- /wp-content/plugins/wp-file-manager/readme.txt 478 (WordPress)
- 9- 弹到百度首页的SSRF攻击 459
- 10- /index.php?s=/Index/\think\app/invokefunction... 438 (ThinkPHP)
其实针对PHP的攻击还是相当多的,但是这次在单个漏洞的次数上被物联网漏洞稍微占了上风~而针对Java的攻击我却只看到了小几个,估计PHP还要被黑好几年咯。
. . . * . * 🌟 * . * . . .
原文始发于微信公众号(重生之成为赛博女保安):对个人博客进行攻击统计后,我发现
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论