文章目錄
- 什么是偽靜態注入?
- 偽靜態注入中如何繞過空格限制?
- 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 篇,點擊專欄導航查看全部系列內容。