88952634 mysql SQL注入

2021-10-17 19:20:08 字數 3534 閱讀 7280

一、漏洞描述

針對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,回車後提示你輸密碼。注意使用者名稱前可以有空格也可以沒有空格,但是密碼前必須沒有空格,否則讓你重新輸入密碼...