实验十:Web日志审计

  • 苏煜程
  • 031803108

一、实验目的

让学生了解如下信息,并掌握具体的日志分析方法:

  • 分析网站服务器(Web Server)日志是网站分析的重要方法
  • 服务器日志记录了网站服务器的许多运行信息,这些信息能够帮助安全管理人员分析网站的流量和访问者在网站上的行为

二、实验原理

Web访问日志记录了Web服务器接收处理请求及运行时错误等各种原始信息。通过对WEB日志进行安全分析,不仅可以帮助网络管理员实时了解服务器的安全状况,还可以在网站被已经被黑客攻击造成经济损失的情况下,帮助分析安全攻击行为特征、溯源攻击者IP、还原攻击路径、找到网站存在的安全漏洞并进行修复

常见的Web服务器如Weblogic、Apache、Nginx、IIS、Tomcat等都自带日志文件。例如Apache有两个日志文件,分别是 access.log (用户访问日志)和error.log(Apache运行时的错误日志),可以使用grep -i"CustomLog" /etc/httpd/conf/httpd.conf查看Apache日志的路径

Apache日志有三种格式,分别是:combined格式、common格式和自定义格式。以下是combined格式的日志实例:

127.0.0.1 - - [11/Jun/2018:12:47:22 +0800] "GET /login.html HTTP/1.1" 200 786 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"

通过这条日志,我们可以清楚的知道用户IP,以及用户在什么时间,用什么操作系统、用什么浏览器的情况下,使用什么方法请求了网站的哪个页面,是否访问成功等,更多Apache日志格式说明见参考链接

通过以上分析可以知道,Web服务器会记录来自客户端的每一个请求,那么如何区分正常请求和恶意攻击请求呢?站在攻击者的角度,攻击者对网站进行渗透时,会包含大量的扫描请求和执行恶意操作的请求,而这两种请求在日志中都有各自的特征,例如扫描请求会访问大量不存在的地址,在日志中体现为大量的404响应状态码,而当攻击者对服务器进行恶意攻击操作,如果对日志记录以select为关键字进行过滤,加上访问时间、状态码等约束条件,管理员就可以查询最近可能成功的注入类攻击行为

WEB日志常见的安全分析方法:

确定入侵的时间范围,以此为线索,根据时间查找该范围内可疑的日志进一步排查,最终确定攻击者,还原攻击过程

攻击者在入侵网站后,通常会留下后门维持权限,以方便再次访问,因此可以通过查询日志,看看是否有近期内被创建、更新的脚本文件,是否存在上传文件行为,并以此为线索来展开分析

确定攻击源,例如可以通过定位攻击者的IP来还原其攻击的路径

对于规模较大的日志数据,则必须利用数据挖掘和统计分析技术,对其进行智能化分析处理,普通规模的日志文件,Window下推荐使用 EmEditor、Apache log viewer等可视化工具进行分析,LINUX下可以结合grep、awk等命令以手工方式进行日志分析

扫描二维码关注公众号,回复: 16728749 查看本文章

本次实验相关基础知识:SQL盲注

SQL盲注:当程序员隐藏了数据库内建报错信息,替换为通用的错误提示,SQL注入无法依据报错信息判断注入语句的执行结果,即为盲注。其基本原理是:既然无法基于报错信息判断结果,那么只能基于返回结果的逻辑真假的不同来判断。基本步骤见参考链接https://www.cnblogs.com/zixuanfy/p/6002545.html

二、实验题目

分析Web日志,找出flag,flag格式为flag{XXXXXX}

提示:url转码、SQL盲注、200状态码表示猜对、400状态码猜错

三、实验环境

  • 在线转码平台 https://tool.leavesongs.com/
  • 记事本或其他日志查看工具,如Apache log viewer
  • Linux或windows主机一部
  • 参考链接:
    • https://help.aliyun.com/document_detail/28987.html
    • https://blog.csdn.net/qq_23936389/article/details/94000757
    • https://www.cnblogs.com/zixuanfy/p/6002545.html

四、实验步骤及结果

题目是sqlmap采用二分法进行注入的日志,办法很多,可以手撕,可以根据特征进行分析

这里举例说一种。如果对Apache日志熟悉的话,应该知道,access.log里面会记录Response的状态码和Response包的长度。猜解正确或错误,返回的长度是不同的

以猜解的第24位为例,猜解正确的时候,返回的状态码为200,长度为1765;猜解错误的状态码为404,长度为5476。

而且可以得出结论,sqlmap采用二分法进行注入的时候,正确的值为最后一次进行>比较正确的值+1,即为125。 简单写个脚本,匹配一下即可

# coding:utf-8
import re
import urllib
 
f = open('access.log','r')
lines = f.readlines()
datas = []for line in lines:
    t = urllib.unquote(line)    
    if '1765' in t and 'flag' in t:  # 过滤出与flag相关,正确的猜解
        datas.append(t)
 
flag_ascii = {}  
for data in datas:
    matchObj = re.search( r'LIMIT 0,1\),(.*?),1\)\)>(.*?) AND', data)   
    if matchObj:
        key = int(matchObj.group(1))
        value = int(matchObj.group(2))+1
        flag_ascii[key] = value     # 使用字典,保存最后一次猜解正确的ascii码
        
flag = ''
for value in flag_ascii.values():
    flag += chr(value)
    
print flag

运行可以得到:

flag{sqlm4p_15_p0werful}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/kelxLZ/article/details/117436827