1. WarmUp

1. 整体流程

  1. 查看网页源代码,得到hint:source.php
  2. 访问source.php得到另一个白名单文件:hint.php
  3. phpmyadmin4.8.1文件包含漏洞读取flag

2. 题目分析

phpmyadmin4.8.1文件包含漏洞
漏洞环境 https://github.com/vulhub/vulhub/blob/master/phpmyadmin/CVE-2018-12613/README.zh-cn.md
产生漏洞原因:

$_page = mb_substr($page, 0, mb_strpos($page.'?', '?'));
if (in_array($_page, $whitelist)) {
    return true;
}

$_page = urldecode($page);
$_page = mb_substr($_page, 0, mb_strpos($_page . '?', '?'));
if (in_array($_page, $whitelist)) {
    return true;
}

代码目的是判断?后所跟文件名是否在白名单。但他做了两次判断,且使用了urldecode函数。所以可以将?编码两次放入url,在经过decode之后就会识别这个?后面的文件,即造成了文件包含漏洞。
payload: http://example.com/source.php?file=source.php%253f../../../../../ffffllllaaaagggg

2. admin

1. 整体流程

  1. 测试功能点有如下功能

    • 注册 登录 登出
    • 发送消息
    • 更改密码
  2. 在index界面查看源代码,得到hint <!-- you are not admin -->
  3. 又因为有更改密码操作,联想到更改密码的漏洞
  4. 在更改密码界面查看源代码,得到hint <!-- https://github.com/woadsl1234/hctf_flask/ -->
  5. 这是这道题目的源代码,分析源代码,找到漏洞点,利用漏洞点得到flag

2. 题目分析

从得到的题目源代码出发
index.html 找到flag点

index.html

访问index页面时,会先判断session中的name参数的值是否为admin,若为admin则给出flag。
1.在题目给了源代码的情况下,可以伪造session(在config.py中找到secrect key)。

2.又因题目给了发送信息模块,又思考能否通过xss盗取admin的cookie

xss1.png

xss2.png

从源代码可以看到,post发送的消息并没有admin用户接收,所以xss这条路不通。

3.那么除了伪造session,还有没有更容易操作的方法去伪造admin登录呢。
仔细分析源码,发现在 route.py 第106行定义了一个函数 strlower(username)

strlower.png

nodeprep.prepare 会对unicode字符进行处理,处理规则如下

ᴀ -> A -> a

先将unicode字符转为正常字母,再将字母变为小写。
那么此时,若我们注册的时候,注册用户名为 ᴀdmin,则会调用strlower函数,将用户名变成 Admin

register.png

若我们更改该账户密码,则在更改密码时会再次调用strlower函数,此时我们修改的用户密码就不是 Admin 的用户密码,而是 admin 的用户密码了。

change.png

利用修改的密码,就可以直接登录 admin 账户,拿到flag。

Last modification:January 29th, 2020 at 05:56 pm
给肥宅一点零花钱买可乐叭 (゜-゜)つロ