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 |