记一次简单绕过waf设备的sql注入经历(适合新手)
我国正在大力开展教育信息化建设,近年来“互联网+教育”发展迅猛,目前我国高校信息化工程取得良好成效。信息化建设不断成熟的同时,也面临着巨大的安全威胁,高校正成为网络安全问题的重灾区。
今天小编将带领大家实战一次高校类型官网简单的绕过waf防护设备的sql注入实例(本次测试环境为自己内部搭建的模拟环境,下载安装的是网上通用的高校模板类型网站,并在网站系统安装了软件版waf)。
以下是一次sql注入漏洞的挖掘过程:
1. SQL注入原理:
SQL注入,一般指web应用程序对用户输入数据的合法性没有校验或过滤不严谨,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询的目的,从而进一步得到想要的数据信息。总的来说就是,攻击者通过系统正常的输入数据的功能,构造恶意数据,而系统又未作任何的校验,直接信任了用户输入的数据,使得恶意数据改变原本的SQL逻辑或者执行了额外的SQL脚本,从而造成了SQL注入攻击。
2. 危害:
1、使得系统业务功能异常或者失效;
2、恶意的破坏,比如:修改数据、删数据、删表等恶意破坏;
3、探查数据库类型、结构,获取数据库敏感数据,造成数据泄露;
4、修改数据库配置,控制服务器,进行恶意活动等;
3. 防护:
1、使用PreparedStatement,sql语句中的参数使用“?”占位符替换;
2、白名单验证参数是否符合所期望的类型、长度、大小、格式。名单查找是否存在已知的不良字符,字符串或模式;
3、将特殊字符进行转码,转码后拼接sql语句;
4. 漏洞复现过程:
第一步,也是最重要的一步---访问首页:
在页面上随意点击,得到如下页面,观察url发现极有可能存在sql注入,并且注入点可能为参数‘caa_id’;
尝试使用单引号进行测试,输入一个单引号后,返回页面报500,如下图:
输入两个单引号后,返回页面报200,虽然还是回显出现错误,但是不影响!
确定是SQL注入,接下来进入我们的payload构造环节,
首先尝试我们最基础的构造参数:poc :’and ‘1’=’1
哦豁!果然没这么简单,网站居然安装了云waf。
不出我所料,门户网站怎么可能这么容易搞定?
既然and被拦截了,可以尝试使用or 和 xor,如下:
or:-19’ or ‘1’=’1--+
or也被过滤了,最后还有xor可以尝试一下,如下:
xor: -19’xor ‘1’=’2--+
xor是异或,若两边的值相同(都为真或都为假)时,结果为真;反之,结果为假。
xor并没有被拦截,但是当把‘1=1’改成‘1=2’时,再次访问页面并没有变化;将前面的-19改成19,再将‘1=1’改成‘1=2’,页面也未发生变化。 这个方向,我暂时是没有办法了。(希望有大佬可以指点)
接下来,掏出我的秘密武器,构造如下:
‘-exp(709)-’和 ‘-exp(710)-’
exp()是一个报错函数,exp(709)是一个分界点;当传递一个大于709的值时,函数exp()就会引起一个溢出错误,所以在这我们可以利用页面报错和不报错这两个差异化来盲注。
果然 ,exp()是可行的!
接下来就是轮子构造环节,尝试:
%27-if(mid(user(),1,1)='a',exp(709),exp(710))-%27
再次访问页面,被拦截了。
尝试 %27-if(1=1,exp(709),exp(710))-%27
‘if’没有被拦截,可能是mid()或者user()被拦截了。
Mid(s,n,len)返回从n位置开始查找的,长度为len的子串。
mid也没有被拦截,那么就是user()被拦截了,可以尝试使用current_user来替换user()。
页面出现明显变化,
轮子已经构造完成,
%27-if(mid(current_user,1,1)=%27a%27,exp(709),exp(710))-%27
当前payload的含义就是:若当前用户名从左数的第一个字符为‘a’,则输出exp(709);反之,输出exp(710)。
打开渗透神器-burpsuite,开始爆破当前数据库用户名。
选中第一个‘1’和‘a’使用集束炸弹爆破。
集束炸弹:为如下图的攻击模式。
得到当前数据库用户名为‘root@127.0.0.1’
点到为止!
这次教育src挖掘经历虽然简单,但是这也是一次绕过waf的经历;总的来说,绕waf就是不断地尝试使用不同的函数、方式去替换已经被过滤的规则;世界之大,无奇不有,各式各样的waf也在等着我们去绕过,一起加油!
作者 gnoy
(该文章仅为一次经历分享,适合渗透入门阅读)