什麼是SQL 注入?

2021-02-14 菜鳥名企夢


何謂SQL注入?SQL注入是一種非常常見的資料庫攻擊手段,SQL注入漏洞也是網絡世界中最普遍的漏洞之一。大家也許都聽過某某學長通過攻擊學校資料庫修改自己成績的事情,這些學長們一般用的就是SQL注入方法。SQL注入其實就是惡意用戶通過在表單中填寫包含SQL關鍵字的數據來使資料庫執行非常規代碼的過程。簡單來說,就是數據「越俎代庖」做了代碼才能幹的事情。這個問題的來源是,SQL資料庫的操作是通過SQL語句來執行的,而無論是執行代碼還是數據項都必須寫在SQL語句之中,這就導致如果我們在數據項中加入了某些SQL語句關鍵字(比如說SELECT、DROP等等),這些關鍵字就很可能在資料庫寫入或讀取數據時得到執行。多言無益,我們拿真實的案例來說話。下面我們先使用SQLite建立一個學生檔案表。SQL資料庫操作示例

import sqlite3

# 連接資料庫
conn = sqlite3.connect('test.db')

# 建立新的數據表
conn.executescript('''DROP TABLE IF EXISTS students;
       CREATE TABLE students
       (id INTEGER PRIMARY KEY AUTOINCREMENT,
       name TEXT NOT NULL);''')

# 插入學生信息
students = ['Paul','Tom','Tracy','Lily']

for name in students:
    query = "INSERT INTO students (name) VALUES ('%s')" % (name)
    conn.executescript(query);

# 檢視已有的學生信息
cursor = conn.execute("SELECT id, name from students")
print('IDName')
for row in cursor:
    print('{0}{1}'.format(row[0], row[1]))

conn.close()

點擊運行按鈕將會列印目前表中的內容。上述程序中我們建立了一個test.db資料庫以及一個students數據表,並向表中寫入了四條學生信息。那麼SQL注入又是怎麼一回事呢?我們嘗試再插入一條惡意數據,數據內容就是漫畫中的"Robert');DROP TABLE students;--",看看會發生什麼情況。SQL資料庫注入示例

conn = sqlite3.connect('test.db')

# 插入包含注入代碼的信息
name = "Robert');DROP TABLE students;--"
query = "INSERT INTO students (name) VALUES ('%s')" % (name)

conn.executescript(query)

# 檢視已有的學生信息
cursor = conn.execute("SELECT id, name from students")
print('IDName')
for row in cursor:
    print('{0}{1}'.format(row[0], row[1]))

conn.close()

你將會發現,運行後,程序沒有輸出任何數據內容,而是返回一條錯誤信息:表單students無法找到!這是為什麼呢?問題就在於我們所插入的數據項中包含SQL關鍵字DROP TABLE,這兩個關鍵字的意義是從資料庫中清除一個表單。而關鍵字之前的Robert');使得SQL執行器認為上一命令已經結束,從而使得危險指令DROP TABLE得到執行。也就是說,這段包含DROP TABLE關鍵字的數據項使得原有的簡單的插入姓名信息的SQL語句

"INSERT INTO students (name) VALUES ('Robert')"

"INSERT INTO students (name) VALUES ('Robert');DROP TABLE students;--"

而SQL資料庫執行上述操作後,students表單被清除,因而表單無法找到,所有數據項丟失。如何防止SQL注入問題大家也許都想到了,注入問題都是因為執行了數據項中的SQL關鍵字,那麼,只要檢查數據項中是否存在SQL關鍵字不就可以了麼?的確是這樣,很多資料庫管理系統都是採取了這種看似『方便快捷』的過濾手法,但是這並不是一種根本上的解決辦法,如果有個美國人真的就叫做『Drop Table』呢?你總不能逼人家改名字吧。合理的防護辦法有很多。首先,儘量避免使用常見的資料庫名和資料庫結構。在上面的案例中,如果表單名字並不是students,則注入代碼將會在執行過程中報錯,也就不會發生數據丟失的情況——SQL注入並不像大家想像得那麼簡單,它需要攻擊者本身對於資料庫的結構有足夠的了解才能成功,因而在構建資料庫時儘量使用較為複雜的結構和命名方式將會極大地減少被成功攻擊的概率。使用正則表達式等字符串過濾手段限制數據項的格式、字符數目等也是一種很好的防護措施。理論上,只要避免數據項中存在引號、分號等特殊字符就能很大程度上避免SQL注入的發生。另外,就是使用各類程序文檔所推薦的資料庫操作方式來執行數據項的查詢與寫入操作,比如在上述的案例中,如果我們稍加修改,首先使用execute()方法來保證每次執行僅能執行一條語句,然後將數據項以參數的方式與SQL執行語句分離開來,就可以完全避免SQL注入的問題,如下所示:SQL資料庫反注入示例

