浅谈SQL注入绕过

Posted 蘑菇安全小组

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈SQL注入绕过相关的知识,希望对你有一定的参考价值。

0X00 背景

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

 

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

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

0X01 浅析绕过

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

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

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

w@2 关键字替换

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

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或者代码中的过滤规则只在getpostcookie方式中提交的参数生效,可以利用不同的方式提交参数,来绕过过滤规则。

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

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

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

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

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

过滤机制中一般只会过滤一部分特征码,这时候可以采用“替换”的形式绕过,比如过滤了“=”,可以使用“><likenot  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注入绕过的主要内容,如果未能解决你的问题,请参考以下文章

Web安全原理剖析——SQL注入绕过技术

【模拟环境】SQL注入时如何绕过逗号和百分号

SQL注入绕过的技巧总结

手工sql注入&&绕过waf &&一个实例分析

sql注入浅谈sql注入中的Post注入

SQL注入绕过——二次注入