渗透技巧篇--关于安全狗的一些看法

CracerCracer 2016-3-22 渗透测试 1,428 2 4

安全的攻与防一直永不过时的话题。
正如你渗透的某个网站,也许某一刻因为各种技术条件限制,你无法很好对其进行渗透,但是随着自己的成长以及研究。总会有些意想不到的小惊喜在等着你。
上一周,自己手上有不少的任务,所以前三天是论坛上的,后两天则去做自己手头上的事情。在渗透一个网站的时候,发现了一个数字型的注入点,正准备利用的时候。Duang,安全狗弹出来了。

1

 那天手上的任务不算太多,就打算手动测试一下,思考怎么去绕过安全狗(⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄)。
     那么下面来讲述我的故事吧!
     (1)寻找到一个疑似数字型的注入点
     访问网站之后,我对带id参数的url进行手工测试。发现有一个url的id参数有问题。
     首先是正常的url,返回的页面如下图。

2

之后我简单的遍历一下id这个参数,当id=1的时候。页面长这个样子。

3

 然后我开始验证是否可能存在注入点,一般对于这种数字型的参数。我们通过原id数值加减乘除另外一个数值,然后对比运算后的结果的页面与对应id页面是否一样。简单来说,要是id=37-36这个页面和id=1页面长的一样,我们可以猜测这里可能存在一个注入点。
     然后将id参数变换成id=37-36,如下图。可以发现这个页面完全和id=1一模一样。

4

(2)然后我使用order by [数字]来确定当前select语句的列数的时候,数据库报错了。如下图。

5

由上图我们可以看见,原来后台的sql语句已经带有order by,那我们--+(在url中+表示空格)注释它好了。可以看到页面又和id=37的一样了。

6

 之后和常规一样,我们使用union select 1来获取数据。但是现实狠狠的给我们一个耳光,网站有安全狗。如下图

7
     之后,楼主开始测试了,想一想用%0a(对应着换行符)。不过好像并没有什么卵用。如下图

8

那我们试试空字符%00,这个在很多场合有神奇功能的字符。好像有用耶,网站返回报错信息,如下图。

11

我们可以看到37和union之间没有空格。我们加上一个空格看看。如下图,后台还是报错了,报错信息和之前一样,这说明%00这个符号在sql查询语句会有问题,那我们怎么办呢?

12

我们将%00放在什么位置,对于sql语句是没有影响呢?我想机智的你会想到mysql的多行注释,我们只需要将%00放在/**/之间,mysql将会对%00视而不见。那我们来看看实际的结果。

13

从上图可以看到,返回的错误信息不一样了。熟悉sql语句的同学会知道,这是在告诉我们我们union前面的两个select 语句不一样,这时候我们仔细观察一下,这里select 的列数变成了三列,和我们第一次测试的不一样。如下图,下面是我们第一次union的测试,可以看到这里只有一列。也就是说这个id参数用在了两次不同的查询,意味着我们无法通过union select在获取数据了。

14

 现在我们来理清一下思绪:
     第一次select语句为: SELECT count(id) as c FROM `hdm0550293_db`.`m16_news` WHERE cid=37/**/union select 1,2,3-- LIMIT 1
     第二次select语句为: SELECT `id`,`title`,`pic` FROM `hdm0550293_db`.`m16_news` WHERE isdisplay=1 AND cid=37/**/union select 1-- ORDER BY sort desc,id desc LIMIT 0,9   
     (3)既然union无法利用,那我们现在可以利用的技术为报错型注入与布尔盲注。
     [1]我们测试updatexml(1,concat(0x7e,user()),0)

15

[2]我们测试extractvalue(1,concat(0x7e,user()))

21

[3]我们测试or (select count(*) from information_schema.tables group by concat(user(),floor(rand(0)*2))),如下图。:-O,我的天呀,我们想要的数据出来了。

22

获取当前数据库,or (select count(*) from information_schema.tables group by concat(database(),floor(rand(0)*2)))

23

  但是在获取数据表名的时候,狗狗还是检测到这种。
     (select count(*) from information_schema.tables group by concat((select table_name from information_schema.tables where table_schema=database() limit 0,1),floor(rand(0)*2)))--+

24

但是,我们起码已经一步步的绕过来,我们突破了它的几个防御点。所以为自己点个赞。
     [2]当然我们也可以使用盲注技术来获取数据,可是一些常见的列表名还是会被封禁。下面是我在写盲注脚本跑出的库名。

26

(4)后来答主自己在本地环境安装了最新的apache版的安全狗。

123

 我们来测试测试,新版本是否可以使用%00。
     [1]首先,我们先看一下我们发现问题的站点。使用/*%00*/and 1=1可以正常返回页面

1234

而看一下我本地环境,最新版的安全狗。这样是无法通过的。

333

  很可惜,这个%00符号,最新版的安全狗是检测的,但是为什么目标站点没反应呢?
     可以看到安全狗有个选项,在线更新防护规则。安全狗对于新出来的注入是通过规则来匹配的,而很多网站以为装了安全狗就安然无恙了。殊不知缺乏管理,对安全的不作为,导致了他们即使有了waf,也会导致自己网站遭受黑客的攻击。

12345
  

转载请注明来自Cracer,本文标题:《渗透技巧篇--关于安全狗的一些看法》

喜欢 (4) 发布评论
2 条回复
加载中...
  1. 11个月前 (05-21)
    椅子

    赞一个

  2. 海绵宝宝 1年前 (2016-03-23)
    沙发

    教我打狗棍法 😛

发表评论


Top