基于应用日志的扫描器检测实践

基于应用日志的扫描器检测实践

在网络上搜索web扫描器时,各类扫描器工具、扫描攻略玲琅满目,但对扫描器检测方法的内容却少之又少。因此,本文对各类web扫描特特征进行了梳理和总结,并结合苏宁应用防火墙(SNWAF)日志数据,分别展示了规则模型、统计特征模型和基于文本情感分析的深度学习模型在Web扫描器识别上的实践效果,供大家参考。

1. 扫描器概览

Web扫描器通过构造特殊请求的方式,对Web系统可能存在的安全漏洞进行扫描,是渗透工作的必备工具。相关的网络资源有很多的漏扫工具研发和使用的工作,如Nessus、Nikto、SQLmap等,然而扫描器检测的工作却非常少。这里尝试从扫描器检测方向出发,根据扫描器的功能和所产生的请求内容对其进行分类,并提出一种简单有效的检测思路。

1.1 敏感内容扫描

俗话说知己知彼方能百战不殆,当黑客或渗透测试人员面对一个未知站点时,这个站点对他们来说就是一个黑盒。这时候不妨拿敏感内容扫描器先给它来个一把嗦摸摸底,指不定就能扫到有价值信息,找到撬动安全防护缺口的第一把钥匙。

敏感内容扫描器通常具备一些列敏感路径及敏感文件的字典,扫描器利用这些敏感内容字典对站点进行盲扫来判断是否存在这些敏感内容;进一步地,通过响应数据包对站点目录结构及其他信息进行判断,为下一步针对性单点突破作准备。

这里提到了一个字典的概念,字典这个玩意很重要,可以说字典的质量、广度和深度决定了这个扫描器的上限。相对于IP代理、UA伪造、随机放访问时间间隔这些伪装手段来说,敏感内容是固定的,翻来覆去就这么多东西,同时因为请求资源不存在大多数会返回404状态码(有些会触发WAF拦截策略返回403,还有些因为服务器设置了默认跳转状态码为301或302)。攻方选手通常不会构造毫无意义的字典内容来浪费有限的资源和精力,这些字典通常包含如下内容信息(忽略大小写):

  • 敏感目录信息:如/admin/, /phpadmin/, /mysqladmin/, /usr/local/, /etc/passwd/, ...
  • 敏感配置文件:如.bashrc, .bash_history, conf.icn, config.inc, ...
  • 版本文件信息:如/.git/config, /.svn/entries, /.bzr/xxx, ...
  • 备份文件信息:如htpasswd.bak, index.php.bak, database.wsp, backup.zip, ...
  • 密钥文件信息:如/.ssh/id_rsa, /.ssh/known_hosts, id_rsa.pub, authorized_keys, ...
  • 日志文件信息:如/logs/error.log, /logs/auth.log, /var/log/mysql/mysql.log, ...
  • 其他敏感文件:如config.php, system.inc, mysql.inc, shell.php, ...

1.2 Web漏洞扫描

漏洞扫描器通常会与爬虫相结合。首先利用爬虫获取到页面可能存在注入点的接口,然后针对该接口来一个SQl注入、XSS注入、命令注入一把嗦,对于一些安全防护意识低的站点往往能取到最直接的效果。针对这类扫描请求,WAF都能够做到单点正则过滤,理论上会拦截返回大量403状态码,但是扫描器常针对一些新域名或偏僻的域名进行扫描,这些域名往往没有启用WAF攻击防护,因此实际上是有很多是未被拦截的非403状态码。同上述敏感内容扫描,这类请求往往也具备明显的文本特征,下面分别以sql注入、文件包含和XSS跨站扫描举例。

1.2.1 sql注入漏洞扫描

SQL注入攻击是一种注入攻击,它将SQL命令注入到数据层输入,从而影响执行预定义的SQL命令;通过控制部分SQL语句,攻击者可以查询数据库中任何自己需要的数据,利用数据库的一些特性,可以直接获取数据库服务器的系统权限。

