SQL二次注入详解

今天继续给大家介绍Linux运维相关知识,本文主要内容是SQL二次注入。

免责声明:
本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负!
再次强调:严禁对未授权设备进行渗透测试!

一、SQL二次注入原理

SQL二次注入,指的是在有些应用场景下,我们先把SQL注入的payload写入到目标站点数据库中,然后再在某些实际将该数据取出,使得我们写入的payload执行。
因此,SQL二次注入一般分为2步,第一步即向目标站点的数据库中插入恶意数据,第二步即使得我们插入的恶意数据被目标站点所引用。
SQL二次注入的实现,在第一步要求我们插入的恶意数据能够成功写入到目标站点的数据库中,站点可以对我们写入的恶意数据进行转义,但是数据本身不会被修改,也不会因为恶意的数据而拒绝我们的写入;第二步要求我们的恶意数据能够在某种应用场景下取出,并且不会对其站点内部的数据进行检验。

二、SQL二次注入靶场介绍

我们使用sqli_lab的第24关作为SQL二次注入的靶场,该靶场打开后如下所示:
在这里插入图片描述
从上图中可以看出,该靶场是一个登录框,并且支持忘记密码和新注册用户的功能。登录成功后如下所示:
在这里插入图片描述
该靶场的漏洞,存在于修改密码处,我们打开密码修改的php文件pass_change.php,如下所示:
在这里插入图片描述
注意到上图中红框里面,代码对curr_pass、pass和re_pass都使用mysql_real_escape_string函数进行了过滤,但是并没有对username参数进行过滤。
username直接拼接到了后面的sql执行语句中,这样,我们在修改密码处就存在SQL二次注入的漏洞。

三、SQL二次注入实战

下面,我们就来进行SQL二次注入的实战,首先,我们先注册一个用户admin’#,如下所示:
在这里插入图片描述
这时,我们可以查看一下当前的数据库,如下所示:
在这里插入图片描述
接下来,我们选择修改admin’#用户的密码,如下所示:
在这里插入图片描述
此时,我们点击Reset重置密码后,我们的sql语句为:

UPDATE users SET PASSWORD='$pass' where username='admin'# and password='$curr_pass'

可以看到,我们的用户后面的单引号恰好闭合了该字段前面的单引号,而#又过滤了后面的所有内容。这样,我们实际上就实现了给admin用户修改密码,修改完成后的页面如下所示:
在这里插入图片描述
完成后的数据库如下所示:
在这里插入图片描述
原创不易,转载请说明出处:https://blog.csdn.net/weixin_40228200

猜你喜欢

转载自blog.csdn.net/weixin_40228200/article/details/125984960