AceBear Security Contest-部分Web-writeup
Urlparameter
题目
|
|
Solution
存在robots.txt: http://35.196.45.11:8080/robots.txt
访问: http://35.196.45.11:8080/?debug 获得源码:
可以看到,在检测时使用了$_SERVER["REQUEST_URI"]
以及黑名单,接着的获取则使用了$_GET
。在php手册中:
也即 $_GET
会对传入的参数先进行了一次urldecode(),之后再返回,而$_SERVER["REQUEST_URI"]
会直接返回。所以访问:
对于$_SERVER["REQUEST_URI"]
,值为syste%6d
,绕过了黑名单检测。对于$_GET
,则为system
,最后实际实行的即为system("ls")
。
|
|
关于接受query-string与编码的问题,可以看看这篇:Request URI, Query String and URL encoding
BearShare
题目
|
|
Solution
先简单的过一下功能。在 http://35.198.201.83/index.php 页面,你可在Your private message
处填入信息,然后页面返回信息保存的位置(stored at server)以及相应的id。
在 http://35.198.201.83/download.php 页面,你可以选择server,并填入相应的id,然后读出之前存入的信息。页面返回的是一个html页面代码。
经过探测发现有robots.txt,
访问 http://35.198.201.83/backup_files ,获得index.txt与download.txt,它们分别是index.php与download.php的源码。部分关键代码如下
index.php:
download.php
接下来审计一波。可以看到flag在:
在此之前,经过了validate_hash()的验证,会将传入的$_POST['storagesv']
进行hash_hmac
操作,将得到的$final_hash
进行比较,即比较条件为:
在这个比较条件中,$S_KEY
是定义在config.php是未知的,但我们有三个参数可控。hash_hmac使用 HMAC 方法生成带有密钥的哈希值,例如此处使用了sha256算法。我们知道在php中md5算法、sha256算法等无法处理数组,这个trick通常来绕过if(@md5($_GET['a']) === @md5($_GET['b']))
,因为当传入参数为数组时,返回值是NULL,造成了NULL===NULL
|
|
所以我们传入$_POST['nonce']
为nonce[]=1
,则此时比较条件变为:
此时我们即可伪造hash和storagesv了,
BearShare level 2
题目
|
|
Solution
这题的连接和前面一样,我们继续在前面的源码上进行探索。在download.php 中有这样一部分代码:
根据我们传入的参数,构造$url
,然后控制$BROWSER_BOT
去访问http://route.local/?url=urlencode($url)
对应的页面,然后将结果输出。这也解释了为什么前面读取信息时返回的是一个html页面代码,而不是仅仅一条信息。由于这里使用了escapeshellarg,单引号无法逃逸,因此任意命令执行时不存在的。结合代码功能,我们猜想SSRF攻击。
结合这个比赛的“特点”,比如第一题和第二题的信息都是从robots.txt里泄露的,所以我们尝试访问内网的robots.txt,也即我们尝试请求:
利用前面的脚本更改一下storagesv的值以及对应hash,绕过判断以及die语句。构造参数:
|
|
当url接收到对应的参数时,会通过重定向将flag发出去。借鉴第一题,如果我们传入%2568ttp://
,即可绕过filter。最终payload: