sqli-labs靶场实现(十)【二次注入(二阶注入)】(less-24、具体步骤+图文详解)

一)二次注入
1)二次注入介绍
2)二次注入代码分析
3)二次注入利用
4)二次注入危害
5)代码审计

————————————————————————————————————————————————————


一)二次注入

1)二次注入介绍:
sqli-labs靶场实现(十)【二次注入(二阶注入)】(less-24、具体步骤+图文详解)_第1张图片
网站服务器和数据库服务器的交互是一个双向的过程,用户通过浏览器访问网站服务器进行用户注册,注册之后就可以登录网站。此时注册时的信息会进行“注册信息存储”(如:账号、密码),那么也就会存储到数据库服务器中就有了第一个输入。之后我们进行信息修改时也会进行数据库的交互,那么就会将第一次输入的信息提取出来之后进行修改再重新存入数据库,实现第二次输入

以上是正常情况下的信息修改和数据库交互(没有恶意,一般就是登录的密码忘记了),但是如果 攻击者将对应的payload输入到登录框让恶意代码植入数据库并且成功执行,那么这就是一个二次注入漏洞。 简而言之,二次注入是指对已存的数据库内容被读取后再次进入查询语句之后产生的恶意SQL语句

二次注入需要具备的两个条件:

a)用户向数据库插入恶意语句(即使后端代码对语句进行了转义,如mysql_escape_string、mysql_real_escape_string转义)。

b)数据库对自己存储的数据非常放心,直接取出恶意数据给用户。


2)二次注入代码分析:

实现注册的代码:
sqli-labs靶场实现(十)【二次注入(二阶注入)】(less-24、具体步骤+图文详解)_第2张图片
实现密码修改的代码:
sqli-labs靶场实现(十)【二次注入(二阶注入)】(less-24、具体步骤+图文详解)_第3张图片
从代码中可以知道,此时如果在修改密码的框中构造payload:其中用户名假如是admin,我们将单引号闭合再结合 – 注释符将后面的password注释掉那么就变成了:username='admin'--+ 此时 ' and password='$curr_pass' " 都无效了。那么此时只要指定表users中的所有为admin的用户名的密码都会被修改为我们修改的新密码。

3)二次注入利用:

实现流程:

1)访问存在SQL二次注入的网站,并且已知此网站中一个真正存在的用户名:admin;
2)进入登录界面进行注册:用户名:admin'-- -,密码:1234563)用新注册的用户和密码登录网站;
4)点击“忘记密码”对我们注册的用户名:admin'-- - 进行密码修改:12345)此时如果网站中原本的admin用户使用此用户名和原本他自己设置的密码进行登录时,会显示密码错误,因为此时admin用户的密码已经被修改为1234了。

sqli-labs靶场实现(十)【二次注入(二阶注入)】(less-24、具体步骤+图文详解)_第4张图片
users表中存在一个用户名和密码均为admin的用户,此时我们访问网站,注册一个新的用户:
sqli-labs靶场实现(十)【二次注入(二阶注入)】(less-24、具体步骤+图文详解)_第5张图片
确定新建用户的用户名和密码(admin’-- -或者admin’#或者admin’–+):
sqli-labs靶场实现(十)【二次注入(二阶注入)】(less-24、具体步骤+图文详解)_第6张图片
此时再次查看user表中的数据会发现admin’-- -用户出现了(第一次输入):
sqli-labs靶场实现(十)【二次注入(二阶注入)】(less-24、具体步骤+图文详解)_第7张图片
此时使用admin’-- -用户名和对应密码就登录了,但我们的重点操作是接下来通过忘记密码开始利用:
sqli-labs靶场实现(十)【二次注入(二阶注入)】(less-24、具体步骤+图文详解)_第8张图片
sqli-labs靶场实现(十)【二次注入(二阶注入)】(less-24、具体步骤+图文详解)_第9张图片
将admin’-- -用户的密码进行修改(第二次输入
sqli-labs靶场实现(十)【二次注入(二阶注入)】(less-24、具体步骤+图文详解)_第10张图片
在这里插入图片描述
此时再次查看user表中的数据会发现admin’-- -用户它的密码并没有改变,但是admin用户的密码却变了:
sqli-labs靶场实现(十)【二次注入(二阶注入)】(less-24、具体步骤+图文详解)_第11张图片

5)代码审计:

注册用户时,网站出现问题的页面很显然是注册页面,与密码修改重置页面。他们仅对特殊字符进行了转义,判断输入两次密码是否一致,然后将用户键入,将数据插入至数据库: $sql = "insert into users ( username, password) values(\"$username\", \"$pass\")"。当攻击者直接输入构造的payload进行修改密码:

$username= $_SESSION["username"];//直接取出了数据库的数据
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";//对该用户的密码进行更新
$sql = "UPDATE users SET PASSWORD='12345678' where username='admin‘#


4)二次注入最常见的危害:

a)构造payload触发二次SQL注入;
b)构造payload触发XSS攻击;





你可能感兴趣的:(sqli-labs靶场)