SECCON 2017 Web WP

World 21st 辛苦队内唯一的pwn手了

SqlSrf

给了backup文件

密码加密存储在sqlite数据库中, 但是仔细看一下可以发现可以加密也可以解密, username处填写admin在返回头的remember处找到加密后的字符串58474452dda5c2bdc1f6869ace2ae9e3, 然后用'union select '58474452dda5c2bdc1f6869ace2ae9e3'--+, 密码填admin可以登录, 登录后发现wget的命令需要用admin登录才能使用, 而用户名由我们输入的参数决定, 所以无法绕过, 只能注出admin密码, sqlite可以用and 1 and 1=randomblob(300000000)--+进行时间盲注, 得到admin密码后扔进cookie中的remember解密, 然后进入ssrf部分

因为题目描述中提示我们要发邮件给root, 同时服务器上也存在127.0.0.1:25, 所以需要用这个ssrf来给root发送一封邮件

只有一个wget, 并且定义了协议为http: ,最开始想通过302跳转来使用任意协议, 但是发现wget只支持http(s)和ftp(s)

最后是找到wget可以CRLF, 用127.0.0.1%0d%0aHELO admin%0a:25可以发现执行了HELO admin的邮件发送命令

只需要依次布置邮件发送命令就可以了

需要url编码发送内容, 在邮箱中收到加密的flag, 按照解密密码的方式解出

Log search

题目是elasticsearch制作的log搜索系统, 支持lucene语法

最开始没接触过这种东西, 所以非常迷茫, fuzz一下发现许多字符都会报错, 例如不匹配的 ” { 以及 + – : 等,

后面发现可能是elasticsearch的simple_query_string语句

在中文文档中可以找到

同时注意到log中很多flag-xxxxx.txt文件, 但是访问都返回404, 猜测可能flag在其中某一个返回200的txt中

结合lucene的语法 用+request:flag +response:200可以筛选出返回为200并且包含flag的log, 但是仍然有许多logsearch.php?flag-xxxx.txt的脏数据, 需要把logsearch.php筛选掉: +request:flag +response:200 -request:logsearch.php

同时有些奇怪的地方, simple_query_string支持正则表达式, 用形如+response:/2../的payload可以筛选出返回为2XX的log, 但是用在request中用来筛选/flag-.{32}.txt/ 就不行

Automatic door

给了phpinfo, 给了代码:

首先是任意文件读取, 读取../../../../../../../../etc/apache2/apache2.conf, diff发现只有一个allow override all与自己的不同, 想到通过.htaccess设置

把.lilac后缀的文件解析成php

写好shell以后发现phpinfo中disable了许多系统调用函数,

很快发现没有禁用proc_open, 用在ph师傅那找到的proc_open反弹shell脚本可以反弹shell:

Theory of Relativity

赛中由队友做出

从题目描述可知这是一个字节码解释器, 我们上传一个脚本由他执行, 如果执行时间超过100s就可以拿到flag

看到取得flag处的代码:

需要在stderr中构造一个单独的行, 并且匹配parse_time中的正则, 才能使得time大于100

所以首先需要一个可控的报错, 并且报错中可以生成单独的一行

在 sub 和 add 两个指令中, 如果后两个操作数分别为int和str的话, 就会把两个操作数的内容带入到stderr中

但是我们需要生成单独一行, 这里容易想到用\n来另起一行

于是payload:

 

最后

TCW联队收dalao, 目前由哈工大 + 中科大 + 合工大组成, 队内有Web dalao, 密码学公主, misc王子, reverse之神和神秘无敌全能王