安恒杯12月赛ezweb2(cookie)

题目给了一个html5网站。表面是静态页面,通过扫描器发现有php文件。并且发现admin.php后台管理入口。但是访问后提示不是管理员。此外还有config.php文件(访问为空)。
同时扫描发现备份文件.DS_store,但是用工具恢复后发现template文件里admin.html文件,里面有php代码可以命令执行,但是并能实际执行命令。
前端静态网页有目录遍历,但是不能进行目录穿越。

入手点应该在cookie。进入主页时通过抓包就应该发现cookie有一个user段

经过base64解码为user=user。于是尝试改为admin并编码提交会自动跳转到admin.php。然后有一个命令执行。
利用linux中$IFS代替空格的小技巧执行命令获得flag

陷入的误区:
1、对于cookie内容不注意,认为是一般字段
2、过于依赖扫描器,比如虽然扫到了admin.php,只顾对这个文件自身的操作。
3、另外直接从admin.php抓包修改cookie再重放并不能进入后台,必须要从其它界面跳转时cookie就已经修改好了才能成功。

下面研究一下原因:
直接访问的请求包

1
2
3
4
5
6
7
8
9
10
GET /admin.php HTTP/1.1
Host: 101.71.29.5:10001
Proxy-Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36
DNT: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=oe75gva491l236dgehr6jojpt3; user=dXNlcg%3D%3D

正常浏览跳转的请求包

1
2
3
4
5
6
7
8
9
10
11
GET /admin.php HTTP/1.1
Host: 101.71.29.5:10001
Proxy-Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36
DNT: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=oe75gva491l236dgehr6jojpt3; user=dXNlcg%3D%3D

二者就差在一个字段:Cache-Control:max-age=0
当把第一个加上这个的时候就可以了。原因就在于 这个字段控制缓存,而cookie存在cookie里,max-age=0 则是使缓存失效,也即执行我抓包修改的cookie而不是前一个界面的cookie。
直接访问admin.php改包失败就是因为之前已经有缓存cookie了,我们的改包并没有生效。