个人声明:
本人纯小白,对于专业词汇可能表达不清,本文章仅展示个人思路,如有雷同,纯属巧合(若有借鉴思路的,会说明)。若有错漏,麻烦指正,谢谢。
题目来源:
CTF²https://ctf2.dasctf.com/dashboard/practice/b9bbb32f-f186-458f-b90b-12440c0f6aea?returnTo=%2Fdashboard%2Fpractice%3Fview%3Dmy&tab=challenges&challenge=d4109092-2acc-4f56-a9c6-d75c230d501b首先,打开靶场,是一个登录页面
根据我们的经验,这类登录类页面先尝试万能密码
下面解释一下何为万能密码(以下为个人思考,仅提供理解帮助,表述可能有问题)
(已经知道的,可以看===下面的解题内容)
=========================================================================
万能密码形式是:' or 1=1#
1、先闭合单双引号如果是数字型则不用闭合
2、'or'使得原sql命令查询结果可以以我们后面输入的命令判断返回结果
3、1=1,构造一个ture的结果
4、'#'注释后面的命令
详细原理是:
一般来说,这类网页后台命令格式为
SELECT * FROM user WHERE username='' AND password='';
当我们输入username=' or 1=1#(password输入什么都可以)
命令变成:
SELECT * FROM user WHERE username='' or 1=1#' AND password='xxx';
首先#后面的被注释了,命令变成
SELECT * FROM user WHERE username='' or 1=1
然后数据库会先对where后面的限定条件进行判断
username='' 返回false
or
1=1 返回ture
所以结果为ture
命令变成:
SELECT * FROM user
然后返回默认返回所查询表的第一个数据
若是该表的第一个数据是admin的信息,则登录admin
这里补充一下,如果是正常登录,比如$user=xiaoming&$passwd=123456
命令会是
SELECT * FROM user WHERE username='xiaoming' AND password='123456';
此时才会特定查询username='xiaoming' AND password='123456'的内容
上面使用万能密码之后是直接将where后面的内容变成了ture,没有限定条件了
=========================================================================
使用最基本的' or 1=1#尝试绕过,成功绕过,得到flag