以下内容为一个CTF题引出的内容,经常玩CTF的大佬们可以直接跳过。
偶然的机会朋友发我一个日志文件,让我看一下服务器access.log文件,说这个是一个CTF的题目,就给了这么一个access文件,然后让找flag,由于自己属于专业划水的,CTF基本没碰过,也不知道怎么弄就试着分析了一下。
打开日志文件文件里面内容基本长这个样子。
大概浏览了一下日志文件发现,CTF都这么直接的吗,连点干扰流量都没有,整个文件就只有一个访问者。因此都不需要对找攻击者地址。在实际的安全事件分析过程中会存在大量正常业务流量,因此下面我在进行事件分析的时候还是按照正常的分析过程来展开说明以免有遗漏的地方。
我在进行日志分析的时候主要会执行404统计定位攻击者、500统计、目录遍历定位攻击者、200统计评估攻击影响。
(需要注意的是此处的攻击行为取证并非司法取证,司法取证有一套完整的流程和注意事项,如哪位有兴趣可以去研究一下)如果经常进行日志分析师建议使用专业的日志分析工具,以便更好的检索,若日志文件较小,可直接使用notepad++来进行分析,由于样本文件较小因此这里我直接使用notepad++来进行分析。
首先我喜欢先统计一下404响应的数量,因为这样可以最直接的反映出攻击流量的情况,如果该方法没有明显结果,则可以通过其他方式进行判断。
若404状态统计结果较多,通过显示所有404记录,查看404(如果您无法理解404,抱歉这里并不会解释这么详细您可以查看百度百科“HTTP响应头404”)页面产生的原因,本样本日志可以非常明显的看出大部分404流量是由扫描器产生,因此可以断定这个地址非常可疑,至少在一段时间内他在不断的尝试攻击我们的服务器。
由于样本文件交简单,都是扫描器产生的行为,因此没有500状态的流量,此处就不展开分析,直接带过。在分析过程中记录下来我们发现的异常IP,对异常IP进行攻击流量提取,此处提取是用的notepad++的正则表达式方式进行检索全文,至于正则表达式的具体用法请参考正则表达式基础语法,本文中的主要以上是查找192.168.8.254开头的行,返回状态是404的,进行全部查。
通过该方法,遍历500、301、302等基本可以检索出攻击者所有攻击行为。
经过上面的过程我们基本可以锁定攻击者及攻击者发动的攻击行为,此阶段需要完成的工作就是评估攻击行为对目标产生的影响。
使用上面取证的方法找出攻击者所有200状态的请求
此处的日志没有任何其他内容,通过日志可直接看出,攻击者在使用SQLMAP进行注入攻击且以攻击成功。
存在漏洞的页面为:/index.php参数为:id
为了便于分析我首先将文件进行url解码,url解码方式有很多,比如这里文件比较小可以直接通过工具网站在线解码URL解码工具,用脚本处理是直接解码也可以。
解码示例如下:
对文件内容进行url解码后内容比较清晰,可以看到如下内容:
通过这三个请求可以判断出这个地方存在一个注入漏洞,攻击者通过盲注方式判断出该漏洞存在。
通过上面的分析工程我们可以确定攻击者在服务上找到了sql注入漏洞,并成功触发了验证了sql漏洞可利用,那么攻击在在是否利用该漏洞进行了其他操作,若攻击者利用了该漏洞,那影响范围都涉及哪些表呢?我们继续分析。
此处纠结3分钟,是否需要补充一部分sql注入的基础知识以完善文章的完整性,最后决定还是简述一下吧,因为这个文章大佬也想看,想看的人若还感觉不完整那就不太好了。
====================分割线以内可以跳过====================
sql盲注基础知识参考sql盲注利用、sql盲注利用,我觉的两位师傅对sql盲注的利用说的已经够详细了我就不具体说明了,这里知识简单提一下:
SQL注入:由于程序在进行开发时未对用户输入内容进行过滤,用户在输入可以操作SQL语句的字符时可以成功带入到sql语句中执行,比如您的程序写的是sql = “select user、passwd from users where user=”.$user."and passwd=".$passwd此时如果user和passwd变量如果是日志前台获取那么用户就可以直接控制您SQL语句的执行了。
盲注:其原理和SQL注入一样,但是成员在开发时可能对程序进行了异常捕获或通过接口方式进行数据提取,系统只向前台输出读取状态,这时候就形成了SQL盲注
利用:SQL盲注主要分为布尔型和时间型,布尔型可以通过CASE WHEN THEN、ascii+mid、ascii+substr、ord+mid等,时间型盲注可以通过sleep函数来判断系统返回时间。
布尔型/时间型区别:刚开始只使用工具测试注入的时候可能无法很好理解时间型盲注和布尔型盲注的区别,举个简单的例子:程序员对异常输出控制的比较好,所有sql语句执行失败的时候只返回查询失败,查询成功系统返回查询的数据,这种就是布尔型。时间型盲注比如我们在查看一个投票也面的时候,输入查看的对象ID,但系统默认返回全部对象页面,但是系统会在内部执行一次查询。就是查询和显示是无关的,显示内容不会sql语句执行的结果变化而变化。
=====================================================
通过分析可以确定系统存在sql注入漏洞,因此需要评估攻击者在利用该漏洞读取过哪些内容。通过mysql的特性可以通过搜索from INFORMATION_SCHEMA依次分析攻击者读取信息。
上面读取数据库信息,判断数据库名字第一个字符,通过此方法依次枚举出数据库名,然后根据读表的顺序依次分析出攻击者获取的表名、列名、以及记录数量。
若一条一条分析日志记录,读取数量大了将异常痛苦,因此我编写一个脚本来自动完成其他分析情况。脚本运行情况如下:
在进行分析过程中可能会遇到16进制数,如下面这条记录:
0x666c6167就是16进制转换成字符串即为:flag。