1.验证方式
通过尝试我们发现存在一个admin用户。当name=admin时回显不是user error而是pass error。
经过一系列尝试,我们发现or,=字符被过滤的但是可以使用大写的OR与like代替=。
还是不能登陆,在报错源码处发现一串码,经过base32,base64解密后为sql语句:
select * from user where username = '$name'
这里的验证方式是将name带入查询再将查询后的密码与输入进行比对。经过常规注入手段我们发现这里有三个字段。
union联合查询在查询不存在的数据时,会创建一个临时数据,然后返回这个临时数据union select 1,2,3,返回数据就为column1:1,column2:2,column3:3。我们可以根据这个特性来猜测user字段的位置。经过猜测我们发现admin在2的位置。
那么猜测3的位置应该就是pass字段并且这里pass应该存储的是MD5值,将123进行MD5加密放到3的位置,这时union select, 1,admin,‘md5(123)’,的返回数据为column1:1,column2:admin,column3:md5(123),并且将返回的md5(123),与我们输入的pass的md5值进行比对如果一样则会登陆成功。这是我们构建payload:
name=1' union select 1,'admin','202cb962ac59075b964b07152d234b70'#&pw=123
成功拿到flag。