【Web安全】深入浅出理解“SQL注入-伪静态注入”及空格限制绕过技巧

发布于:2025-07-31 ⋅ 阅读:(14) ⋅ 点赞:(0)


往期文章

【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 篇,点击专栏导航查看全部系列内容。


网站公告

今日签到

点亮在社区的每一天
去签到