浅谈SQL注入绕过

幸运草 2020年3月31日21:22:23安全防范评论阅读模式

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

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

浅谈SQL注入绕过

觉得还是写一篇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=-15 union/**/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 使用其他变量或者命令对注入语句进行替换

过滤机制中一般只会过滤一部分特征码,这时候可以采用“替换”的形式绕过,比如过滤了“=”,可以使用“>、<、like、not  in”等去等价替换。还可以使用SQL语句的函数进行替换,比如禁用了group_concat() 可以使用 concat_ws()。这方面要深究的话需要自己对数据库的某些函数和符号去了解深入。

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=-15 union select 1,2,3,4.....&login_id=16

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

本文来源于:浅谈SQL注入绕过-变化吧
特别声明:以上文章内容仅代表作者本人观点,不代表变化吧观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与变化吧联系。

  • 赞助本站
  • 微信扫一扫
  • weinxin
  • 加入Q群
  • QQ扫一扫
  • weinxin
幸运草

发表评论