【Web安全】深入浅出理解“SQL注入-伪静态注入”及空格限制绕过技巧
文章目录
- 什么是伪静态注入?
- 伪静态注入中如何绕过空格限制?
- 1. 用注释符替代空格
- 2. 用不可见字符(URL 编码)替代
- 3. 用括号分隔语句
- 4. 用特殊符号替代
- 核心逻辑
往期文章
【Web安全】一次性搞懂 ReDOS 漏洞原理/检测/防御
【Web安全】一次性搞懂 XSS 漏洞原理/检测/防御
【Web安全】一次性搞懂 CSRF 漏洞原理/检测/防御
【Web安全】一次性搞懂 SSRF 漏洞原理/检测/防御
【Web安全】一次性搞懂越权漏洞原理/检测/防御
【Web安全】逻辑漏洞之支付漏洞:原理、场景与防御
【Web安全】小白也能懂的并发漏洞:原理、场景与防御
【Web安全】逻辑漏洞之URL跳转漏洞:原理、场景与防御
对于刚踏入 Web 安全领域的人来说,SQL 注入是绕不开的重要知识点,而伪静态注入作为 SQL 注入的特殊场景,常常让人感到困惑。本文将解析伪静态注入,并介绍其空格限制的绕过方法。
什么是伪静态注入?
要理解伪静态注入,我们得先从 URL 说起。大家平时浏览网页时,可能会注意到两种不同形式的 URL。
- 一种是动态网页的 URL,比如
index.php?id=1
,这种 URL 里通过?和&清晰地传递着参数。 - 一种则看起来像静态页面的 URL,例如
index-1.html
或者article/123.html
,这些就是伪静态 URL。
伪静态其实是通过服务器的相关配置,比如 Apache 的 Rewrite、Nginx 的 rewrite 模块,把动态 URL 伪装成了静态页面的样子。这样做的好处是提升了 URL 的美观度,也对 SEO 更友好。但大家要知道,这种伪装只是表面上的,URL 里的参数本质上还是动态传递的。
而伪静态注入,就是当网站对伪静态 URL 中的参数没有进行严格过滤时,攻击者可以通过构造恶意参数来注入 SQL 语句。比如说,针对index-1.html
这个伪静态 URL,攻击者可能会构造出index-1' and 1=1--.html
这样的恶意 URL,从而触发注入。所以,伪静态注入的核心就在于伪静态 URL 背后的参数过滤不严格,给了攻击者可乘之机。
伪静态注入中如何绕过空格限制?
在 SQL 注入里,空格是个非常重要的角色,它像个分隔符,把 SQL 关键字、函数、参数等区分开来,比如select * from users where id=1
这句话,正是有了空格,数据库才能正确理解语句的结构。但很多网站会设置过滤规则来拦截空格,比如把空格替换成空,这时候就需要想办法用其他字符或方式来替代空格,让 SQL 语句还能被数据库正确解析。下面就给大家介绍几种常见的方法。
1. 用注释符替代空格
数据库支持的一些注释符,像/**/
、--
、#
,在某些情况下可以替代空格,而且不会影响语句的逻辑。
在 MySQL 中,/**/
是很常用的。比如原来的语句select * from users where id=1
,可以写成select/**/*/**/from/**/users/**/where/**/id=1
,这样数据库依然能正确解析。
举个伪静态注入的例子,针对index-1.html
这个 URL,注入语句可以改成index-1'/**/and/**/1=1--.html
。不过这里要注意,--
后面需要加个空格,当然也可以用#
来替代。
但有一点要提醒大家,在伪静态注入场景中,如果 URL 被服务器解析为路径,/**/可能会被当成路径分隔符,这样注入就会失效,所以使用的时候要多留意。
2. 用不可见字符(URL 编码)替代
ASCII 中有一些不可见字符,比如制表符、换行符、回车符,在数据库中它们会被解析为 “空白分隔符”,我们可以把它们进行 URL 编码后传入,以此来绕过空格过滤。
常见的有制表符,它的 URL 编码是%09
,对应着 ASCII 中的 Tab 键;换行符的 URL 编码是%0a
;回车符的 URL 编码是%0d
。
比如原注入语句是id=1' and 1=1
,我们可以写成id=1'%09and%091=1
,这里就是用%09
替代了空格。
3. 用括号分隔语句
数据库允许用括号()
来分隔函数、表名、条件等,这在一定程度上可以替代空格的分隔作用,尤其适用于关键字与参数的分隔。
比如原来的语句select * from users where id=1
,可以写成select(*)from(users)where(id=1)
。
在伪静态注入场景中,针对index-1.html
,可以构造出index-1')and(1=1)--.html
这样的注入语句。
4. 用特殊符号替代
部分数据库还支持一些特定符号作为隐性分隔符。
在 MySQL 中,反引号可以用来包裹表名或列名,间接起到分隔的作用,比如
select*fromuserswhereid=1`。
在 SQL Server 等部分环境中,加号+
可以被解析为空格,不过需要结合它的 URL 编码%2b
来使用。
核心逻辑
其实,绕过空格限制的本质就是找到数据库能够解析为 “分隔符” 的字符或语法,用它们来替代空格的作用,让注入语句在没有空格的情况下,依然能被数据库正确识别和执行。在实际操作中,大家要结合数据库的类型,像 MySQL、SQL Server、Oracle 等,以及网站的过滤规则,灵活地进行测试,才能找到有效的绕过方法。
本文是「Web安全基础」系列的第 9 篇,点击专栏导航查看全部系列内容。