【網絡安全】SQL注入、XML注入、JSON注入和CRLF注入科普文

SQL注入

所謂SQL注入,是將惡意SQL命令經過某種方式提交到服務器後臺,並欺騙服務器執行這些惡意的SQL命令的一種攻擊方式。 —— [ 百度百科 ]
形成SQL注入漏洞緣由有兩個:一個是沒有對輸入的數據進行過濾(過濾輸入),還有一個是沒有對發送到數據庫的數據進行轉義(轉義輸出)。html

一些尋找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注入相關的優秀博客

XML注入

什麼是XML注入

XML的設計宗旨是傳輸數據,而非顯示數據。XML注入是一種古老的技術,經過利用閉合標籤改寫XML文件實現的。sql

下面舉個最簡單的例子數據庫

<?xml version="1.0" encoding="utf-8"?>
<USER>
  <user Account="admin">用戶輸入</user>
  <user Account="root">root</user>
</USER>

若攻擊者恰好能掌控用戶輸入字段,輸入 admin hacker ,最終修改結果爲: json

<?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注入沒有其餘幾種注入的危害性大,但依然不可小視,筆者一直認爲沒有低危的漏洞,只是還沒碰到可利用的場景,攻擊者可能經過這類低危漏洞輔助其餘攻擊,這時低危漏洞將再也不低危。jsp

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漏洞預防

  • 過濾參數中的\r\n之類的行結束符;
  • 輸入參數儘可能不要在相應頭部回顯,若是非要回顯的話必定要對該字段的輸入值進行嚴格的過濾。
相關文章
相關標籤/搜索