一、漏洞描述
針對sql注入的攻擊行為可描述為通過在使用者可控引數中注入sql語法,破壞原有sql結構,達到編寫程式時意料之外結果的攻擊行為。
二、攻擊場景及形成原因
漏洞成因可以歸結為以下兩個原因疊加造成的:
1. 程式編寫者在處理應用程式和資料庫互動時,使用字串拼接的方式構造sql語句。
2. 未對使用者可控引數進行足夠的過濾便將引數內容拼接進入到sql語句中。
sql注入的攻擊方式根據應用程式處理資料庫返回內容的不同,可以分為可顯注入、報錯注入和盲注
報錯和回顯注入顯而易見,盲注有時容易被忽略:
在頁面無返回的情況下,攻擊者也可以通過例如延時等技術來實現發現和利用注入漏洞:select 1 from te where
if((mid(version(),1,1) like 5,sleep(5),1) limit
0,1;判斷資料庫版本,執行成功瀏覽器返回會延時
利用benchmark函式進行延時注入 ' - (if(mid(version(),1,1) like 5,
benchmark(100000,sha1('true')), false)) - '
配置補充:
mysql:
避免從網際網路訪問mysql資料庫,確保特定主機才擁有訪問特權
禁用或限制遠端訪問
禁用local infile
降低系統特權
降低使用者的資料庫特權
禁用local infile命令 set-variable=local-infile=0
執行mysql自帶的安全配置檔案./bin/mysql_secure_installation
mssql:
刪除不必要的儲存過程 use master sp_dropextendedproc 』xp_cmdshell』
不要在資料庫應用中使用sa帳號等
三、危害性
攻擊者利用sql注入漏洞,可以獲取資料庫中的多種資訊(例如:管理員後台密碼),從而脫取資料庫中內容(脫庫)。
在特別情況下還可以修改資料庫內容或者插入內容到資料庫,如果資料庫許可權分配存在問題,或者資料庫本身存在缺陷,那麼攻擊者可以通過sql注入漏洞直接獲取webshell或者伺服器系統許可權。
$sql="select * from members where userid=".$_get[userid];
$sb->query($sql);
這段**的邏輯是根據使用者請求的userid進入資料庫查詢出不同的使用者並且返回給使用者,可以看到最終傳入的字串有一部分是根據使用者的輸入來控制的,一旦使用者提交
poc.php?userid=1 or 1=1
最終進入程式之後傳入資料庫的邏輯將是
$sb->query("select * from members where userid=1 or 1=1");
使用者完全可以根據傳入的內容來控制整個sql的邏輯,實現間接控制和管理資料庫的目的,這種命令(sql語句)和資料(使用者提交的查詢)不分開的實現方式導致了安全漏洞的產生
sql注入可能發生的地方是:外部資料與資料庫有互動的所有地方(增刪查改)
四、攻擊案例
通過sql注入漏洞利用工具: sqlmap.py -u ""
–data "user[password]=88952634&user[name]=88952634" –dbs
攻擊者通過注入得到管理員賬號和密碼成功進入後台
通過注入漏洞洩露大量敏感資訊
2.level1=1 and 1=2 union select
1,22222222222,3,44444,555555,6666666,77777777,8888888888,111111,0,11,12,13
into outfile
'/data0/dashboard/www/dashboard/html/cgi/***.php'-- ;&level2=&level3=&level4=&ct=20&listtype=0
通過sql注入漏洞,利用mysql into outfile 寫一句話木馬到***.php檔案。
檢視內部後台資料
拿到機器許可權後,對內網進行漫遊,內網資料庫暴露:
五、漏洞評級及處理
等級:嚴重
給出安全漏洞警告,12小時內必須進行修復。未修復漏洞之前禁止對外發布。
六、防禦方法
1.使用引數檢查的方式,攔截帶有sql語法的引數傳入應用程式
2.使用預編譯的處理方式處理拼接了使用者引數的sql語句(推薦!)
3.在引數即將進入資料庫執行之前,對sql語句的語義進行完整性檢查,確認語義沒有發生變化
4.在出現sql注入漏洞時,要在出現問題的引數拼接進sql語句前進行過濾或者校驗,不要依賴程式最開始處防護**
5.定期審計資料庫執行日誌,檢視是否存在應用程式正常邏輯之外的sql語句執行
推薦採用預編譯的方式防止sql注入
qframe框架:
/home/q/php/qframe/base/db/qframedb.php
$sql = 「select name from admin where id=?」
$db = qframedb::getinstance($db_config);
$db->query($sql,$param);
thinkphp框架:
$model->where("id=%d and username='%s' and
xx='%f'",array($id,$username,$xx))->select();
$model->where("id=%d and username='%s' and
xx='%f'",$id,$username,$xx)->select();
$model->query('select * from user where id=%d and
status=%d',$id,$status);
$model->query('select * from user where id=%d and
status=%d',array($id,$status));
使用更安全的函式:
$user = m("user"); // 例項化user物件
$user->find($_get["id"]);
補充:整型引數:
運用 intval函式將資料轉換成整數
函式原型 int intval(mixed var, int base)
var是要轉換成整形的變數
base,可選,是基礎數,預設是10 浮點型引數:
運用 floatval或doubleval函式分別轉換單精度和雙精度浮點型引數
函式原型
float floatval(mixed var)
var是要轉換的變數
double doubleval_r(mixed var)
var是要轉換的變數
字元型引數:
運用addslashes函式來將單引號「』」轉換成「\』」,雙引號「"」轉換成「\"」,反斜槓「\」轉換成「\\」,null字元加上反斜槓「\」
函式原型
string addslashes (string str)
mysql控制代碼 MySQL與控制代碼 MySQL
bitscn.com 1.環境 os win 2003 server x86 db mysql 5.1.30 community log 2.問題 mysql server占用的控制代碼數過大,使用過程消費控制代碼速度比釋放速度來的快,部分其他應用申請不到控制代碼,導致不可用。2.1.handle ...
mysql教程 mysql事務與mysql儲存引擎
事務概念及儲存引擎 1.0為何要事務?先來看乙個場景,銀行轉賬匯款 李彥巨集和周鴻?天天打架,現在讓李彥巨集給周鴻?轉款1000元 設計如下表 account表 編號 id 使用者名稱 user 金額 cash 1 李彥巨集 3000 2 周鴻?2000 傳統的做法 mysql update acc...
Mysql命令mysql 連線Mysql資料庫
mysql命令格式 mysql h主機位址 u使用者名稱 p使用者密碼 1 連線到本機上的mysql 首先開啟dos視窗,然後進入目錄mysql bin,再鍵入命令mysql u root p,回車後提示你輸密碼。注意使用者名稱前可以有空格也可以沒有空格,但是密碼前必須沒有空格,否則讓你重新輸入密碼...