本文共 890 字,大约阅读时间需要 2 分钟。
1. 使用Content-Type HTTP标头进行检查2. 使用最适合的数据类型3. 手动配置每一个数据的数据类型。
上述的第一种方法是确实是很合理的,不过它有很严重的缺点。首先,不是所有的数据字段都会有一个Content-Type信息。举个很简单的例子,比如你使用GET方法发送一个参数:
?jdata={"json":"here"}
其次,攻击者可以修改默认的Content-Type值。所以服务器信任传输进来的数据显然不是一个很好的防御选择。
实际上,大多数的防火墙都会自动选择数据类型,然后采取最适合的数据解析器。这一种方法可以让我们采取不一样的攻击方法来绕过防火墙的防御。为了能够利用成功,攻击者需要像构造json数据那样,构造攻击的payload,就比如我们要利用sql注入漏洞:
?injection={"'union/*":"*/select", ",2,password, ":" FROM users;#"}
上述代码就相当于执行了:
' UNION SELECT 1,2,password,4 FROM users--a-
但是在防御系统的JSON解释器中,这个数据看起来就不太一样:
防火墙会对JSON数据中的每一个键以及对应的数值进行检测。因为这些键名以及键值都不会被检测为攻击,不过他们连接到一起就是攻击代码,由于JSON解释器的存在,导致了我们这些代码进行了组合,然后攻击利用成功。
使用同样的方法,我们可以将我们的payload构造进XML格式中。下面攻击载荷同样展示了sql注入的攻击代码,不过数据格式为XML:
I'm an XML. Trust me!
转载地址:http://kcxbx.baihongyu.com/