35C3-POST
扫描目录得到uploads目录,测试目录穿越成功,得到nginx备份文件和源码
1 | server { |
由于 url 没加后缀 /,而 alias 设置了有后缀 / 配置,导致可以利用 ../ 绕过限制访问目录。
db.php
1 |
|
default.php
1 |
|
post.php
1 |
|
可以发现DB
类的query
方法把接收sql
语句后把执行结果丢给了retrieve_values
方法,而该方法存在一处反序列化操作,且要求反序列化字符串开头为$serializedobject$
在 mssql 中,MSSQL会自动将全角unicode字符转换为ASCII表示形式,$s℮rializedobject$ 入库后会变成 $serializedobject$ ,注意前者的℮不是 ASCII 的 e,整个字符串的 16 进制如下,可见前者的℮的 hex 是 E284AE,而后者 e 的 ASCII 是 0x65
根据post.php,可以通过SoapClient通过SSRF打MSSQL,前提是要能够触发它的
call方法。
类
Attachment的
tostring方法中有一个
$this->za->open操作,我们将
SoapClient序列化为
$za,然后触发其
__tostring`方法即可SSRF。
而default.php
中实例化了Post
类,把$_POST["title"], $_POST["content"], $attachments
传了进去,并调用了save
方法
然后又调用loadall()
方法执行数据库查询操作,此时会将返回值开头为$serializedobject$
的字符串进行反序列化操作并将返回的值打印触发Post
类的__toString
方法,而返回值含有反序列化对象,因此又可以触发反序列化对象的__toString
方法,从而可以SSRF。
exp:
1 |
|
由Nginx配置文件可知,miniProxy代理监听在本地的8080
端口,且只接收Get请求,而SoapClient
发送的是POST请求。
得知SoapClientl
的_user_agent
属性存在CRLF注入,我们可以通过\r\n
再注入一个GET请求。
另外miniProxy
只能代理 http / https
请求,可以通过gopher:///
绕过,因为miniProxy仅在设置host
时验证http / https
。或者可以重定向到一个gopher请求
来绕过。
gopher会在请求后加上一个\r\n
,因此构造gopher请求时要在sql语句后加一个注释符-- -
, 通过插入DEBUG
头我们可以获取到我们的UID
exp:
1 | import requests |