目錄php
所謂SQL注入,是將惡意SQL命令經過某種方式提交到服務器後臺,並欺騙服務器執行這些惡意的SQL命令的一種攻擊方式。 —— [ 百度百科 ]
形成SQL注入漏洞緣由有兩個:一個是沒有對輸入的數據進行過濾(過濾輸入),還有一個是沒有對發送到數據庫的數據進行轉義(轉義輸出)。html
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進制)來繞過檢查。
-- 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},'%')
XML的設計宗旨是傳輸數據,而非顯示數據。XML注入是一種古老的技術,經過利用閉合標籤改寫XML文件實現的。sql
下面舉個最簡單的例子數據庫
<?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注入添加一個管理員帳戶。瀏覽器
咱們知道JSON是根據引號(")、冒號(:)、逗號(,)和花括號({})區分各字符的意義的。若是有惡意用戶向JSON中注入惡意字符,那麼JSON將解析失敗。例如,輸入的PassWord值爲:admin"888
那麼組裝成的JSON數據位以下:服務器
"PassWord":" admin"888"
在PassWord中的引號將會破壞整個JSON的結構,致使JSON解析失敗。JSON注入沒有其餘幾種注入的危害性大,但依然不可小視,筆者一直認爲沒有低危的漏洞,只是還沒碰到可利用的場景,攻擊者可能經過這類低危漏洞輔助其餘攻擊,這時低危漏洞將再也不低危。jsp
如何防護JSON注射呢?方法依然很簡單,只須要對其關鍵字符進行轉義便可,如:將"admin"888"轉換爲"admin"888",這樣JSON的值就能夠解析了。若是字符串中出現"",一樣須要將其轉義"\"。編碼
咱們知道:一個HTTP請求報文由四個部分組成:請求行、請求頭部、空行、請求數據。請求報文格式就以下圖所示:操作系統
參考博客
咱們能夠發現請求行和請求頭的尾部都有CRLF標誌,請求頭和請求體之間也是經過CRLF標誌分割的。CRLF注入漏洞就是利用Http的這種報文結構,向請求行或請求頭的字段注入惡意的CRLF,就能注入一些首部字段或報文主體(請求響應數據),並在響應中輸出,因此CRLF又稱爲HTTP響應拆分漏洞(HTTP Response Splitting)。
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注入漏洞的本質和XSS有點類似,攻擊者將惡意數據發送給易受攻擊的Web應用程序,Web應用程序將惡意數據輸出在HTTP響應頭中(XSS通常輸出在主體中)。因此CRLF注入漏洞的檢測也和XSS漏洞的檢測差很少。經過修改HTTP參數或URL,注入惡意的CRLF,查看構造的惡意數據是否在響應頭中輸出。
總結下:
若是你找到了一個你傳給Web程序的參數最後會在響應的Http頭部回顯,那麼這個地方可能就是一個存在CRLF注入漏洞的地方。