滲透專題丨web Top10 漏洞簡(jiǎn)述(1)
SQL注入
1、簡(jiǎn)述
web程序中對(duì)于用戶提交參數(shù)沒(méi)有過(guò)濾直接放到SQL語(yǔ)句中執(zhí)行,打破了SQL語(yǔ)句邏輯,獲取信息,執(zhí)行命令等。
2、預(yù)防手段
1.?減少網(wǎng)站顯示SQL錯(cuò)誤信息,像類(lèi)型錯(cuò)誤,字段不匹配等,可以防止黑客獲取相關(guān)信息;
2.?限制用戶對(duì)于數(shù)據(jù)庫(kù)的操作權(quán)限;
3.?對(duì)進(jìn)入數(shù)據(jù)庫(kù)的特殊字符進(jìn)行轉(zhuǎn)義處理或者編碼轉(zhuǎn)換;
4.?網(wǎng)站數(shù)據(jù)層進(jìn)行編碼統(tǒng)一;
5.?查詢語(yǔ)句使用參數(shù)化查詢接口;
6.?限制用戶輸入長(zhǎng)度;
7.?確定數(shù)據(jù)庫(kù)中數(shù)據(jù)類(lèi)型。
3、SQL注入原理
??從前端傳給后端的參數(shù)內(nèi)容是用戶可以控制的
??傳入的參數(shù)是可以拼接到SQL語(yǔ)句中執(zhí)行
4、SQL注入常規(guī)思路
1.?找注入點(diǎn),手工或者web掃描工具實(shí)現(xiàn)
2.?通過(guò)注入點(diǎn),獲取有關(guān)數(shù)據(jù)庫(kù)信息,像數(shù)據(jù)庫(kù)用戶名、數(shù)據(jù)庫(kù)名稱、數(shù)據(jù)庫(kù)版本等信息
3.?猜測(cè)數(shù)據(jù)庫(kù)表重要字段和內(nèi)容,像存放管理員賬戶表名等
4.?通過(guò)獲取的用戶信息,進(jìn)行登錄
5、手工注入思路
1.?判斷是否存在注入,注入是字符型還是數(shù)字型
2.?猜解?SQL?查詢語(yǔ)句中的字段數(shù)?order by N
3.?確定顯示的字段順序
4.?獲取當(dāng)前數(shù)據(jù)庫(kù)
5.?獲取數(shù)據(jù)庫(kù)中的表
6.?獲取表中的字段名
7.?查詢到賬戶的數(shù)據(jù)
6、SQL花式注入手段
??延遲注入:屬于盲注入,一般是某個(gè)注入點(diǎn)無(wú)法通過(guò)布爾型注入后去數(shù)據(jù)而采取的一種突破注入的技術(shù)手段,判斷注入可以使用“and sleep(10)”讓數(shù)據(jù)庫(kù)延時(shí)10秒返回,網(wǎng)頁(yè)響應(yīng)至少需要10秒,根據(jù)這個(gè)原理判斷存在SQL時(shí)間注入。例:select if(length(database())>1,sleep(5),0)?這個(gè)就是查詢當(dāng)前庫(kù)大于?1?就會(huì)延時(shí)?5?秒執(zhí)行。
??堆疊注入:堆疊查詢可以執(zhí)行多條?SQL?語(yǔ)句,語(yǔ)句之間以分號(hào)(;)隔開(kāi),而堆疊查詢注入攻擊就是利用此特點(diǎn),在第二條語(yǔ)句中構(gòu)造要執(zhí)行攻擊的語(yǔ)句。在?mysql?里?mysqli_multi_query?和?mysql_multi_query這兩個(gè)函數(shù)執(zhí)行一個(gè)或多個(gè)針對(duì)數(shù)據(jù)庫(kù)的查詢。多個(gè)查詢用分號(hào)進(jìn)行分隔。他可以任意使用增刪改查的語(yǔ)句,例如刪除數(shù)據(jù)庫(kù)?修改數(shù)據(jù)庫(kù),添加數(shù)據(jù)庫(kù)用戶。
??二次注入攻擊:在第一次進(jìn)行數(shù)據(jù)庫(kù)插入數(shù)據(jù)的時(shí)候,僅僅只是使用了?addslashes?或者是借助get_magic_quotes_gpc?對(duì)其中的特殊字符進(jìn)行了轉(zhuǎn)義,但是?addslashes?有一個(gè)特點(diǎn)就是雖然參數(shù)在過(guò)濾后會(huì)添加?“\”?進(jìn)行轉(zhuǎn)義,但是“\”并不會(huì)插入到數(shù)據(jù)庫(kù)中,在寫(xiě)入數(shù)據(jù)庫(kù)的時(shí)候還是保留了原來(lái)的數(shù)據(jù)。在將數(shù)據(jù)存入到了數(shù)據(jù)庫(kù)中之后,開(kāi)發(fā)者就認(rèn)為數(shù)據(jù)是可信的。在下一次進(jìn)行需要進(jìn)行查詢的時(shí)候,直接從數(shù)據(jù)庫(kù)中取出了臟數(shù)據(jù),沒(méi)有進(jìn)行下一步的檢驗(yàn)和處理,這樣就會(huì)造成?SQL?的二次注入。比如在第一次插入數(shù)據(jù)的時(shí)候,數(shù)據(jù)中帶有單引號(hào),直接插入到了數(shù)據(jù)庫(kù)中;然后在下一次使用中在拼湊的過(guò)程中,就形成了二次注入。
??寬字節(jié)注入:在?SQL?進(jìn)行防注入的時(shí)候,一般會(huì)開(kāi)啟?gpc,過(guò)濾特殊字符。一般情況下開(kāi)啟?gpc?是可以防御很多字符串型的注入,但是如果數(shù)據(jù)庫(kù)編碼不對(duì),也可以導(dǎo)致?SQL?防注入繞過(guò),達(dá)到注入的目的。如果數(shù)據(jù)庫(kù)設(shè)置寬字節(jié)字符集?gbk?會(huì)導(dǎo)致寬字節(jié)注入,從而避開(kāi)?gpc。
??base64編碼注入:在php?中?base64_encode()函數(shù)對(duì)字符串進(jìn)行base64?編碼,既然可以編碼也可以進(jìn)行解碼,base64_decode()這個(gè)函數(shù)對(duì)?base64?進(jìn)行解碼。base64?編碼注入,可以繞過(guò)?gpc?注入攔截,因?yàn)榫幋a過(guò)后的字符串不存在特殊字符。編碼過(guò)后的字符串,在程序中重新被解碼,再拼接成?SQL?攻擊語(yǔ)句,再執(zhí)行,從而形式?SQL?注入。
7、SQL繞過(guò)技術(shù)
??空格字符繞過(guò):兩個(gè)空格代替一個(gè)空格,用?Tab?代替空格,%a0=空格
???????????%20 %09 %0a %0b %0c %0d %a0 %00 /*/ /!*/
???????????select * from users where id=1 /!union//!select/1,2,3,4;
???????????%09 TAB?鍵(水平)
???????????%0a?新建一行
???????????%0c?新的一頁(yè)
???????????%0d return?功能
???????????%0b TAB?鍵(垂直)
???????????%a0?空格
??大小寫(xiě)繞過(guò):將字符串設(shè)置為大小寫(xiě),例如?and 1=1?轉(zhuǎn)成?AND 1=1 AnD 1=1
???????????select * from users where id=1 UNION SELECT 1,2,3,4;
???????????select * from users where id=1 UniON SelECT 1,2,3,4;
??浮點(diǎn)數(shù)繞過(guò)注入:select * from users where id=8E0union select 1,2,3,4;select * from users where id=8.0union select 1,2,3,4;
??NULL?值繞過(guò):select * from users where id=\Nunion select 1,2,3,\N;select * from users where id=\Nunion select 1,2,3,\Nfrom users;
??引號(hào)繞過(guò):如果?waf?攔截過(guò)濾單引號(hào)的時(shí)候,可以使用雙引號(hào)?在?mysql?里也可以用雙引號(hào)作為字符串。select * from users where id='1';select * from users where id="1";
??添加庫(kù)名繞過(guò):
??以下兩條查詢語(yǔ)句,執(zhí)行的結(jié)果是一致的,但是有些?waf?的攔截規(guī)則?并不會(huì)攔截[庫(kù)名].[表名]這種模式。select * from users where id=-1 union select 1,2,3,4 from users;select * from users where id=-1 union select 1,2,3,4 from 123.users;
??去重復(fù)繞過(guò):在?mysql?查詢可以使用?distinct?去除查詢的重復(fù)值。可以利用這點(diǎn)突破?waf?攔截,select * from users where id=-1 union distinct select 1,2,3,4 from users;select * from users where id=-1 union distinct select 1,2,3,version() from users;
??反引號(hào)繞過(guò):在?mysql?可以使用?這里是反引號(hào)?繞過(guò)一些?waf?攔截。字段可以加反引號(hào)或者不加,意義相同。insert into users(username,password,email)values('123','123456','admin@123.com');insert intousers(username,password,email)values('123','123456','admin@123.com')
??雙關(guān)鍵詞繞過(guò):有些程序會(huì)對(duì)單詞?union、?select?進(jìn)行轉(zhuǎn)空?但是只會(huì)轉(zhuǎn)一次這樣會(huì)留下安全隱患。id=-1'union on selselect1,2,3--+到數(shù)據(jù)庫(kù)里執(zhí)行會(huì)變成?id=-1'UNION select1,2,3--+?從而繞過(guò)注入攔截。
??二次編碼繞過(guò):有些程序會(huì)解析二次編碼,造成?SQL?注入,因?yàn)?url?兩次編碼過(guò)后,waf?是不會(huì)攔截的。
文件上傳漏洞
1、漏洞簡(jiǎn)述
文件上傳漏洞是指由于程序員未對(duì)上傳的文件進(jìn)行嚴(yán)格的驗(yàn)證和過(guò)濾,而導(dǎo)致的用戶可以越過(guò)其本身權(quán)限向服務(wù)器上傳可執(zhí)行的動(dòng)態(tài)腳本文件。如常見(jiàn)的頭像上傳,圖片上傳,oa?辦公文件上傳,媒體上傳,允許用戶上傳文件等。
2、文件上傳過(guò)程
服務(wù)器代碼
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "
";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "
";
echo "Type: " . $_FILES["file"]["type"] . "
";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb
";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
}
?>
客戶端:
Filename:
返回值:
0:沒(méi)有錯(cuò)誤發(fā)生,文件上傳成功。
1:上傳的文件超過(guò)了?php.ini?中?upload_max_filesize?選項(xiàng)限制的值。
2:上傳文件的大小超過(guò)了?HTML?表單中?MAX_FILE_SIZE?選項(xiàng)指定的值。
3:?文件只有部分被上傳。
4:?沒(méi)有文件被上傳。
3、文件上傳漏洞預(yù)防
??在網(wǎng)站中需要存在上傳模塊,需要做好權(quán)限認(rèn)證,不能讓匿名用戶可訪問(wèn)。
??文件上傳目錄設(shè)置為禁止腳本文件執(zhí)行。這樣設(shè)置即使被上傳后門(mén)的動(dòng)態(tài)腳本也不能解析,導(dǎo)致攻擊者放棄這個(gè)攻擊途徑。
??設(shè)置上傳白名單,白名單只允許圖片上傳如,jpg png gif?其他文件均不允許上傳
??上傳的后綴名,一定要設(shè)置成圖片格式如?jpg png gif
4、文件上傳的攻擊方法
尋找測(cè)試網(wǎng)站的文件上傳的模塊,常見(jiàn)?頭像上傳,修改上傳,文件編輯器中文件上傳,圖片上傳、媒體上傳等,通過(guò)抓包上傳惡意的文件進(jìn)行測(cè)試,上傳后綴名?asp php aspx?等的動(dòng)態(tài)語(yǔ)言腳本,查看上傳時(shí)的返回信息,判斷是否能直接上傳,如果不能直接上傳,再進(jìn)行測(cè)試上傳突破,例如上傳文件的時(shí)候只允許圖片格式的后綴,但是修改文件時(shí),卻沒(méi)有限制后綴名,圖片文件可以修改成動(dòng)態(tài)語(yǔ)言格式如?php,則可能訪問(wèn)這個(gè)文件的?URL?直接?getshell,可以控制網(wǎng)站。
5、文件上傳漏洞的預(yù)防
服務(wù)器端使用白名單防御,修復(fù)?web?中間件的漏洞,禁止客戶端存在可控參數(shù),存放文件目錄禁止腳本執(zhí)行,限制后綴名?一定要設(shè)置圖片格式?jpg、gif?、png?文件名隨機(jī)的,不可預(yù)測(cè)。
XSS漏洞
1、漏洞簡(jiǎn)介
XSS?攻擊全稱跨站腳本攻擊,是為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫(xiě)混淆,故將跨站腳本攻擊縮寫(xiě)為?XSS,XSS?是一種在?web?應(yīng)用中的計(jì)算機(jī)安全漏洞,它允許惡意?web?用戶將代碼植入到?web網(wǎng)站里面,供給其它用戶訪問(wèn),當(dāng)用戶訪問(wèn)到有惡意代碼的網(wǎng)頁(yè)就會(huì)產(chǎn)生?xss?攻擊。
2、XSS?攻擊的危害包括
1、盜取各類(lèi)用戶帳號(hào),如機(jī)器登錄帳號(hào)、用戶網(wǎng)銀帳號(hào)、各類(lèi)管理員帳號(hào)
2、控制企業(yè)數(shù)據(jù),包括讀取、篡改、添加、刪除企業(yè)敏感數(shù)據(jù)的能力
3、盜竊企業(yè)重要的具有商業(yè)價(jià)值的資料
4、非法轉(zhuǎn)賬
5、強(qiáng)制發(fā)送電子郵件
6、網(wǎng)站掛馬
7、控制受害者機(jī)器向其它網(wǎng)站發(fā)起攻擊
3、xss?漏洞的類(lèi)型
??反射型?XSS:反射型?XSS,非持久化,需要欺騙用戶自己去點(diǎn)擊鏈接才能觸發(fā)?XSS?代碼。反射型?xss?攻擊的方法,攻擊者通過(guò)發(fā)送郵件或誘導(dǎo)等方法,將包含有?xss?惡意鏈接發(fā)送給目標(biāo)用戶,當(dāng)目標(biāo)用戶訪問(wèn)該鏈接時(shí),服務(wù)器將接收該用戶的請(qǐng)求并進(jìn)行處理,然后服務(wù)器把帶有?xss?惡意腳本發(fā)送給目標(biāo)用戶的瀏覽器,瀏覽器解析這段帶有?xss?代碼的惡意腳本后,就會(huì)觸發(fā)?xss?攻擊。
??存儲(chǔ)型?XSS:持久化,代碼是存儲(chǔ)在服務(wù)器中的數(shù)據(jù)庫(kù)里,如在個(gè)人信息或發(fā)表文章等地方,可以插入代碼,如果插入的數(shù)據(jù)沒(méi)有過(guò)濾或過(guò)濾不嚴(yán),那么這些惡意代碼沒(méi)有經(jīng)過(guò)過(guò)濾將儲(chǔ)存到數(shù)據(jù)庫(kù)中,用戶訪問(wèn)該頁(yè)面的時(shí)候,沒(méi)有進(jìn)行編碼過(guò)濾輸出到瀏覽器上,就會(huì)觸發(fā)代碼執(zhí)行,造成?xss?攻擊。
??dom?型?xss:DOM,全稱?Document Object Model,是一個(gè)平臺(tái)和語(yǔ)言都中立的接口,可以使程序和腳本能夠動(dòng)態(tài)訪問(wèn)和更新文檔的內(nèi)容、結(jié)構(gòu)以及樣式。DOM?型?XSS?其實(shí)是一種特殊類(lèi)型的反射型?XSS,它是基于?DOM?文檔對(duì)象模型的一種漏洞。在網(wǎng)站頁(yè)面中有許多頁(yè)面的元素,當(dāng)頁(yè)面到達(dá)瀏覽器時(shí)瀏覽器會(huì)為頁(yè)面創(chuàng)建一個(gè)頂級(jí)的?Document object文檔對(duì)象,接著生成各個(gè)子文檔對(duì)象,每個(gè)頁(yè)面元素對(duì)應(yīng)一個(gè)文檔對(duì)象,每個(gè)文檔對(duì)象包含屬性、方法和事件??梢酝ㄟ^(guò)?JS?腳本對(duì)文檔對(duì)象進(jìn)行編輯從而修改頁(yè)面的元素。也就是說(shuō),客戶端的腳本程序可以通過(guò)DOM?來(lái)動(dòng)態(tài)修改頁(yè)面內(nèi)容,從客戶端獲取?DOM?中的數(shù)據(jù)并在本地執(zhí)行。基于這個(gè)特性,就可以利用?JS?腳本來(lái)實(shí)現(xiàn)?XSS?漏洞的利用。
4、xss?編碼繞過(guò)
??gpc?過(guò)濾字符
???????????如果?gpc?開(kāi)啟的時(shí)候,特殊字符會(huì)被加上斜杠即,'變成' xss?攻擊代碼不要帶用單引號(hào)或雙引號(hào)。
???????????繞過(guò)?gpc?在?php?高?版本?gpc?默認(rèn)是沒(méi)有的,但是開(kāi)發(fā)程序員會(huì)使用?addcslashes()對(duì)特殊字符進(jìn)行轉(zhuǎn)義。
???????????這個(gè)是執(zhí)行不了的
????????????沒(méi)有單引號(hào)可執(zhí)行。
??過(guò)濾?alert
???????????當(dāng)頁(yè)面過(guò)濾?alert?這個(gè)函數(shù)時(shí),因?yàn)檫@個(gè)函數(shù)會(huì)彈窗,不僅很多程序會(huì)對(duì)他進(jìn)行過(guò)濾,而且很多?waf?都會(huì)
???????????對(duì)其進(jìn)行攔截。所以不存在?alert?即可。
??ascii?編碼
????????????
??url?編碼
?????123
??base64?編碼
???????????使用偽協(xié)議?base64?解碼執(zhí)行?xss
?????111