2017-赛客夏令营-Web-Injection V2.0

题目链接
2017-赛客夏令营-Web-Injection V2.0登陆页面如图所示

用户登陆两种业务查询方式:
一种是直接对用户输入的账号名和密码进行查询

另一种是针对用户输入的账号名进行查询对应的密码,再和用户输入的密码做比较
2017-赛客夏令营-Web-Injection V2.0

2017-赛客夏令营-Web-Injection V2.0

step1:

开始输入username=1,admin=1,提示用户名不存在,第二次输入admin:1
提示密码错误,那么我们可以确定应该是第二种业务查询模式,否则应当响应用户名或密码输入错误

第一想法尝试**数据库,找到flag,输入各种提交参数都被过滤了,响应中提示hack。

逐一尝试过滤的参数:(),space, ’ , " , ‘+’, ‘/’,union,order,or,and等等,注意逐一测试时不要引进其他非法参数,遵循单一变量原则

尝试空格,括号,加号都被 过滤,其他没有被过滤

既然括号被过滤了,那么想要**数据库就不可能了,各种**语句都离不开(),也没有过滤()的方法,所以**就不可行

step2

既然**不可行,我们就尝试登陆吧,根据代码逻辑
select password from xx where username=xx;
if(password==pass)
then login

关键要构造两次密码是一样的,那么就需要第一次从数据库查询的密码和我们输入的密码结果一样,联合查询没被过滤,那么我们可以构造联合查询,
并且用/**/过滤空格,查询时让用户名为false,使得查询语句的结果是我们输入的密码。
因为不知道admin的闭合方式是双引号闭合还是单引号或者是其他方式,所以需要逐一尝试

payload:
双引号闭合
user=aadmin’/**/union/**/select/**/1/**/or/**/“1”="1&pass=1

单引号闭合
user=aadmin’/**/union/**/select/**/1/**/or/**/‘1’='1&pass=1

最终得到的payload是单引号闭合那一条
2017-赛客夏令营-Web-Injection V2.0