CTFHUB 2017-赛客夏令营-Web-Injection V2.0
程序员文章站
2022-03-09 22:37:51
...
参考:https://blog.csdn.net/Mr_Shiyang/article/details/107974827
登陆页面如图所示
用户登陆两种业务查询方式:
一种是直接对用户输入的账号名和密码进行查询
另一种是针对用户输入的账号名进行查询对应的密码,再和用户输入的密码做比较
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