conn = sqlite3.connect('test.db')

# 以安全方式插入包含注入代碼的信息
name = "Robert');DROP TABLE students;--"
query = "INSERT INTO students (name) VALUES (?)"

conn.execute(query, [name])

# 檢視已有的學生信息
cursor = conn.execute("SELECT id, name from students")
print('IDName')
for row in cursor:
    print('{0}{1}'.format(row[0], row[1]))

conn.close()

而對於PHP而言,則可以通過mysql_real_escape_string等方法對SQL關鍵字進行轉義,必要時審查數據項目是否安全來防治SQL注入。當然,做好資料庫的備份,同時對敏感內容進行加密永遠是最重要的。某些安全性問題可能永遠不會有完美的解決方案,只有我們做好最基本的防護措施,才能在發生問題的時候亡羊補牢,保證最小程度的損失。

來源:jizhi.im/blog/post/sql_injection_intro

猜你還想看

絕了!搜狗輸入法這騷操作!

長按,掃碼,關注

及時收看更多精彩內容

點擊」閱讀原文「:領取5T精品資料面試總結100+實戰項目

我知道你 「在看

相關焦點

  • SQL注入、XSS以及CSRF分別是什麼?
    什麼是SQL注入、XSS和CSRF?本篇文章就來帶大家了解一下SQL注入、XSS和CSRF,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。SQL注入SQL注入是屬於注入式攻擊,這種攻擊是因為在項目中沒有將代碼與數據(比如用戶敏感數據)隔離,在讀取數據的時候,錯誤的將數據作為代碼的一部分執行而導致的。典型的例子就是當對SQL語句進行字符串拼接的時候,直接使用未轉義的用戶輸入內容作為變量。
  • SQL注入攻擊詳解
    參考:https://blog.csdn.net/yue510/article/details/924317481、什麼是Sql注入攻擊SQL注入攻擊通過構建特殊的輸入作為參數傳入
  • Myql SLEEP函數和SQL注入
    那麼該操作有什麼用?為什麼要用它呢?通常,有一些操作需要一段時間來操作,操作時候需要暫時操作或者更新(比如數據鎖,比如記錄一個Pos點後,備份一個從庫),當然也有可能是黑客攻擊。sqlmap是使用Python編寫的一款資料庫sql注入掃描工具,目前支持常見的mysql、oracel、postgresql、sql server,access,db2,sqlite等數據的安全漏洞(sql注入)。
  • Java web安全黑客攻防之sql注入
    1.什麼是sql注入sql注入通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙伺服器執行惡意的SQL命令通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙伺服器執行惡意的SQL
  • SQL 注入攻防入門詳解
    這幾天把sql注入的相關知識整理了下,希望大家多多提意見。(對於sql注入的攻防,我只用過簡單拼接字符串的注入及參數化查詢,可以說沒什麼好經驗,為避免後知後覺的犯下大錯,專門查看大量前輩們的心得,這方面的資料頗多,將其精簡出自己覺得重要的,就成了該文)下面的程序方案是採用 ASP.NET + MSSQL,其他技術在設置上會有少許不同。
  • 特殊場景的sql注入思路
    上一篇介紹了sql注入的基礎知識以及手動注入方法,但是在實際的環境中往往不會像靶場中那樣簡單。今天我就來為大家介紹一種特殊場景的sql注入思路。用戶名與密碼分開驗證的情況第一個場景我們以We Chall平臺的Training: MySQL II 一題為例。
  • 徹底幹掉噁心的 SQL 注入漏洞, 一網打盡!
    這裡需要注意的是,使用了PreparedStatement 並不意味著不會產生注入,如果在使用PreparedStatement之前,存在拆分sql語句,那麼仍然會導致注入,如// 拼接 sqlString sql = "SELECT *
  • SQL注入常規Fuzz全記錄
    前言本篇文章是在做ctf bugku的一道sql 盲注的題(題目地址:注入題目)中運用了fuzz的思路,完整記錄整個fuzz的過程
  • SQL注入的幾種類型和原理
    報錯注入原理接下來的文字會省略一些,因為找到對應的回顯之後,整個過程類似。無論是那種類型的注入,本質上是SQL語句被執行之後尋找對應的回顯。對於報錯,回顯在錯誤中,後面的的時間注入,回顯在時間的判斷中,DNSlog盲注中,回顯在DNSlog中。報錯注入如何發生的?構造payload讓信息通過錯誤提示回顯出來什麼場景下有用?
  • web安全之SQL注入(16)——delete和like注入
    delete from users where id=14 一般情況是網站後臺的sql語句,當我們測試刪除功能是否存在注入時,一定你要是用and測試,不要使用or測試。當使用or進行測試,跟一個布爾假值,這時如果前面的條件為真,你使用or跟一個假值,只會刪除一條數據,這裡問題不大,繼續測試
  • SQL 注入常規 Fuzz 全記錄
    (給數據分析與開發加星標,提升數據技能)來自:FreeBuf.COM,作者:Conanwww.freebuf.com/articles/web/190019.html前言本文是在做ctf bugku的一道sql
  • 淺談開啟magic_quote_gpc後的sql注入攻擊與防範
    SQL語句:$sql="select * from users where username=$name and password='$pwd'";注意:變量$name沒加引號此時,在地址欄中輸入username=admin%23,則合成後的sql語句為:select * from users where username='admin\' #' and password='
  • SQL Server應用程式的高級Sql注入
    [概 要] 這篇文章討論常用的"sql注入"技術的細節,應用於流行的Ms IIS/ASP/SQL-Server平臺。這裡探討有關這種攻擊各種可以注入程序訪問數據和資料庫防範的方法。如果攻擊者可以插一系列的SQL語句進入應用程式的數據查詢時,Sql注入攻擊就可能發生。 一個典型的SQL語句是這樣的: select id, forename, surname from authors 這個查詢語句將會從'authors'表中返回'id','forename'和'surname'列的所有行。
  • desc巧用及反引號 ` SQL注入——【61dctf】 inject writeup
    $_GET['table']:"test";$table = Filter($table);mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();$sql = "select 'flag{xxx}' from secret_{$table}";$ret = sql_query($sql);echo $ret[0];?
  • 何謂SQL 注入,這個漫畫告訴你
    轉自:https://jizhi.im/blog/post/sql_injection_intro先來看一副很有意思的漫畫:今天我們來聊一聊SQL注入相關的內容。何謂SQL注入?SQL注入是一種非常常見的資料庫攻擊手段,SQL注入漏洞也是網絡世界中最普遍的漏洞之一。大家也許都聽過某某學長通過攻擊學校資料庫修改自己成績的事情,這些學長們一般用的就是SQL注入方法。SQL注入其實就是惡意用戶通過在表單中填寫包含SQL關鍵字的數據來使資料庫執行非常規代碼的過程。
  • 最詳細的SQL注入相關的命令整理
    /display.asp,行177、 列出當前所有的資料庫名稱:select * from master.dbo.sysdatabases 列出所有列的記錄select name from master.dbo.sysdatabases 僅列出name列的記錄8、 不需xp_cmdshell支持在有注入漏洞的SQL伺服器上運行CMD命令:create
  • SQL注入是什麼?如何防止?
    SQL注入是一種注入攻擊,可以執行惡意SQL語句。下面本篇文章就來帶大家了解一下SQL注入,簡單介紹一下防止SQL注入攻擊的方法,希望對大家有所幫助。什麼是SQL注入?SQL注入(SQLi)是一種注入攻擊,,可以執行惡意SQL語句。它通過將任意SQL代碼插入資料庫查詢,使攻擊者能夠完全控制Web應用程式後面的資料庫伺服器。攻擊者可以使用SQL注入漏洞繞過應用程式安全措施;可以繞過網頁或Web應用程式的身份驗證和授權,並檢索整個SQL資料庫的內容;還可以使用SQL注入來添加,修改和刪除資料庫中的記錄。
  • php mysql SQL注入語句構造
    聲明:文章所有提到的「漏洞」,都沒有經過測試,可能根本不存在,其實有沒有漏洞並不重要,重要的是分析思路和語句構造。   二.「漏洞」分析:   1.admin/login.php注射導致繞過身份驗證漏洞:   代碼:   $conn=sql_connect($dbhost, $dbuser, $dbpswd, $dbname);   $password = md5($password);   $q = "select id,group_id from
  • SQLServer應用程式中的高級SQL注入
    當一個攻擊者能夠通過往query中插入一系列的sql語句來操作數據寫入到應用程式中去,我們管這種方法定義成SQL注入。一個典型的SQL語句如下:Selectid,forename,surnamefromauthors這條語句將返回authors表中所有行的id,forename和surname列。
  • Django QuerySet查詢基礎與技巧.有了她,再也不用擔心SQL注入了.
    相對直接使用SQL而言,QuerySet可以防止大部分SQL注入,而且提高代碼可讀性。畢竟Django的模型和具體表名不太一樣,需要查閱才得知表名,而且寫一大串SQL代碼可能直接把人看暈。假如碰到模型變動(改名、增刪欄位等),SQL可能又要重新調整。所以,能使用QuerySet的情況下,最好使用QuerySet。還有重要一點,QuerySet是懶惰的。