[极客大挑战 2019]EasySQL

发布时间 2023-07-14 22:40:48作者: y0Zero

[极客大挑战 2019]EasySQL

题目来源:buuctf

题目类型:web

涉及考点:SQL注入

  1. 先看题目,给了两个输入框:

image-20230714215235773

  1. 随便输入几个数进去,例如username=123,password=123:

image-20230714215328636

  • 页面回显说是错误的用户密码,但注意到url中采用的是get传参:

image-20230714215504563

  1. 下一步寻找注入点,我们可以假设数据库中的查询语句为:
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传入,发现页面确实有报错回显:

image-20230714221302731

且报错信息与我们预测的一致。

在注入的过程中,会遇到很多奇怪的闭合,大家可以多多尝试

假设此处我们构造的是双引号的闭合,例如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. 确定了password为注入点后,我们把username的闭合去掉,在password最后加上注释符号,将后续内容给注释掉,避免报错。最终构造的payload如下:
select * from user where username='1' and password='1' or 1=1#' ....(后续内容);

将其传入得到flag:

image-20230714222135769

flag{594f938c-a447-4a3b-a595-2d93ac20a30b}

日期:2023.7.14

作者:y0Zero