【網路安全】SQL注入、XML注入、JSON注入和CRLF注入科普文
- 2019 年 10 月 29 日
- 筆記
SQL注入
所謂SQL注入,是將惡意SQL命令通過某種方式提交到伺服器後台,並欺騙伺服器執行這些惡意的SQL命令的一種攻擊方式。 —— [ 百度百科 ]
造成SQL注入漏洞原因有兩個:一個是沒有對輸入的數據進行過濾(過濾輸入),還有一個是沒有對發送到資料庫的數據進行轉義(轉義輸出)。
一些尋找SQL漏洞的方法
http://host/test.php?id=100 and 1=1 //返回成功 http://host/test.php?id=100 and 1=2 //返回失敗 http://host/test.php?name=rainman 『 and 『1』=『1 //返回成功 http://host/test.php?name=rainman 『 and 『1』=『2 //返回失敗 http://host/test.php?name=rainman 『 and 『1』=『2 )) //使用括弧進行語句閉合 //在具有模糊搜索的地方 1)先搜索('),如果出錯,說明90%存在這個漏洞。 2)然後搜索(%),如果正常返回,說明95%有洞了。 3)然後再搜索一個關鍵字,比如(2006)吧,正常返回所有2006相關的資訊。 4)再搜索(2006%'and 1=1 and '%'=')和(2006%'and 1=2 and '%'=')。 //看看能否繞過驗證 (1) 用戶名輸入: 『or 1=1 or』 密碼:任意 (2) Admin』 -- (或』or 1=1 or』 --)(admin or 1=1 --) (MSSQL)(直接輸入用戶名,不進行密碼驗證) (3) 用戶名輸入:admin 密碼輸入:』 or 『1』=『1 也可以 (4) 用戶名輸入:admin' or 'a'='a 密碼輸入:任意 (5) 用戶名輸入:』 or 1=1 -- (6) 用戶名輸入:admin』 or 1=1 -- 密碼輸入:任意 (7) 用戶名輸入:1'or'1'='1'or'1'='1 密碼輸入:任意 //不同的SQL伺服器連結字元串的語法不同,比如MS SQL Server使用符號+來連結字元串,而Oracle使用符號||來連結 http://host/test.jsp?ProdName=Book』 //返回錯誤 http://host/test.jsp?ProdName=B』+』ook //返回正常 http://host/test.jsp?ProdName=B』||』ook //返回正常說明有SQL注入 如果應用程式已經過濾了』和+等特殊字元,我們仍然可以在輸入時過把字元轉換成URL編碼(即字元ASCII碼的16進位)來繞過檢查。
防禦SQL注入
- 對輸入進行過濾;
- 使用預編譯的SQL語句,比如Java中的PreparedStatement;
- 使用存儲過程(不是所有場景都使用,這個方法不是很推薦);
- MyBatis的SQL注入防護—模糊查詢
-- MySQL select * from table where name like concat('%',#{name},'%') -- Oracle select * from table where name like '%' || #{name} || '%' -- SQL Server select * from table where name like '%'+#{name}+'%' -- DB2 select * from table where name like concat('%',#{name},'%')
SQL注入相關的優秀部落格
- https://blog.csdn.net/wutianxu123/article/details/82718718
- https://blog.csdn.net/wutianxu123/article/details/82719212
XML注入
什麼是XML注入
XML的設計宗旨是傳輸數據,而非顯示數據。XML注入是一種古老的技術,通過利用閉合標籤改寫XML文件實現的。
下面舉個最簡單的例子
<?xml version="1.0" encoding="utf-8"?> <USER> <user Account="admin">用戶輸入</user> <user Account="root">root</user> </USER>
若攻擊者剛好能掌控用戶輸入欄位,輸入 admin
<?xml version="1.0" encoding="utf-8" ?> <USER> <user Account="admin">admin</user> <user Account="hacker">hacker</user> <user Account="root">root</user> </USER>
這樣我們可以通過XML注入添加一個管理員賬戶。
預防XML注入
- 對有改變XML結構的特殊輸入進行過濾或者編碼;
- 對["&","<",">","’".’"’,"/"]這些特殊字元過濾。
JSON注入
什麼是JSON注入
我們知道JSON是根據引號(")、冒號(:)、逗號(,)和花括弧({})區分各字元的意義的。如果有惡意用戶向JSON中注入惡意字元,那麼JSON將解析失敗。例如,輸入的PassWord值為:admin"888
那麼組裝成的JSON數據位如下:
"PassWord":" admin"888"
在PassWord中的引號將會破壞整個JSON的結構,導致JSON解析失敗。JSON注入沒有其他幾種注入的危害性大,但依然不可小視,筆者一直認為沒有低危的漏洞,只是還沒碰到可利用的場景,攻擊者可能通過這類低危漏洞輔助其他攻擊,這時低危漏洞將不再低危。
JSON注入的防禦
如何防禦JSON注射呢?方法依然很簡單,只需要對其關鍵字元進行轉義即可,如:將"admin"888"轉換為"admin"888",這樣JSON的值就可以解析了。如果字元串中出現"",同樣需要將其轉義""。
CRLF注入
我們知道:一個HTTP請求報文由四個部分組成:請求行、請求頭部、空行、請求數據。請求報文格式就如下圖所示:
參考部落格
我們可以發現請求行和請求頭的尾部都有CRLF標誌,請求頭和請求體之間也是通過CRLF標誌分割的。CRLF注入漏洞就是利用Http的這種報文結構,向請求行或請求頭的欄位注入惡意的CRLF,就能注入一些首部欄位或報文主體(請求響應數據),並在響應中輸出,所以CRLF又稱為HTTP響應拆分漏洞(HTTP Response Splitting)。
CRLF介紹
CRLF
指的是回車符(CR,ASCII 13,r,%0d) 和換行符(LF,ASCII 10,n,%0a)。CRLF的概念最早源自打字機,表明行的結束,電腦出現後沿用了這個概念。
回車符(r)的作用是將游標移到行首,換行符(n)的作用是將游標垂直移到下行。鍵盤上的回車鍵(Enter)就可以執行該操作。但是不同的作業系統,行的結束符是不一樣的。Windows系統使用CRLF表示行的結束,Linux/Unix系統使用LF表示行的結束,MacOS系統早期使用CR表示,但是現在好像也用LF表示行的結束。所以同一文件在不同作業系統中打開,內容格式可能會出現差異,這是行結束符不一致導致的。
在HTTP規範中,行使用CRLF來結束。首部與主體由兩個CRLF分隔,瀏覽器根據這兩個CRLF來獲取HTTP內容並顯示。
CRLF漏洞檢測
CRLF注入漏洞的本質和XSS有點相似,攻擊者將惡意數據發送給易受攻擊的Web應用程式,Web應用程式將惡意數據輸出在HTTP響應頭中(XSS一般輸出在主體中)。所以CRLF注入漏洞的檢測也和XSS漏洞的檢測差不多。通過修改HTTP參數或URL,注入惡意的CRLF,查看構造的惡意數據是否在響應頭中輸出。
總結下:
如果你找到了一個你傳給Web程式的參數最後會在響應的Http頭部回顯,那麼這個地方可能就是一個存在CRLF注入漏洞的地方。
CRLF漏洞預防
- 過濾參數中的rn之類的行結束符;
- 輸入參數盡量不要在相應頭部回顯,如果非要回顯的話一定要對該欄位的輸入值進行嚴格的過濾。