首先,判断接口是否存在注入点,如:

  • 若参数ID为数字,加减运算判断是否存在数字型注入
  • 参数后加单双引号,判断返回结果是否报错
  • 添加注释符判断前后是否有报错:如id=1' --+id=1" --+id=1' #id=1" --+
  • 有些参数可能在括号里面,所以也可以在参数后面加单双引号和括号,如id=1') --+id=1") --+id=1') #id=1") --+
  • 参数后面跟or 或者and,判断返回结果是否有变化,如1' or 'a'='a或者and 'a'='a或者1' or 'a'='b或者1' or '1'='2
  • 也可以考虑时间延迟的方法判断是否存在注入,如 1’ and sleep(5)

然后对存在注入漏洞的点利用联合查询一步步获取信息,如:

  • 查询数据库名:id=0’ union select NULL,database(),NULL --+
  • 爆库名:id=0’ union select null,group_concat(schema_name),null from information_schema.schemata --+
  • 爆表名:id=0’ union select null,group_concat(table_name),null from information_schema.tables where table_schema=‘security’ --+
  • 爆字段名:id=0’ union select null,group_concat(column_name),null from information_schema.columns where table_schema=‘security’ and table_name=‘users’ --+

或者通过报错回显查询结果,如:

  • 回显数据库名:and extractvalue(1,concat(0x7e,(select database())))
  • 回显表名:
    and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=‘security’ )))
  • 回显列名:
    and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=‘security’ and table_name=‘users’)))

1.2.2 文件包含漏洞扫描

服务器通过php的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,非法用户可以构造这个恶意文件来达到恶意的目的,如读取目标主机上的其他文件,远程文件包含可运行的PHP木马,包含一个创建文件的PHP文件,本地文件包含等。

  • Include:包含并运行指定文件,当包含外部文件发生错误时,系统给出警告,但整个php文件继续执行;
  • Require:跟include唯一不同的是,当产生错误时候,include下面继续运行而require停止运行了;
  • Include_once:这个函数跟include函数作用几乎相同,只是他在导入函数之前先检测下该文件是否被导入,如果已经执行一遍那么就不重复执行了;
  • Require_once:这个函数跟require的区别 跟上面所讲的include和include_once一样。
1.2.3 XSS跨站漏洞

跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。与正常请求相比,XSS请求也具备明显的文本特征,如<script>alert(0)</script>,<img src=0 onerror=alert(0)>等。

2. 规则模型

扫描器检测与Web攻击检测不同之处在于,扫描是一种持续的行为,我们通过对扫描器持续一段时间的请求进行聚合分析,而Web攻击检测则是把每条请求作为一次独立的事件来判断是否为Web攻击。扫描器在请求不存在的资源时往往会返回状态码404,但实际生产环境中并非如此。尤其是作为电商企业,希望被正面的搜索引擎抓取,返回404的这种方式会对SEO搜索引擎优化产生不利影响,因此多数域名针对这种请求会做3XX的跳转。总体来说,大量返回404的请求往往都是盲扫请求,但仍有大量盲扫请求返回状态码并非404。这里依赖Web请求日志,在一定时间被仅对请求url文本特征进行分析,来识别扫描器。

2.1 正则提取

敏感内容扫描器往往会请求敏感路径、敏感文件等信息,因此首先收集这些信息,然后用正则匹配去你和这些内容。这里分别按照敏感信息的类型进行分类:

class Sensitive(object):
    """docstring for Sensitive"""
    def __init__(self):
        super(Sensitive, self).__init__()
        self.patterns = [
            # 0. 敏感文件
            re.compile("(((php)?info|php|[mc]oon|dns|payload|mytag_js|cmd|log|my|shell|data|te?mp|settings|default|root|robots?|htaccess|(my)?sql|data(base)?|db|conf(iguration|ig|igs)?|bac?k(up)?|te?mp|pack(age)?|test|web(site)?|old|site|src|code|suning|result|home|ftp|common|sys(tem)?|(htp)?passwd|shadow|ssh|httpd?)\d{,3}\.(php|zip|rar|tar|gz|tgz|bz2|7z))(\?|&|\s|$|\.)",re.I),
            # 1. 敏感后缀
            re.compile("(\.(sql|in(i|c)|conf(ig)?|pub|bac?k(up)?|mdb|swp|ssh|old|tag|git(ignore)?|svn|bzr)(\?|&|\s|$))",re.I),
            # 3. 敏感日志
            re.compile("(/logs?/(\w+/){0,}[\w_\.-]+log$)", re.I),
            
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值