
2024年七大最佳免費貨幣轉換API
Lua 是一種易于學習并可嵌入到主機應用程序中的腳本語言。同時,它可以訪問底層操作系統的系統接口。它具有垃圾收集功能,具有基于關聯數組的強大構造,并且使用字節碼運行,從而提高運行速度。
不過,您可能不認為 Lua 是前端應用程序的代碼。許多人將它與Minecraft和Roblox等游戲聯系起來?。您還會發現 Lua 用于Redis等服務器端應用程序或Pandoc等可擴展實用程序。但在 Web 應用程序中呢??
開發人員在許多不同類型的應用程序中使用 Lua,包括 Web。Apache 和 Nginx 是兩種最廣泛使用的網絡服務器,它們分別提供mod_lua和lua-nginx-module?。此外,盡管自 2015 年以來CGILua一直沒有更新,但它仍可在現代 Linux 發行版上安裝和運行。?
假設您想超越 CGI 和 Web 服務器的嵌入式功能?可以使用OpenResty,這是一個使用 Lua 和 Nginx 的 Web 平臺。Kepler 項目提供了Orbit(一個 MVC 工具包)和WSAPI(Lua 的抽象層)。?
因此,XSS 攻擊利用 Lua 有很多機會。讓我們看看如何進行。
反射攻擊是最直接、最常見的XSS 攻擊形式。
當惡意腳本從 Web 應用程序“反射”到用戶的 Web 瀏覽器時,就會發生這種情況。用戶會點擊鏈接,期望發布回復、查看圖片或視頻,或訪問友好網站。
但他們的瀏覽器卻執行了破壞性腳本。該腳本經常將用戶的個人數據發送給攻擊者,因此有“跨站點腳本”一詞。被入侵的網站會將您引導到另一個網站。這種攻擊很容易發起,這就是它如此流行和有效的原因。
反射型 XSS 攻擊的另一個名稱是非持久性攻擊,因為它們不會危害底層應用程序。犯罪分子將它們嵌入用戶定義的內容中,例如論壇帖子和評論。因此,它們通常只對一小部分受眾可見,而攻擊者必須廣撒網,希望少數受害者會點擊惡意鏈接。
Lua 的簡單語法使得新手 Web 程序員很容易使他們的應用程序遭受反射型 XSS 攻擊。
Apache 的mod_lua有兩種方法可以將傳遞給處理程序的參數回顯給請求者。
Mod_lua 應用程序實現了一個 handler(r)函數,其中 r是 Apache 傳遞給該函數的請求對象。
function handle(r)
local danger = r:parseargs().user_name or ""
r:puts(danger)
end
處理程序函數使用r:parseargs()提取傳遞給 Web 調用的參數 。它使用r.puts()處理字符串, 使用r.write()處理未緩沖的字節,將內容作為 HTML 響應寫回請求者。在這兩種情況下,字符串都不會被清理或檢查。如果攻擊者傳入 Javascript 或 HTML 內容,處理程序會逐字返回。
Nginx 容易受到類似攻擊。其 Lua 代碼可以動態加載或包含在 OpenResty 安裝中。但是,它不會清理輸入。
local danger = ngx.req.get_uri_args().user_name or ""
ngx.header.content_type = "text/html"
ngx.say(danger)
Say()將字符串作為 HTML 響應返回給請求者。
CGILua 看起來也很相似。
local danger = cgilua.QUERY.user_name or ""
cgilua.htmlheader()
cgilua.put(danger)
在所有這些情況下,都應在使用前驗證輸入。
在存儲攻擊中,黑客將惡意代碼嵌入用戶論壇或社交媒體的評論中。這些攻擊具有持久性,因為 Web 應用程序將它們存儲在數據庫或其他永久存儲中。它們更危險,因為許多用戶可能會在應用程序所有者發現攻擊之前查看破壞性內容。
應用程序不會(或除了)將惡意請求回顯給請求者,而是會將其存儲起來。后續訪問該內容的訪問者會請求同一頁面,看到惡意數據并點擊它。
下面是一個精心設計的代碼片段,它將評論存儲在 MySQL 中,然后回顯給定帖子 ID 的完整評論集。
function handle(r)
-- connect to mysql
driver = require "luasql.mysql"
create environment object
env = assert (driver.mysql())
connect to data source
con = assert (env:connect("mywebapp","root","123456"))
-- grab post id, user, text
local post_id = r:parseargs().comment_id or ""
local user_name = r:parseargs().user_name or ""
local comment_text = r:parseargs().comment_text or ""
-- insert into the comments table
res = assert (con:execute(string.format([[
INSERT INTO comments
VALUES ('%s', '%s', '%s)]], post_id, user_name, comment_text)
))
-- probably do some more html things
-- now pull all fothe comments out of the table and display
-- cursor needs an order by
cur = assert (con:executestring.format([[SELECT user_name, comment_text from post_id = %s"]], post_id))
row = cur:fetch ({}, "a")
while row do
r:puts(string.format("<p> User: %s<br> %s", row.user_name, row.comment_text))
-- reusing the table of results
row = cur:fetch (row, "a")
end
cur:close()
con:close()
env:close()
end
在此示例中,用戶名、評論正文或兩者都可能包含惡意代碼。它會回顯給用戶,但它也會存儲在 MySQL 中!因此,查看評論的任何其他用戶都會看到危險的腳本。
在 Lua Web 應用程序中防止這些攻擊相對簡單,并且已經有工具可以幫助您。
在上述所有情況下,Lua 腳本都會使用請求數據而不驗證其內容。這是第一個也是最大的錯誤。至少,您必須在存儲或將收到的任何數據傳回給 Web 用戶之前對其進行“轉義”。Lua 沒有內置的方法來清理 Web 輸入,因此您必須自己動手或依靠用戶社區。
Web_sanitize 是Lua 的 HTML 過濾器。您可以從 GitHub 下載它或使用luarocks安裝它。代碼太長,無法在此處嵌入,但如果您查看它(在將其添加到您的應用程序之前您應該查看它),您會看到它如何清理和轉義用戶輸入,以便惡意腳本不再在客戶端瀏覽器中執行。您可以轉義 HTML 和 CSS 或從請求中提取文本,從而刪除任何嵌入的代碼。?
這是 Apache Lua 處理程序的安全版本。
function handle(r)
local web_sanitize = require "web_sanitize"
local safe = web_santize.extract-text(r:parseargs().user_name) or ""
r:puts(safe)
end
另一種方法是在使用輸入之前對其進行驗證,但這并不是凈化輸入的替代方法。這是一個額外的步驟。在刪除任何潛在的腳本代碼后,您可以確保輸入在上下文中有意義。因此,在存儲信用卡的校驗和或用戶地址之前對其進行驗證。這不一定能防止 XSS,而且在不產生新問題的情況下驗證輸入可能很有挑戰性,尤其是在涉及國際名稱時。不過,在處理用戶指定的代碼和格式化數據時,這是一個好主意。
在這篇文章中,我們研究了 Lua XSS。我們了解了開發人員如何使用 Lua 開發 Web 應用程序,以及該語言在使用或存儲用戶輸入之前沒有內置工具來對其進行清理。在查看了三個易受攻擊的代碼示例后,我們研究了一種保護它的簡單方法。
文章來源:Lua XSS: Examples and Prevention