SQL注入攻擊
#!/usr/bin/env Python
# -*- coding: utf-8 -*-
from flask import Flask,request
import pyMySQL
App = Flask(__name__)
"""
SQL語句注入
在編寫SQL語句時,如果直接將用戶傳入的數(shù)據(jù)作為參數(shù)使用字符串拼接的方式插入到SQL查詢中,那么攻擊者可以通過注入其他語句來執(zhí)行攻擊操作,這些攻擊操作包括可以通過SQL語句做的任何事:獲取敏感數(shù)據(jù)、修改數(shù)據(jù)、刪除數(shù)據(jù)庫表……
"""
app.route('/')
def index():
"""
示例
假設(shè)我們的程序是一個學(xué)生信息查詢程序,其中的某個視圖函數(shù)接收用戶輸入的密碼,返回根據(jù)密碼查詢對應(yīng)的數(shù)據(jù)。我們的數(shù)據(jù)庫由一個db對象表示,SQL語句通過 execute()方法執(zhí)行
url=/?pwd='or 1=1-- ==變成==> sql = select * from students where pwd='' or 1=1--;'
這時會把 students表中的所有記錄全部査詢并返回,也就意味著所有的記錄都被攻擊者竊取了。更可怕的是,如果攻擊者將 pwd參數(shù)的值設(shè)為"';drop table users; --"那么查詢語句就會變成
sql = select * from students where pwd=''; drop table users; --;'
執(zhí)行這個語句會把 students表中的所有記錄全部刪除掉。
ps
; ==>用來結(jié)束一行語句
-- ==>用來注釋后面的語句
防范方法:
1、orm可以一定程度上避免sql注入問題
2、驗證輸入類型==》一個視圖函數(shù)直接收整型id查詢,可以在url規(guī)則中限制url變量為整型
3、參數(shù)化查詢,在構(gòu)建sql語句時避免使用拼接字符串或者字符串格式化方式來構(gòu)建sql,使用參數(shù)化查詢方法
例:sqlite3庫==》db.execute('select * from students where pwd=?',pwd)
4、轉(zhuǎn)義特殊字符,例如引號,分號,橫線 ==》 使用參數(shù)化查詢時,各種接口庫會為我們做轉(zhuǎn)義工作
"""
conn = pymysql.connect(**base_data_text)
cursor = conn.cursor()
pwd = request.args.get('pwd')
cur = cursor.execute("select * from students where pwd='%s';" % pwd)
ret = cur.fetchall()
return ret
# 集體sql注入相關(guān)文檔: https://www.owasp.org/index.php/SQL_Injection
xss攻擊
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask, request
"""
xss攻擊【跨站腳本】
XSS是注入攻擊的一種,攻擊者通過將代碼注入被攻擊者的網(wǎng)站中,用戶一且訪問網(wǎng)頁便會執(zhí)行被注入的惡意腳本。XSS攻擊主要分為反射型XSS攻擊( Reflected XSS Attack)和存儲型XSS攻擊( Stored XSSAttack)
"""
app = Flask(__name__)
@app.route('/he')
def index():
"""
示例
1、反射型XSS又稱為非持久型XSS
反射型XSS又稱為非持久型XSS(Non- Persistent XSS)。當(dāng)某個站點存在XSS漏洞時,這種攻擊會通過URL注入攻擊腳本,只有當(dāng)用戶訪問這個URL時才會執(zhí)行攻擊腳本
以下視圖接收用戶通過査詢字符串傳入的數(shù)據(jù),未做任何處理就把它直接插入到返回的響應(yīng)主體中,返回給客戶端。如果某個用戶輸入了一段 JAVAscript代碼作為查詢參數(shù)name的值
請求
http://127.0.0.1:5000/he?name=<script>alert('lalalal);</script>
響應(yīng)
<h1>hello <script>alert('lalalal);</script></h1>
前端展示
會談出一個窗口內(nèi)容為lalalal
產(chǎn)生的影響:
能支持js彈窗,那么就可用js代碼來做任何事情,例如發(fā)起請求,重定向,發(fā)布廣告【ps:html css也可以影響頁面正常的輸出,篡改頁面樣式,插入圖片等】
2、存儲型XSS也被稱為持久型XSS( persistent XSS)
存儲型XSS也被稱為持久型XSS( persistent XSS),這種類型的XSS攻擊更常見,危害也更大。它和反射型XSS類似,不過會把攻擊代碼儲存到數(shù)據(jù)庫中,任何用戶訪問包含攻擊代碼的頁面都會被殃及。
比如,某個網(wǎng)站通過表單接收用戶的留言,如果服務(wù)器接收數(shù)據(jù)后未經(jīng)處理就存儲到數(shù)據(jù)庫中,那么用戶可以在留言中插入任意JS代碼
提交
加入重定向代碼
<script>window.location.href="http://www.baidu.com";</script>
響應(yīng)
任意用戶訪問留言板,都會執(zhí)行js腳本
解決辦法
1》對html進(jìn)行轉(zhuǎn)義,確保用戶輸入的內(nèi)容僅做文本展示
2》驗證用戶輸入
"""
name = request.args.get('name')
return "<h1>hello {}</h1>".format(name)
if __name__ == '__main__':
app.run()
# xss攻擊相關(guān) https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)
csrf攻擊
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask, request,abort
"""
CSRF攻擊【跨轉(zhuǎn)請求偽造】
原理:
某用戶登錄了A網(wǎng)站,認(rèn)證信息保存在cookie中。當(dāng)用戶訪問攻擊者創(chuàng)建的B網(wǎng)站時,攻擊者通過在B網(wǎng)站發(fā)送個偽造的請求提交到A網(wǎng)站服務(wù)器上,
讓A網(wǎng)站服務(wù)器誤以為請求來自于自己的網(wǎng)站,于是執(zhí)行相應(yīng)的操作,該用戶的信息便遭到了篡改。總結(jié)起來就是,攻擊者利用用戶在瀏覽器中保存
的認(rèn)證信息,向?qū)?yīng)的站點發(fā)送偽造請求。
"""
app = Flask(__name__)
@app.route('/he/delete')
def delete_index():
"""
示例:
假設(shè)我們網(wǎng)站是一個社交網(wǎng)站(127.0.0.1),簡稱網(wǎng)站A:攻擊者的網(wǎng)站可以是任意類型的網(wǎng)站,簡稱網(wǎng)站B。在我們的網(wǎng)站中,刪除賬戶的操作通過GET請求執(zhí)行,由使用下面的 delete_index視圖處理
當(dāng)用戶登錄后,只要訪問127.0.0.1/he/delete就會刪除賬戶。那么在攻擊者的網(wǎng)站上,只需要創(chuàng)建一個顯示圖片的img標(biāo)簽,其中的sc屬性加入刪除賬戶的URL
<img src="http://127.0.0.1/he/delete">
當(dāng)用戶訪問B網(wǎng)站時,瀏覽器在解析網(wǎng)頁時會自動向img標(biāo)簽的src屬性中的地址發(fā)起請求。此時你在A網(wǎng)站的登錄信息保存在 cookie中,因此,僅僅是訪問B網(wǎng)站的頁面就會讓你的賬戶被刪除掉。
雖然很少有網(wǎng)站使用get請求來處理包含數(shù)據(jù)更改的敏感操作,但是即使使用post請求,也可以內(nèi)嵌隱藏表單使用js發(fā)起攻擊
防范措施
1》正確使用http方法
2》csrf令牌校驗
flask-seasurf:https://github.com/maxcountryman/flask-seasurf
flask-wtf:https://github.com/lepture/flask-wtf
"""
if not current_user.authenticated:
abort(401)
current_user.delete()
return 'Deleted'
if __name__ == '__main__':
app.run()
# csrf攻擊相關(guān) https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)
更多攻擊及相關(guān)連接
TOP25種攻擊方式
https://cwe.mitre.org/top25/
漏洞檢查工具webscarab
https://github.com/OWASP/OWASP-WebScarab
結(jié)語
如果大家對web安全以及安全方面有什么好的方法或者看法,歡迎留言討論!
