浅谈SQL注入绕过
Posted 蘑菇安全小组
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈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=-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注入绕过的主要内容,如果未能解决你的问题,请参考以下文章