Skip to content

0328notes #24

@shiaoyi

Description

@shiaoyi

0328

Web Security

  • 頁面上可以被人執行任意javascript

XSS(Cross-Site Scripting) 跨站式腳本漏洞

例如:在留言裡寫<h1>title</h1>,發布時就會出現放大的title
那如果今天放的是<script>window.location="http://google.com"</script>留言發布後,每個進來的人都會被送到google網頁
後果:可以偷cookie、偷資料、可以把你導到釣魚網站、被竄改頁面
解法:echo htmlspecialchars($str, ENT_QUOTES, 'utf-8')
ENT_QUOTES就是把該跳脫的字元跳脫掉
輸出時再跳脫就好,存在資料庫要按照原始的樣子

  • 可以被人執行SQL指令

SQL Injection

攻擊者能夠注入(inject)一些東西,執行他想要的結果(登入、刪除table、撈出使用者資料...)
SQL指令中帳密的地方原為:

$sql = "Select * From users Where username='$username' and password='$password'";

若在帳號的地方輸入' or 1=1 -- 則任何人皆可登入,因為SQL會變成:

$sql = "Select * From users Where username='' or 1=1 --' and password='$password'";

--是SQL的註解所以不會讀取,前面1=1為true,所以一定可以執行,電腦會用第一筆id來讓你登入
解決方法:prepare statement

原始

$sql = "Select * From users Where username='$username' and password='$password'";
$result = $conn->query($sql);

更改後

$stmt = $conn->prepare("Select * From users Where username=? and password=?");
$stmt->bind_param("ss", $username, $password); // s代表string,這裡有兩個變數,所以是ss
$stmt->execute();
$result = $stmt->get_result();
  • 可以偽造其他人身份登入

通常我們把member_id存在cookie,當作登入的證明
但因為cookie是存在client端的,所以是可以改的!
只要把member_id改成別人,就能以那個人的身份登入

解法:session機制
有人登入後,就拿一張通行證給他,也就是所謂的session id,以後就靠這個通行證知道他是誰,在cookie裡就只存這個通行證id,其他資訊都會在server端存起來,所以必須要有一個database可以用。

這樣不是跟資料庫id一樣嗎,不能拿資料庫裡的id當session id嗎?
資料庫id只是數字,可以自己亂改,輕易得知別人的資訊,但session id是一連串隨機亂碼,駭客不容易查到別人的session id

生成session id的方法
利用https://www.php.net/manual/en/function.uniqid.php 產生

資料庫:開一個database table(users_certificate),裡面有兩欄->id和username(session_id、帳號),註冊之後會生成一個session id,把session id和帳號一起存在database裡面
程式:檢查cookie裡有沒有session id,有的話,根據session id撈資料出來之後,看是否符合這個人,以驗證有這個人的存在

1.會員輸入帳號密碼,按下登入
2.若錯誤,返回錯誤訊息
3.若正確,亂數產生一個通行證id,並且在資料庫裡面記下通行證ID與會員ID的對應關係
4.把通行證ID設置到cookie
5.下次再發Request來,browser就會把通行證ID一起帶上來
6.檢查通行證ID是否有對應到的ID,有的話就代表是那個人,可以把那個人的資料撈出來,驗證是否存在

實作過程:

  1. 在註冊的地方創建一個session id,在user創建帳號後讀取其user_id,把user_id和session_id放進users_certificate裡
  2. 當user登入時,若帳密正確,會針對user資料(user_id)找出此帳號的session_id,並存進cookie中
  3. 跳至主面前,也要檢查此session_id是否真有放進cookie,若有,則檢查是否真有此session_id,若有則登入成功!

問題:如果有人的session_id被偷走,則還是可以偽造身份
那怎麼偷呢?
利用XSS在留言裡打

<script>
sendRequest(document.cookie)
</script>

user一進來這個網頁,cookie就被偷走,駭客就可以仿造你的身份進來網頁

  • 密碼的安全性問題

假如有一天你的網站被攻擊,資料庫被偷走,使用者的密碼就外洩了
解法:資料庫不會直接儲存使用者的密碼,而是會用雜湊後的結果

Hash function
種類:MD5(危險)、SHA-1、SHA-256、bcrypt
用途:1.檢查檔案完整性 2.儲存密碼
操作:https://www.php.net/manual/en/function.password-hash.php

實作過程

  1. 先hash註冊的密碼並放進資料庫中->使用password_hash()
  2. 在登入的地方驗證使用者輸入且hash後的值來比對是否符合資料庫存的值->使用password_verify()
  • CSRF

假設今天有個銀行的轉帳頁面,網址是http://bank.com?to=123&money=10
今天駭客改成自己的帳號,錢改多一點,並且把這網址散佈出去
那所有點擊這個網址的人都會轉帳過去
解法:CSRF token

cookie vs session

cookie:瀏覽器可以存東西的地方
session:在server方的通行證機制

其他資安問題 https://blog.techbridge.cc/2017/05/07/owasp/

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions