歡迎來到theFlyer的博客—希望你有不一樣的感悟
前言:第一次使用markdown
,文章裏面可能有各種嘗試,看官見諒。web安全基礎需要各位看官有一定html/js/php等基礎知識(我也是萌新),知識多而雜,需要多看多動手。
目錄
XSS
全稱:Cross Site Script
中文名稱:跨站腳本
危害:盜取用戶信息、釣魚、製造蠕蟲等
概念:黑客通過“HTML注入”篡改網頁,插入了惡意腳本,當用戶在瀏覽網頁時,實現控制用戶瀏覽器行爲的一種攻擊方式。
xss三種類型
XSS類型 存儲型 反射型 DOM型
觸發過程 1.黑客構造XSS腳本 正常用戶訪問攜帶 正常用戶訪問攜帶
2.正常用戶訪問攜帶 XSS腳本的URL(參數) XSS腳本的URL(哈希)
XSS腳本的頁面
數據存儲 數據庫 URL URL
誰來輸出 後端WEB應用程序 後端WEB應用程序 前端JavaScipt
輸出位置 HTTP響應中 HTTP響應中 動態構造的DOM節點
DOM型: 用戶訪問應用 瀏覽器通過js解析URL內容輸出到DOM中 觸發XSS
個人理解(歡迎指正):主要利用閉合標籤,閉合正常標籤,並加入惡意代碼
或添加構造惡意代碼。
"></a><script>alert("xss")</script>來先閉合掉a標籤。然後再用script來運行js代碼
onclick="alert(1)";>123</a>//點擊123觸發onclick來運行js,然後把後面的內容來註釋掉
前人已經對XSS有了比較深入的總結
鏈接:XSS的原理分析與解剖 XSS的原理分析與解剖二
防禦xss
原則1:不要在頁面中插入任何不可信數據,除非這些數已經據根據下面幾個原則進行了編碼
原則2:在將不可信數據插入到HTML標籤之間時,對這些數據進行HTML Entity編碼
原則3:在將不可信數據插入到HTML屬性裏時,對這些數據進行HTML屬性編碼
想知道如何防必然對攻要有深刻理解,有時間拜讀此文防禦XSS的七條原則
CSFR
全稱:Cross-site request forgery
中文名稱:跨站請求僞造
危害:執行惡意操作(被轉賬,被髮垃圾評論等)、製造蠕蟲...
概念:利用用戶已登錄的身份,在用戶毫不知情的情況下,以用戶的名義完成非法操作
CSRF攻擊攻擊原理及過程如下:
1.用戶C打開瀏覽器,訪問受信任網站A,輸入用戶名和密碼請求登錄網站A;
2.在用戶信息通過驗證後,網站A產生Cookie信息並返回給瀏覽器,此時用戶登錄網站A成功,可以正常發送請求到網站A;
3.用戶未退出網站A之前,在同一瀏覽器中,打開一個TAB頁訪問網站B;
4.網站B接收到用戶請求後,返回一些攻擊性代碼,併發出一個請求要求訪問第三方站點A;
5.瀏覽器在接收到這些攻擊性代碼後,根據網站B的請求,在用戶不知情的情況下攜帶Cookie信息,向網站A發出請求。網站A並不知道該請求其實是由B發起的,所以會根據用戶C的Cookie信息以C的權限處理該請求,導致來自網站B的惡意代碼被執行。
從上圖可以看出,要完成一次CSRF攻擊,受害者必須依次完成兩個步驟:
1.登錄受信任網站A,並在本地生成Cookie。
2.在不登出A的情況下,訪問危險網站B。
看到這裏,你也許會說:“如果我不滿足以上兩個條件中的一個,我就不會受到CSRF的攻擊”。是的,確實如此,但你不能保證以下情況不會發生:
1.你不能保證你登錄了一個網站後,不再打開一個tab頁面並訪問另外的網站。
2.你不能保證你關閉瀏覽器了後,你本地的Cookie立刻過期,你上次的會話已經結束。(事實上,關閉瀏覽器不能結束一個會話,但大多數人都會錯誤的認爲關閉瀏覽器就等於退出登錄/結束會話了)
3.打開的第三方網站,可能是一個存在其他漏洞的可信任的經常被人訪問的網站。
CSRF 攻擊的應對之道
1.驗證 HTTP Referer 字段
2.在請求地址中添加 token 並驗證
3.在 HTTP 頭中自定義屬性並驗證
文章鏈接如下CSRF 攻擊的應對之道
4.服務端的CSRF方式方法很多樣,但總的思想都是一致的,就是在客戶端頁面增加僞隨機數
淺談CSRF攻擊方式
點擊劫持
全稱:Click Jacking
中文名稱:點擊劫持
危害:點擊覆蓋不可見的框架,造成各種精心設計的風險如何刪除、點贊、下載、轉賬等
概念:它是通過覆蓋不可見的框架誤導受害者點擊。雖然受害者點擊的是他所看到的網頁
,<iframe>標籤的透明屬性。
點擊劫持其實是一種視覺上的欺騙手段,攻擊者將一個透明的、不可見的iframe覆蓋在一個網頁上,通過調整iframe頁面位置,誘使用戶在頁面上進行操作,在不知情的情況下用戶的點擊恰好是點擊在iframe頁面的一些功能按鈕上。例:
Flash點擊劫持
點擊劫持與CSRF攻擊有異曲同工之妙,他們都是在用戶不知情的情況下誘使用戶完成一些動作。CSRF在攻擊過程中如果出現與用戶交互的頁面,則攻擊有可能無法完成。而點擊劫持恰恰是利用與用戶交互而完成的攻擊,因此在Flash中這類點擊劫持現象更爲嚴重。攻擊者利用簡單的Flash小遊戲誘使用戶點擊,經過一系列點擊後達到控制用戶電腦的目的。
URL跳轉
尤其當網址變成短鏈接,就更具有迷惑性了
定義:藉助未驗證的URL跳轉,將應用程序引導到不安全的第三方區域從而導致安全問題。
跳轉實現
1.Header頭跳轉
$url = $_REQUEST["url"]; 獲取用戶請求鏈接
header("Location: $url"); 跳轉到鏈接地址
2.Javascript跳轉
var site = getQueryString("site"); js腳本獲取用戶請求鏈接
window.location.href=site; 跳轉到鏈接地址
3.META標籤跳轉
$url = $_REQUEST["url"]; 獲取用戶請求鏈接
<meta http-equiv="Refresh" content="5; url=<?php echo $url?>" /> 5秒後跳轉到鏈接地址
推薦文章鏈接URL重定向/跳轉漏洞解釋說明及修復方案、前端一波騷操作
SQL注入
SQL Injection 服務端漏洞
是一種常見的Web安全漏洞,攻擊者利用這個漏洞,可以訪問或修改數據,
或者利用潛在的數據庫漏洞進行攻擊。
正常登錄的流程
POST請求登錄,把用戶名和密碼交給服務器,服務器通過PHP代碼實現獲取到瀏覽器POST的用戶名和密碼,會經過一次MD5處理,服務器會把用戶名和密碼經過MD5處理後的密碼拼接到要執行的SQL語句中。
1.POST請求登錄,
2.獲取請求參數,
3.參數帶入代碼,
4.執行查詢,
5.驗證查詢結果,
6.根據返回結果判斷是否登錄成功
$username = $_POST['username'];
$password = MD5($_POST['password']);
SQL注入過程
1.獲取用戶參數
2.拼接到代碼當中
3.SQL語句按照我們構造參數的語義執行成功
admin' -- 註釋-- (雙橫槓空格)代表註釋符 ‘爲了閉合前面單引號
查詢數據庫中是否有admin用戶,用戶存在時返回結果根本沒有驗證密碼
$check_query = mysql_query("select id from teacher where name='admin' -- and passwd='$password' limit 1");
利用腳本
username = admin' and 1=2 union select version()
username = admin' and 1=2 union select user()
SQL必備條件
1.可以控制輸入的數據
2.服務器要執行的代碼拼接了控制的數據
SQL注入的本質
數據和代碼未分離即數據當作了代碼來執行
SQL注入的危害
1.獲取數據庫信息
2.管理員後臺用戶名和密碼
3.獲取其他數據庫敏感信息:用戶名、密碼、手機號碼、身份證、銀行卡信息......
4.獲取服務器權限
5.植入Webshell,獲取服務器後門
6.讀取服務器敏感文件
7.萬能密碼
推薦文章鏈接認識SQL注入的類型、手工注入語句大全
命令注入
應用有時需要調用一些執行系統命令的函數,如PHP中的system、exec、shell_exec、
passthru、popen、proc_popen等,當用戶能控制這些函數中的參數時,就可以將惡意系統命令
拼接到正常命令中,從而造成命令執行攻擊,這就是命令執行漏洞。
攻擊過程
黑客-> 構造命令-> web應用程序-> 拼接命令並執行注入命令-> 並把結果返回到頁面
WEB應用如何命令注入
命令注入條件:
1.調用可執行系統命令的函數
2.函數或函數的參數可控
3.拼接注入命令
舉例
1.下面代碼無法執行其他命令,不滿足上面命令注入的第二個條件,函數或其參數可控
<?php
if (isset($_GET['type'])) {
$type = $_GET['type']; ---從參數中獲取type值
} else {
$type = 1;
}
switch($type){
case 1:
exec('ipconfig', $output, $status); ---type爲1執行ipconfig命令
break;
case 2:
exec('net user', $output, $status); ---爲2執行net user命令
break;
case 3:
exec('dir', $output, $status); ---爲33執行dir命令
break;
}
foreach($output as $value){ ---輸出命令執行結果
// 編碼轉換
echo(mb_convert_encoding($value, "UTF-8", "GB2312"));
echo("<br />");
}
?>
2.參數可控,可以拼接
<?php
if (isset($_GET['url'])) {
$url = $_GET['url']; ---從參數中獲取url
} else {
$url = "http://www.theFlyer.com";
}
//調用curl命令,獲取url的響應頭。請求url的網址並返回它的url響應頭
$cmd = 'curl -I "'. $url . '"';
//***拼接curl命令 (curl參數可控,這有個分隔符 "",是爲了將url包住同時也起到了分隔curl命令
//和數據的作用)可以通過追加 "閉合前面的curl命令,後面用&追加我們想要的命令。
//注意dir"./ 後面不能在加"因爲php在拼接時會補上這個雙引號
//http://www.theFlyer.com" & dir"./
//最後拼接代碼如下 curl -I "http://www.theFlyer.com" & dir"./"
// 執行系統命令
exec($cmd, $output, $status); ---執行curl命令
echo "<b>". htmlspecialchars($url) . "</b>"
. " 的響應頭如下:<br /><br />";
// 輸出命令執行結果
foreach($output as $value){ ---輸出命令結果
echo htmlspecialchars($value);
echo "<br/>";
}
?>
推薦文章鏈接 命令執行
文件操作漏洞
常見文件操作漏洞:
1.文件上傳漏洞
2.任意文件下載
3.文件包含漏洞
利用文件操作漏洞:
1.文件上傳
1.1上傳Webshell
1.2上傳木馬
...
2.文件下載
2.1下載系統任意文件
2.2下載程序代碼
...
文件操作漏洞原因:
文件處理不當
1.可以上傳可執行腳本
2.腳本擁有執行權限
推薦文章鏈接 文件上傳漏洞及解析、任意文件查看與下載漏洞
後記
紙上得來終覺淺,實踐出真知,我也需要多動手,望君亦如此。第一篇算是偏技術文貼,要發了,
但沒剛寫那麼激動,我會繼續寫的。