❶ 如何判斷是否存在sql注入以及注入類型
許多網站程序在編寫時,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。用戶可以提交一段資料庫查詢代碼,根據程序返回的結果,獲得某些想得知的數據,這就是所謂的SQL Injection,即SQL注入。如何判斷網站是否存在POST注入呢!請看以下步驟操作做。
POST注入操作介紹:
1.POST注入一般發生在表單數據傳輸時、抓取POST提交的數據進行SQL語句測試
POST注入操作流程:
比如抓取的POST數據為:userName=admin&password=admin
測試諸如語句填寫:userName=admin&password='admin 1=1--
像這樣userName 參數後面加一些SQL語句(注入測試語句)進行POST數據注入測試即可。
❷ 什麼是SQL注入
SQL注入是一種非常常見的資料庫攻擊手段,SQL注入漏洞也是網路世界中最普遍的漏洞之一。大家也許都聽過某某學長通過攻擊學校資料庫修改自己成績的事情,這些學長們一般用的就是SQL注入方法。
SQL注入其實就是惡意用戶通過在表單中填寫包含SQL關鍵字的數據來使資料庫執行非常規代碼的過程。簡單來說,就是數據「越俎代庖」做了代碼才能乾的事情。
這個問題的來源是,SQL資料庫的操作是通過SQL語句來執行的,而無論是執行代碼還是數據項都必須寫在SQL語句之中,這就導致如果我們在數據項中加入了某些SQL語句關鍵字(比如說SELECT、DROP等等),這些關鍵字就很可能在資料庫寫入或讀取數據時得到執行。
二、SQL注入的產生需要滿足以下兩個條件
1、參數用戶可控:前端傳給後端的參數用戶可控。2、參數帶入資料庫查詢:傳入的參數拼接到SQL語句中,且帶入資料庫中查詢。
1、按照注入點分類:
(1)數字型注入:許多網頁鏈接有類似的結構 http://xxx.com/users.php?id=1 基於此種形式的注入,注入點id為數字,一般被叫做數字型注入點,通過這種形式查詢出後台資料庫信息返回前台展示,可以構造類似以下的SQL語句進行爆破:select *** from 表名 where id=1 and 1=1。
2)字元型注入:網頁鏈接有類似的結構
http://xxx.com/users.php?name=admin 這種形式,注入點name為字元串,被稱為字元型注入,可以用:select *** from 表名 where name='admin' and 1=1。
3)搜索型注入:主要是指在數據搜索時沒有過濾搜索參數,一般在鏈接地址中有 "keyword=「關鍵字」",注入點提交的是SQL語句,select * from 表名 where 欄位 like '%關鍵字%' and '%1%'='%1%'。
❸ 部分sql注入總結
本人ctf選手一名,在最近做練習時遇到了一些sql注入的題目,但是sql注入一直是我的弱項之一,所以寫一篇總結記錄一下最近學到的一些sql注入漏洞的利用。
在可以聯合查詢的題目中,一般會將資料庫查詢的數據回顯到首頁面中,這是聯合注入的前提。
適用於有回顯同時資料庫軟體版本是5.0以上的MYSQL資料庫,因為MYSQL會有一個系統資料庫information_schema, information_schema 用於存儲資料庫元數據(關於數據的數據),例如資料庫名、表名、列的數據類型、訪問許可權等
聯合注入的過程:
判斷注入點可以用and 1=1/and 1=2用於判斷注入點
當注入類型為數字型時返回頁面會不同,但都能正常執行。
sql注入通常為數字型注入和字元型注入:
1、數字型注入
數字型語句:
在這種情況下直接使用and 1=1/and 1=2是都可以正常執行的但是返回的界面是不一樣的
2、字元型注入
字元型語句:
字元型語句輸入我們的輸入會被一對單引號或這雙引號閉合起來。
所以如果我們同樣輸入and 1=1/and 1=2會發現回顯畫面是並無不同的。
在我們傳入and 1=1/and 1=2時語句變為
傳入的東西變成了字元串並不會被當做命令。
所以字元型的測試方法最簡單的就是加上單引號 ' ,出現報錯。
加上注釋符--後正常回顯界面。
這里還有的點就是sql語句的閉合也是有時候不同的,下面是一些常見的
這一步可以用到order by函數,order by 函數是對MySQL中查詢結果按照指定欄位名進行排序,除了指定字 段名還可以指定欄位的欄位進行排序,第一個查詢欄位為1,第二個為2,依次類推,所以可以利用order by就可以判斷列數。
以字元型注入為例:
在列數存在時會正常回顯
但是列數不存在時就會報錯
這步就說明了為什麼是聯合注入了,用到了UNION,UNION的作用是將兩個select查詢結果合並
但是程序在展示數據的時候通常只會取結果集的第一行數據,這就讓聯合注入有了利用的點。
當我們查詢的第一行是不存在的時候就會回顯第二行給我們。
講查詢的數據置為-1,那第一行的數據為空,第二行自然就變為了第一行
在這個基礎上進行注入
可以發現2,3都為可以利用的顯示點。
和前面一樣利用union select,加上group_concat()一次性顯示。
現在非常多的Web程序沒有正常的錯誤回顯,這樣就需要我們利用報錯注入的方式來進行SQL注入了
報錯注入的利用步驟和聯合注入一致,只是利用函數不同。
以updatexml為例。
UpdateXML(xml_target, xpath_expr, new_xml)
xml_target: 需要操作的xml片段
xpath_expr: 需要更新的xml路徑(Xpath格式)
new_xml: 更新後的內容
此函數用來更新選定XML片段的內容,將XML標記的給定片段的單個部分替換為 xml_target 新的XML片段 new_xml ,然後返回更改的XML。xml_target替換的部分 與xpath_expr 用戶提供的XPath表達式匹配。
這個函數當xpath路徑錯誤時就會報錯,而且會將路徑內容返回,這就能在報錯內容中看到我們想要的內容。
而且以~開頭的內容不是xml格式的語法,那就可以用concat函數拼接~使其報錯,當然只要是不符合格式的都可以使其報錯。
[極客大挑戰 2019]HardSQL
登錄界面嘗試注入,測試後發現是單引號字元型注入,且對union和空格進行了過濾,不能用到聯合注入,但是有錯誤信息回顯,說明可以使用報錯注入。
利用updatexml函數的報錯原理進行注入在路徑處利用concat函數拼接~和我們的注入語句
發現xpath錯誤並執行sql語句將錯誤返回。
在進行爆表這一步發現了等號也被過濾,但是可以用到like代替等號。
爆欄位
爆數據
這里就出現了問題flag是不完整的,因為updatexml能查詢字元串的最大長度為32,所以這里要用到left函數和right函數進行讀取
報錯注入有很多函數可以用不止updatexml一種,以下三種也是常用函數:
堆疊注入就是多條語句一同執行。
原理就是mysql_multi_query() 支持多條sql語句同時執行,用;分隔,成堆的執行sql語句。
比如
在許可權足夠的情況下甚至可以對資料庫進行增刪改查。但是堆疊注入的限制是很大的。但是與union聯合執行不同的是它可以同時執行無數條語句而且是任何sql語句。而union執行的語句是有限的。
[強網杯 2019]隨便注
判斷完注入類型後嘗試聯合注入,發現select被過濾,且正則不區分大小寫過濾。
那麼就用堆疊注入,使用show就可以不用select了。
接下去獲取表信息和欄位信息
那一串數字十分可疑大概率flag就在裡面,查看一下
這里的表名要加上反單引號,是資料庫的引用符。
發現flag,但是沒辦法直接讀取。再讀取words,發現裡面有個id欄位,猜測資料庫語句為
結合1'or 1=1#可以讀取全部數據可以利用改名的方法把修改1919810931114514為words,flag修改為id,就可以把flag讀取了。
最終payload:
盲注需要掌握的幾個函數
在網頁屏蔽了錯誤信息時就只能通過網頁返回True或者False判斷,本質上是一種暴力破解,這就是布爾盲注的利用點。
首先,判斷注入點和注入類型是一樣的。
但是盲注沒有判斷列數這一步和判斷顯示位這兩步,這是和可回顯注入的不同。
判斷完注入類型後就要判斷資料庫的長度,這里就用到了length函數。
以[WUSTCTF2020]顏值成績查詢為例
輸入參數後,發現url處有個get傳入的stunum
然後用到length函數測試是否有注入點。
發現頁面有明顯變化
將傳入變為
頁面回顯此學生不存在
那麼就可以得出資料庫名長度為3
測試發現過濾了空格
然後就是要查資料庫名了,這里有兩種方法
一、只用substr函數,直接對比
這種方法在寫腳本時可以用於直接遍歷。
二、加上ascii函數
這個payload在寫腳本時直接遍歷同樣可以,也可用於二分法查找,二分法速度更快。
接下來的步驟就和聯合注入一樣,只不過使用substr函數一個一個截取字元逐個判斷。但是這種盲注手工一個一個注十分麻煩所以要用到腳本。
直接遍歷腳本
二分法腳本
時間盲注用於代碼存在sql注入漏洞,然而頁面既不會回顯數據,也不會回顯錯誤信息
語句執行後也不提示真假,我們不能通過頁面的內容來判斷
所以有布爾盲注就必有時間盲注,但有時間盲注不一定有布爾盲注
時間盲注主要是利用sleep函數讓網頁的響應時間不同從而實現注入。
sql-lab-less8:
無論輸入什麼都只會回顯一個you are in...,這就是時間盲注的特點。
當正常輸入?id=1時時間為11毫秒
判斷為單引號字元型注入後,插入sleep語句
明顯發現響應時間為3053毫秒。
利用時間的不同就可以利用腳本跑出資料庫,後續步驟和布爾盲注一致。
爆庫
爆表
爆欄位
腳本
在進行SQL注入時,發現union,and,or被完全過濾掉了,就可以考慮使用異或注入
什麼是異或呢
異或是一種邏輯運算,運演算法則簡言之就是:兩個條件相同(同真或同假)即為假(0),兩個條件不同即為真(1),null與任何條件做異或運算都為null,如果從數學的角度理解就是,空集與任何集合的交集都為空
即 1^1=0,0^0=0,1^0=1
利用這個原理可以在union,and,or都被過濾的情況下實現注入
[極客大挑戰 2019]FinalSQL
給了五個選項但是都沒什麼用,在點擊後都會在url處出現?id。
而且union,and,or都被過濾
測試發現?id=1^1會報錯
但是?id=1^0會返回?id=1的頁面,這就是前面說的原理,當1^0時是等於1的所以返回?id=1的頁面。
根據原理寫出payload,進而寫出腳本。
爆庫
爆表
爆欄位
據此可以寫出基於異或的布爾盲注腳本
實驗推薦:課程:SQL注入初級(合天網安實驗室)
❹ 什麼是sql注入sql注入有哪些方式防止sql注入又有哪些方式(.Net下)
所謂SQL注入,其實是程序漏洞,沒有什麼技術,比如下面的語句就可能被注入
SQL="SELECT * FROM ADMIN WHERE USER='" &REQUEST("USER")& "' AND PASS ='" &REQUEST("PASS")& "'"
別人可以精心設計一個PASS參數提交給你,使得你的SQL完成其它功能,例如PASS的值為:
abc' OR USER='admin
這時候SQL語句是什麼樣子,你看看:
SELECT * FROM ADMIN WHERE USER='admin' AND PASS='abc' OR USER='admin'
任何密碼都可以成功登錄。
解決的方法:程序應該判斷USER和PASS這些參數裡面是否有引號等特殊符號。
上面是一個簡單的例子,通過提交精心設計的參數,還可以修改你的資料庫。
❺ SQL注入攻擊的種類有哪些
1.沒有正確過濾轉義字元 在用戶的輸入沒有為轉義字元過濾時,就會發生這種形式的注入式攻擊,它會被傳遞給一個SQL語句。這樣就會導致應用程序的終端用戶對資料庫上的語句實施操縱。比方說,下面的這行代碼就會演示這種漏洞: statement := "SELECT * FROM users WHERE name ='" userName "';" 這種代碼的設計目的是將一個特定的用戶從其用戶表中取出,但是,如果用戶名被一個惡意的用戶用一種特定的方式偽造,這個語句所執行的操作可能就不僅僅是代碼的作者所期望的那樣了。例如,將用戶名變數(即username)設置為: a' or 't'='t,此時原始語句發生了變化: SELECT * FROM users WHERE name = 'a' OR 't'='t'; 如果這種代碼被用於一個認證過程,那麼這個例子就能夠強迫選擇一個合法的用戶名,因為賦值't'='t永遠是正確的。 在一些SQL伺服器上,如在SQLServer中,任何一個SQL命令都可以通過這種方法被注入,包括執行多個語句。下面語句中的username的值將會導致刪除「users」表,又可以從「data」表中選擇所有的數據(實際上就是透露了每一個用戶的信息)。 a';DROP TABLE users; SELECT * FROM data WHERE name LIKE'% 這就將最終的SQL語句變成下面這個樣子: SELECT * FROM users WHERE name = 'a';DROP TABLE users;SELECT * FROM DATA WHERE name LIKE '%'; 其它的SQL執行不會將執行同樣查詢中的多個命令作為一項安全措施。這會防止攻擊者注入完全獨立的查詢,不過卻不會阻止攻擊者修改查詢。
2.Incorrecttype handling 如果一個用戶提供的欄位並非一個強類型,或者沒有實施類型強制,就會發生這種形式的攻擊。當在一個SQL語句中使用一個數字欄位時,如果程序員沒有檢查用戶輸入的合法性(是否為數字型)就會發生這種攻擊。例如: statement := "SELECT * FROM data WHERE id = " a_variable ";" 從這個語句可以看出,作者希望a_variable是一個與「id」欄位有關的數字。不過,如果終端用戶選擇一個字元串,就繞過了對轉義字元的需要。例如,將a_variable設置為:1;DROP TABLEusers,它會將「users」表從資料庫中刪除,SQL語句變成:SELECT * FROM DATA WHERE id = 1;DROP TABLE users;
3.資料庫伺服器中的漏洞 有時,資料庫伺服器軟體中也存在著漏洞,如MYSQL伺服器中mysql_real_escape_string()函數漏洞。這種漏洞允許一個攻擊者根據錯誤的統一字元編碼執行一次成功的SQL注入式攻擊。
4.盲目SQL注入式攻擊 當一個Web應用程序易於遭受攻擊而其結果對攻擊者卻不見時,就會發生所謂的盲目SQL注入式攻擊。有漏洞的網頁可能並不會顯示數據,而是根據 注入到合法語句中的邏輯語句的結果顯示不同的內容。這種攻擊相當耗時,因為必須為每一個獲得的位元組而精心構造一個新的語句。但是一旦漏洞的位置和目標信息的位置被確立以後,一種稱為Absinthe的工具就可以使這種攻擊自動化。
5.條件響應 注意,有一種SQL注入迫使資料庫在一個普通的應用程序屏幕上計算一個邏輯語句的值: SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd'AND 1=1 這會導致一個標準的面面,而語句 SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd'AND 1=2在頁面易於受到SQL注入式攻擊時,它有可能給出一個不同的結果。如此這般的一次注入將會證明盲目的SQL注入是可能的,它會使攻擊者根據另外一個 表中的某欄位內容設計可以評判真偽的語句。
6.條件性差錯 如果WHERE語句為真,這種類型的盲目SQL注入會迫使資料庫評判一個引起錯誤的語句,從而導致一個SQL錯誤。例如: SELECT 1/0 FROM users WHERE username='Ralph'。顯然,如果用戶Ralph存在的話,被零除將導致錯誤。
7.時間延誤 時間延誤是一種盲目的SQL注入,根據所注入的邏輯,它可以導致SQL引擎執行一個長隊列或者是一個時間延誤語句。攻擊者可以衡量頁面載入的時間,從而決定所注入的語句是否為真。 以上僅是對SQL攻擊的粗略分類。但從技術上講,如今的SQL注入攻擊者們在如何找出有漏洞的網站方面更加聰明,也更加全面了。出現了一些新型的SQL攻擊手段。黑客們可以使用各種工具來加速漏洞的利用過程。我們不妨看看theAsprox Trojan這種木馬,它主要通過一個發布郵件的僵屍網路來傳播,其整個工作過程可以這樣描述:首先,通過受到控制的主機發送的垃圾郵件將此木馬安裝到電腦上,然後,受到此木馬感染的電腦會下載一段二進制代碼,在其啟動時,它會使用搜索引擎搜索用微軟的 ASP技術建立表單的、有漏洞的網站。搜索的結果就成為SQL注入攻擊的靶子清單。接著,這個木馬會向這些站點發動SQL注入式攻擊,使有些網站受到控制、破壞。訪問這些受到控制和破壞的網站的用戶將會受到欺騙,從另外一個站點下載一段惡意的JavaScript代碼。最後,這段代碼將用戶指引到第三個站點,這里有更多的惡意軟體,如竊取口令的木馬。 以前,經常有人警告或建議Web應用程序的程序員們對其代碼進行測試並打補丁,雖然SQL注入漏洞被發現和利用的機率並不太高。但近來攻擊者們越來越多地發現並惡意地利用這些漏洞。因此,在部署其軟體之前,開發人員應當更加主動地測試其代碼,並在新的漏洞出現後立即對代碼打補丁。
如果你是一個開發者,那麼你需要:
1.使用參數化的過濾性語句 要防禦SQL注入,用戶的輸入就絕對不能直接被嵌入到SQL語句中。恰恰相反,用戶的輸入必須進行過濾,或者使用參數化的語句。參數化的語句使用參數而不是將用戶輸入嵌入到語句中。在多數情況中,SQL語句就得以修正。然後,用戶輸入就被限於一個參數。下面是一個使用Java和JDBC API例子: PreparedStatement prep =conn.prepareStatement("SELECT * FROM USERS WHERE PASSWORD=?"); prep.setString(1, pwd); 總體上講,有兩種方法可以保證應用程序不易受到SQL注入的攻擊,一是使用代碼復查,二是強迫使用參數化語句的。強迫使用參數化的語句意味著嵌入用戶輸入的SQL語句在運行時將被拒絕。不過,目前支持這種特性的並不多。如H2 資料庫引擎就支持。
2.還要避免使用解釋程序,因為這正是黑客們藉以執行非法命令的手段。
3.防範SQL注入,還要避免出現一些詳細的錯誤消息,因為黑客們可以利用這些消息。要使用一種標準的輸入確認機制來驗證所有的輸入數據的長度、類型、語句、企業規則等。
4.使用專業的漏洞掃描工具。但防禦SQL注入攻擊也是不夠的。攻擊者們目前正在自動搜索攻擊目標並實施攻擊。其技術甚至可以輕易地被應用於其它的Web架構中的漏洞。企業應當投資於一些專業的漏洞掃描工具,如大名鼎鼎的Acunetix的Web漏洞掃描程序等。一個完善的漏洞掃描程序不同於網 絡掃描程序,它專門查找網站上的SQL注入式漏洞。最新的漏洞掃描程序可以查找最新發現的漏洞。
5.最後一點,企業要在Web應用程序開發過程的所有階段實施代碼的安全檢查。首先,要在部署Web應用之前實施安全測試,這種措施的意義比以前更大、更深遠。企業還應當在部署之後用漏洞掃描工具和站點監視工具對網站進行測試。
❻ sql注入攻擊,除了注入select語句外,還可以注入哪些語句
Insert、Update、Delete、Drop等都可以
例:參數id=張三';Delete From myTable where '1'='1
程序中SQL語句:strSql="Select * From myTable where name='" + strName + "'"
最終strSql中的語句就成了:Select * From myTable where name='張三';Delete From myTable where '1'='1'
❼ 什麼是sql注入我們常見的提交方式有哪些
針對你得問題,我有以下回答,希望能解開你的困惑。
首先回答第一個問題:什麼是SQL注辯虧敗入?
一般來說,黑客通過把惡意的sql語句插入到網站的表單提交或者輸入域名請求的查詢語句,最終達到欺騙網站的伺服器執行惡意的sql語句,通過這些sql語句來獲取黑攜顫客他們自己想要的一些數據信息和用戶信息,也就是說如果存在sql注入,那麼就可以執行sql語句的所有命令
那我延伸一個問題:sql注入形成的原因是什麼呢?
資料庫的屬於與網站的代碼未嚴格分離,當一個黑客提交的參數數據未做充分的檢查和防禦的話,那麼黑客的就會輸入惡意的sql命令,改變了原有的sql命令的語義,就會把黑客執行的語句帶入到資料庫被執行。
現在回答第二個問題:我們常見的注入方式有哪些?
我們常見的提交方式就是GET和POST
首先是GET,get提交方式,比如說你要查詢一個數據,那麼查詢的代碼就會出現在鏈接當空首中,可以看見我們id=1,1就是我們搜索的內容,出現了鏈接當中,這種就是get。
第二個是Post提交方式是看不見的,需要我們利用工具去看見,我們要用到hackbar這款瀏覽器插件
可以就可以這樣去提交,在這里我搜索了2,那麼顯示的數據也就不同,這個就是資料庫的查詢功能,那麼的話,get提交比post的提交更具有危害性。
第二個是Post提交方式是看不見的,需要我們利用工具去看見,我們要用到hackbar這款瀏覽器插件。
以上便是我的回答,希望對你有幫助。
❽ 根據參數類型的不同,SQL注入可以分為()。
根據參數大嘩類型的不同,SQL注磨仿罩入可以分為(瞎鬧)。
A.回顯注入
B.數字型注入
C.字元型注入
D.盲注
正確答案:BC
❾ SQL注入攻擊的種類和防範手段有哪些
所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到蘆局早Web表單的輸入域或頁面請求的查詢字元串,欺騙伺服器執行惡臘侍意的SQL命令。
在某些表單中,用戶輸入的內容直接用來構造(或者影陪雀響)動態SQL命令,或作為存儲過程的輸入參數,這類表單特別容易受到SQL注入式攻擊。常見的SQL注入式攻擊過程類如:
⑴ 某個ASP.NET Web應用有一個登錄頁面,這個登錄頁面控制著用戶是否有權訪問應用,它要求用戶輸入一個名稱和密碼。
⑵ 登錄頁面中輸入的內容將直接用來構造動態的SQL命令,或者直接用作存儲過程的參數。