CSRF, XSS, Sql注入原理和處理方案

Aaron_alive發表於2018-12-02

CSRF

  • 含義

CSRF(Cross-site request forgery)跨站請求偽造,也被稱為“One Click Attack”或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。儘管聽起來像跨站指令碼(XSS),但它與XSS非常不同,XSS利用站點內的信任使用者,而CSRF則通過偽裝來自受信任使用者的請求來利用受信任的網站。與XSS攻擊相比,CSRF攻擊往往不大流行(因此對其進行防範的資源也相當稀少)和難以防範,所以被認為比XSS更具危險性。

  • 場景模擬
  1. a欠b 1000元錢, 在銀行轉賬給b,  a的瀏覽器執行的操作是: http://www.bank.com/transfer.php?from=a&money=1000&to=b
  2. 這個時候,c想要攻擊a,他執行了下面的程式碼http://www.bank.com/transfer.php?from=Alice&money=9999&to=Cathy 當然,結果是失敗的,瀏覽器會記住a的session_id,而c通過瀏覽器的cookie帶過去的session_id當然不是a的,所以失敗。
  3. c又想了一個方法, 寫了一個網頁, 訪問方法是:www.c.com/choujiang.p…, 用抽獎來吸引a, choujiang.php的程式碼是:
<html>
<body>
<form method="get" action="http://www.bank.com/transfer.php">
    <input type="hidden" name="from" value="a">
    <input type="hidden" name="money" value="1000">
    <input type="hidden" name="to" value="c">
    <input type="button" onclick="submit()" value="活動抽獎">
</form>
</body>
</html>
複製程式碼
  1. 只要a點選了http://www.c.com/choujiang.php, 就會在自己的瀏覽器頁面顯示一個抽獎按鈕。  如果a剛給b轉賬完畢, 又點選了這個抽獎按鈕, 就相當於a的瀏覽器發起瞭如下請求: http://www.bank.com/transfer.php?from=a&money=1000&to=c 這時, 銀行後臺伺服器從http的cookie中識別出確實是a在轉賬給c, 是合理操作。但是,a並不知情

XSS(可以分為反射型xss攻擊存貯型xss攻擊

  • 含義

XSS攻擊全稱跨站指令碼攻擊,是為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站指令碼攻擊縮寫為XSS,XSS是一種在web應用中的電腦保安漏洞,它允許惡意web使用者將程式碼植入到提供給其它使用者使用的頁面中。

  • 場景模擬
  1. 反射型xss攻擊 正常傳送訊息: http://www.test.com/message.php?send=Hello 接收者將會接收資訊並顯示Hello 非正常傳送訊息: http://www.test.com/message.php?send=<script>alert(‘foolish!’)</script> 這時接收者的視窗就會彈出foolish彈窗。 以上,只是簡單的示例,實際上,xss攻擊可以做得更加複雜,竊取使用者賬號密碼也是正常的

  2. 存貯型xss攻擊 在輸入框裡填寫you are foolish! 那麼表單裡要傳送的的input框就會變成這樣 <input type=“text” name=“content” value="you are foolish!"> 不做任何過濾的話,這個會當成正常資料入庫 當要用到這個資料,從庫取出來的時候,就會出現you are foolish的彈窗。

SQL隱碼攻擊

  • 含義

所謂SQL隱碼攻擊,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令。具體來說,它是利用現有應用程式,將(惡意的)SQL命令注入到後臺資料庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的資料庫,而不是按照設計者意圖去執行SQL語句。比如先前的很多影視網站洩露VIP會員密碼大多就是通過WEB表單遞交查詢字元暴出的,這類表單特別容易受到SQL隱碼攻擊式攻擊.

  • 場景模擬
  1. 和存貯型xss攻擊的例子本質上是一樣的
  2. 假如現在php的登入程式碼是這樣的 $sql = "select * from user where username = 'a' and pwd = md5(123456) 然後在前端密碼的輸入框裡填寫' or 1 = 1#,那麼sql語句就會變成$sql = "select * from user where username = '' or 1 = 1#' and pwd = md5(123456) #在sql的意思是註釋,後面的sql不會再執行 所以,$sql = "select * from user where username = '' or 1 = 1 登入成功。

相關文章