繞過sql注入
A. 如何避免代碼中出現sql注入
普通用戶與系統管理員用戶的許可權要有嚴格的區分。
如果一個普通用戶在使用查詢語句中嵌入另一個Drop Table語句,那麼是否允許執行呢?由於Drop語句關繫到資料庫的基本對象,故要操作這個語句用戶必須有相關的許可權。在許可權設計中,對於終端用戶,即應用軟體的使用者,沒有必要給他們資料庫對象的建立、刪除等許可權。那麼即使在他們使用SQL語句中帶有嵌入式的惡意代碼,由於其用戶許可權的限制,這些代碼也將無法被執行。故應用程序在設計的時候,
強迫使用參數化語句。
如果在編寫SQL語句的時候,用戶輸入的變數不是直接嵌入到SQL語句。而是通過參數來傳遞這個變數的話,那麼就可以有效的防治SQL注入式攻擊。也就是說,用戶的輸入絕對不能夠直接被嵌入到SQL語句中。與此相反,用戶的輸入的內容必須進行過濾,或者使用參數化的語句來傳遞用戶輸入的變數。參數化的語句使用參數而不是將用戶輸入變數嵌入到SQL語句中。採用這種措施,可以杜絕大部分的SQL注入式攻擊。不過可惜的是,現在支持參數化語句的資料庫引擎並不多。不過資料庫工程師在開發產品的時候要盡量採用參數化語句。
多多使用SQL Server資料庫自帶的安全參數。
為了減少注入式攻擊對於SQL Server資料庫的不良影響,在SQLServer資料庫專門設計了相對安全的SQL參數。在資料庫設計過程中,工程師要盡量採用這些參數來杜絕惡意的SQL注入式攻擊。
如在SQL Server資料庫中提供了Parameters集合。這個集合提供了類型檢查和長度驗證的功能。如果管理員採用了Parameters這個集合的話,則用戶輸入的內容將被視為字元值而不是可執行代碼。即使用戶輸入的內容中含有可執行代碼,則資料庫也會過濾掉。因為此時資料庫只把它當作普通的字元來處理。使用Parameters集合的另外一個優點是可以強制執行類型和長度檢查,范圍以外的值將觸發異常。如果用戶輸入的值不符合指定的類型與長度約束,就會發生異常,並報告給管理員。如上面這個案例中,如果員工編號定義的數據類型為字元串型,長度為10個字元。而用戶輸入的內容雖然也是字元類型的數據,但是其長度達到了20個字元。則此時就會引發異常,因為用戶輸入的內容長度超過了資料庫欄位長度的限制。
加強對用戶輸入的驗證。
總體來說,防治SQL注入式攻擊可以採用兩種方法,一是加強對用戶輸入內容的檢查與驗證;二是強迫使用參數化語句來傳遞用戶輸入的內容。在SQLServer資料庫中,有比較多的用戶輸入內容驗證工具,可以幫助管理員來對付SQL注入式攻擊。測試字元串變數的內容,只接受所需的值。拒絕包含二進制數據、轉義序列和注釋字元的輸入內容。這有助於防止腳本注入,防止某些緩沖區溢出攻擊。測試用戶輸入內容的大小和數據類型,強制執行適當的限制與轉換。這即有助於防止有意造成的緩沖區溢出,對於防治注入式攻擊有比較明顯的效果。
如可以使用存儲過程來驗證用戶的輸入。利用存儲過程可以實現對用戶輸入變數的過濾,如拒絕一些特殊的符號。如以上那個惡意代碼中,只要存儲過程把那個分號過濾掉,那麼這個惡意代碼也就沒有用武之地了。在執行SQL語句之前,可以通過資料庫的存儲過程,來拒絕接納一些特殊的符號。在不影響資料庫應用的前提下,應該讓資料庫拒絕包含以下字元的輸入。如分號分隔符,它是SQL注入式攻擊的主要幫凶。如注釋分隔符。注釋只有在數據設計的時候用的到。一般用戶的查詢語句中沒有必要注釋的內容,故可以直接把他拒絕掉,通常情況下這么做不會發生意外損失。把以上這些特殊符號拒絕掉,那麼即使在SQL語句中嵌入了惡意代碼,他們也將毫無作為。
多層環境如何防治SQL注入式攻擊?
在多層應用環境中,用戶輸入的所有數據都應該在驗證之後才能被允許進入到可信區域。未通過驗證過程的數據應被資料庫拒絕,並向上一層返回一個錯誤信息。實現多層驗證。對無目的的惡意用戶採取的預防措施,對堅定的攻擊者可能無效。更好的做法是在用戶界面和所有跨信任邊界的後續點上驗證輸入。如在客戶端應用程序中驗證數據可以防止簡單的腳本注入。但是,如果下一層認為其輸入已通過驗證,則任何可以繞過客戶端的惡意用戶就可以不受限制地訪問系統。故對於多層應用環境,在防止注入式攻擊的時候,需要各層一起努力,在客戶端與資料庫端都要採用相應的措施來防治SQL語句的注入式攻擊。
B. SQL注入防禦與繞過的幾種姿勢 – 即刻安全
當php.ini里的magic_quotes_gpc=On時。提交的變數中所有的單引號(')、雙引號(")、反斜線()與 NUL(NULL 字元)會自動轉為含有反斜線的轉義字元。
魔術引號(Magic Quote)是一個自動將進入 PHP 腳本的數據進行轉義的過程。(對所有的 GET、POST 和 COOKIE 數據自動運行轉義)
PHP 5.4 之前 PHP 指令 magic_quotes_gpc 默認是 on。
本特性已自PHP 5.3.0 起廢棄並將自 PHP 5.4.0 起移除,在PHP 5.4.O 起將始終返回 FALSE。
C. 繞過SQL防注入問題
你可以利用cookie注入,也就是利用中轉注入,在本地搭建環境,利用中轉注入找出漏洞,很簡單,如果不會,我可以幫你破解,注入,但webshell你自己拿
D. 通過代碼限制輸入select,能防止sql注入了有繞過方法嗎
直接把符號的編碼轉換或者轉義可以了。一般sql注入根本用不到select,譬如賬號密碼你默認就是在where條件上進行查詢,如果人家or 1=1則默認真。另外也能通過UNION 返回的錯誤判斷返回值的數量和類型。如果沒限制 換行+GO 的話甚至能執行自己想要的SQL。但是這些最終都需要一個符號例如單引號"'"吧系統誤以為輸入框的內容已階段。如果轉義或者轉編碼後,最多就變成一段長字元而已
E. 什麼是sql注入如何防止sql注入
SQL注入是一種非常常見的資料庫攻擊手段,同時也是網路世界中最普遍的漏洞之一,簡單理解就是惡意用戶通過在表單中填寫包含SQL關鍵字的數據來使資料庫執行非常規代碼的過程。
問題來源是,SQL資料庫的操作是通過SQL語句來執行的,而無論是執行代碼還是數據項都必須寫在SQL語句中,也就導致如果我們在數據項中加入了某些SQL語句關鍵字,比如SELECT、DROP等,這些關鍵字就很有可能在資料庫寫入或讀取數據時得到執行。
解決方案
方案一:
採用預編譯技術
使用預編譯的SQL語句,SQL語句的語義不會是不會發生改變的。預編譯語句在創建的時候就已經將指定的SQL語句發送給了DBMS,完成了解析,檢查,編譯等工作,所以攻擊者無法改變SQL語句的結構,只是把值賦給?,然後將?這個變數傳給SQL語句。當然還有一些通過預編譯繞過某些安全防護的操作,大家感興趣可以去搜索一下。
方案二:
嚴格控制數據類型
在java、c等強類型語言中一般是不存在數字型注入的,因為在接受到用戶輸入id時,代碼一般會做一個int id 的數據類型轉換,假如我們輸入的是字元串的話,那麼這種情況下,程序就會報錯。但是在PHP、ASP這些沒有強調處理數據類型的語言,一般我們看到的接收id的代碼都是如下等代碼。
方案三:
對特殊的字元進行轉義
數字型注入可以通過檢查數據類型防止,但是字元型不可以,那麼怎麼辦呢,最好的辦法就是對特殊的字元進行轉義了。比如在MySQL中我們可以對" '
"進行轉義,這樣就防止了一些惡意攻擊者來閉合語句。當然我們也可以通過一些安全函數來轉義特殊字元。如addslashes()等,但是這些函數並非一勞永逸,攻擊者還可以通過一些特殊的方式繞過。
F. sql注入 form過濾怎麼繞過
微有點安全意識的朋友就應該懂得要做一下sql注入過濾。下面是一些繞過sql注入過濾的一些方法(沒有深入研究之意,所以只是集中簡單的繞過sql注入過濾方法)
1. 繞過空格過濾
使用注釋/**/來替換,類似C語言一樣,C語言在編譯之前注釋會被用個空格替換。
select/**/pwd/**/from/**/usertable/**/where/**/id='admin'
2.繞過關鍵字過濾
很多人都對select, union操作關鍵字等進行了過濾,但是有可能沒有考慮大小寫的問題。
SeLeCT pwd from usertable where id='admin'
3.用編碼繞過關鍵字過濾
可以把字元轉換為%加上16進制的形式,如or 1=1即%6f%72%20%31%3d%31
4.使用char來繞過過濾
使用char(ASCII碼)來替換字元,可以直接在MySql下工作。CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)為or 1=1的編碼。
select pwd from usertable where id='root' + CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)
5.繞過其他一些過濾機制
G. 如何徹底防止SQL注入
1、對,限制用戶輸入肯定有效
2、應該也可以做到,但正則不是一種高效的方法,用HtmlEncode的方法可以有效防止空格等被DBMS解釋,但注意別把編碼、解碼搞反了;存儲過程是DBMS執行的一段程序,把數據操縱交給存儲過程執行,而不是提交SQL語句,可以有效防止SQL注入。
3、地址欄的Sql攻擊,下面我引用了一段資料解釋,他關於機制說的較清楚,關於解決,只是從客戶端考慮的,實際上用存儲過程等都可以防範。
資料:
首先,入侵者會對一個網站確定可不可以進行注入,假設一篇文章的地址為:http://www.naohou.cn/show.asp?id=325一般會以提交兩個地址來測試,如:
http://www.naohou.cn/show.asp?id=325 and 1=1
http://www.naohou.cn/show.asp?id=325 and 1=2
第一個地址後面加了 and 1=1,構成的SQL語句也就變為了:Select * from 表單名 where id=1 and 1=1這句話要成立就必須and前後語句都成立。那麼前面的文章地址是可以訪問的,後面的1=1也是客觀成立的,那麼第一個地址就可以正常顯示;相反1=2是顯然不成立的,關鍵就看這步了,如果提交and 1=2頁面還是正常顯示說明他並沒有將and 1=2寫入SQL語句,此站也就不存在注入漏洞;但如果提交and 1=2之後返回了錯誤頁面則說明此站點將後面的語句帶入了SQL語句並執行了,也就說明他可以進行SQL注入。(註:如果地址後面跟的是news.asp?id='1'就得變為news.asp?id=1' and '1'='1來補全引號了)
那麼,知道可以注入後入侵者可以做什麼呢?
這里就簡單的說一下,比如提交這樣的地址:
http://www.naohou.cn/show.asp?id=325 and exists (select * from 表名 where 列名=數據)
根據返回的正確或錯誤頁面來判斷猜的表名和列名是否正確,具體實現時是先猜表名再猜列名。當猜出表名和列名之後還可以用ASC和MID函數來猜出各列的數據。MID函數的格式為:mid(變數名,第幾個字元開始讀取,讀取幾個字元),比如:mid(pwd,1,2)就可以從變數pwd中的第一位開始讀取兩位的字元。ASC函數的格式為:ASC("字元串"),如:asc("a")就可以讀出字母a的ASCII碼了。那麼實際應用的時候就可以寫為:asc(mid(pwd,1,1))這樣讀取的就是pwd列的第一個字元的ASCII碼,提交: asc(mid(pwd,1,1))>97以返回的頁面是否為正確頁面來判斷pwd列的第一個字元的ASCII碼是否大於97(a的ASCII碼),如果正確就再試是否小於122(z的ASCII碼)……這樣慢慢縮小字元的ASCII碼的范圍,猜到真實的ASCII碼也只是時間的問題。一位一位的猜就可以得到資料庫中的用戶名和密碼了。還有一種ASP驗證缺陷——就是用戶名和密碼都輸'or '1'='1,構造SQL語句Select * form 表單名 where username='' or '1'='1' and pwd='' or '1'='1'就可以達到繞過密碼驗證的目的。
說了那麼多,其實防範的方法很簡單,我們把特殊字元(如and、or、'、")都禁止提交就可以防止注入了。ASP傳輸數據分為get和post兩種, get是通過將數據添加到URL後提交的方式,post則是利用郵寄信息數據欄位將數據傳送到伺服器。
H. 如何手動繞過SQL注入過濾器
開始。運行.services.msc,服務管理的,這么多服務,那如何找到那個才是呢,
那可以去運行VM虛擬機,會提某某服務被禁用,請開啟的字樣,那首字母按下即可。
I. 怎麼繞過這個SQL注入後面的單引號
繞過不執行不知道怎麼寫
但可以讓where條件變成無意義的條件
arg="1' OR '1'='1";這樣c='"+"1' OR '1'='1"+"'。執行時應該就變成了
select * from table where c='1' OR '1'='1' ,判斷條件無意義了,即相當於 select * from table
這個網路上就有示例