系列文章目录
iwebsec靶场 SQL注入漏洞通关笔记1- 数字型注入_mooyuan的博客-CSDN博客
iwebsec靶场 SQL注入漏洞通关笔记2- 字符型注入(宽字节注入)_mooyuan的博客-CSDN博客
iwebsec靶场 SQL注入漏洞通关笔记3- bool注入(布尔型盲注)_mooyuan的博客-CSDN博客
iwebsec靶场 SQL注入漏洞通关笔记4- sleep注入(时间型盲注)_mooyuan的博客-CSDN博客
iwebsec靶场 SQL注入漏洞通关笔记5- updatexml注入(报错型盲注)_mooyuan的博客-CSDN博客
iwebsec靶场 SQL注入漏洞通关笔记6- 宽字节注入_mooyuan的博客-CSDN博客
iwebsec靶场 SQL注入漏洞通关笔记7- 空格过滤绕过_mooyuan的博客-CSDN博客
iwebsec靶场 SQL注入漏洞通关笔记8- 大小写过滤注入_mooyuan的博客-CSDN博客
iwebsec靶场 SQL注入漏洞通关笔记9- 双写关键字绕过_mooyuan的博客-CSDN博客
iwebsec靶场 SQL注入漏洞通关笔记10- 双重url编码绕过_mooyuan的博客-CSDN博客
iwebsec靶场 SQL注入漏洞通关笔记11-16进制编码绕过_mooyuan的博客-CSDN博客
iwebsec靶场 SQL注入漏洞通关笔记12-等价函数替换绕过_mooyuan的博客-CSDN博客
目录
前言
打开靶场,url为 http://192.168.71.151/sqli/13/index.php 如下所示是一个注册界面,参数为用户名、密码和邮箱,源码猜测是SQL insert语句,将其插入到数据库的某个表中。
点击通过邮箱找回密码进入如下界面,根据功能应该是通过邮箱找到用户名和密码,并展示出来
一、二次注入
1.漏洞原理
SQL二次注入漏洞指已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。相对而言这是一种较难发现的SQL安全漏洞形式。
2.漏洞原因
造成二次SQL注入漏洞的原因如下:网站对在第一次进行数据库插入数据的时候,仅仅只是使用了 addslashes 或者是借助 get_magic_quotes_gpc 对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身还是脏数据(恶意构造的SQL语句)。
3.二次注入思路
1.黑客通过insert语句功能的web环境构造构造二次注入命令,在浏览器或者其他软件中提交HTTP数据报文请求到服务端进行处理,提交的数据报文请求中可能包含了黑客构造的SQL语句或者命令。
2.服务端应用程序会将黑客提交的数据信息进行存储,通常是保存在数据库中,保存的数据信息的主要作用是为应用程序执行其他功能提供原始输入数据并对客户端请求做出响应。
3.黑客在查询功能的web环境中再次向服务端发送第二个请求数据信息。
4.服务端接收到黑客提交的第二个请求信息后,为了处理该请求,服务端会查询数据库中已经存储的数据信息并处理,从而导致黑客在第一次请求中构造的SQL语句或者命令在服务端环境中执行,从而形成二次注入攻击。
5.服务端返回执行的处理结果数据信息,黑客可以通过返回的结果数据信息判断二次注入漏洞利用是否成功。
二、源码分析
1.注册界面index.php
本关卡的源码如下,index.php包含注册功能,在注册insert的SQL语句调用前,可以看到对用户名、密码和邮件均调用了addslashes函数进行处理,这是二次注入漏洞存在的条件之一。
关于注册过滤的相关源码如下所示
$username=addslashes($_POST['username']);
$password=addslashes($_POST['password']);
$email=addslashes($_POST['email']);
$sql="INSERT INTO `sqli` (`username` ,`password` ,`email`) VALUES ('$username', '$password', '$email');";
$row = mysql_query($sql);
if($row){
echo "<script>alert('注册成功')</script>";
}else{
echo "<script>alert('注册失败')</script>";
}
基于二次注入的条件,由于参数username、password和email均有addslashes处理,那么在逻辑上我们 三处都可以使用万能注入语句' or 1=1 # 进行尝试。不过到底选择使用哪个,我们还要分析找回邮箱部分的源码,以确定到底使用哪个注册参数作为二次注入的点。
2.找回密码 reset.php
找回密码的reset.php的源码如下所示,功能为先通过邮箱查询到用户名,再根据用户名把密码输出出来,于是与注册源码结合,就可以判断出来username为二次注入点。
相关基于SQL处理流程部分源码如下所示
if($_POST['sub']){
$email=addslashes($_POST['email']);
$sql="select * from sqli where email='{$email}'";
$row=mysql_query($sql);
if($row){
$rows = mysql_fetch_array($row);
$username=$rows['username'];
$sql2="select * from sqli where username='$username'";
$row=mysql_query($sql2) or die(mysql_error());
$rows = mysql_fetch_array($row);
if($rows){
echo "<center><h4>您的用户名是 ".$rows['username']."</h4><br>";
echo "<center><h4>您的密码是 ".$rows['password']."</h4><br>";
}else{
echo "<script>alert('邮箱不存在')</script>";
}
}
3.确定渗透目标
根据源码我们可以判断使用的是sqli表的内容,那么进入到iwebsec的docker容器环境中,执行如下命令来获取到iwebsec数据库中sqli表的内容
mysql -u iwebsec -p # 输入密码iwebsec
use iwebsec
select * from iwebsec
如下图所示,红框中admin账号的密码就是我们想通过SQL注入爆出来的内容,也是我们打算渗透的内容
4.二次注入渗透分析
先来考虑一下到底我们想爆出admin账户的密码,就是需要利用找回密码界面的SQL语句,将username作为二次注入点
select * from sqli where username='$username'
如上所示,此SQL语句的闭合方式为单引号,我们的目标是admin账号,那么构造SQL注入语句,此时username可以为如下内容(其中#和--空格为注释)
admin'#
admin'-- -
这时候我们再回到注册界面的SQL语句,由于username参数在SQL调用前执行了addslashes函数处理,那么我们如果在注册时username就构造为万能注入语句(admin'# 或者admin' -- -),就可以保存到数据库的sqli表中,从而形成二次注入
$username=addslashes($_POST['username']);
$password=addslashes($_POST['password']);
$email=addslashes($_POST['email']);
$sql="INSERT INTO `sqli` (`username` ,`password` ,`email`) VALUES ('$username', '$password', '$email');";
三、渗透获取admin账号密码
1.注册
在注册界面usernmae处填精心构造的
amdin'#
密码则随意填写,邮箱填ljn,接下来进行注册
点击注册后,提示注册成功
这时候我们在MySQL数据库里查询,可知注册成功
2.获取admin密码
进入找回邮箱界面,输入刚刚注册admin'#账号时填写的邮箱ljn,点击OK后爆出了admin账号的用户名和密码,如下所示渗透成功
四、渗透获取user1账号密码
1.注册
为了与获取admin做区分,这次使用--空格的方式构造注入语句,用户名填user1-- - 密码随意,邮箱填llllll
点击注册后提示如下
注册成功后数据库信息如下所示
2.找回密码
进入密码找回界面输入llllll
输出user1账号的用户名和密码pass1
总结
SQL二次注入主要分析几个内容
(1)注入点是什么?iwebsec的第13关关卡的注入点为username
(2)注入点闭合方式与注入?这部分是普通的字符型注入,闭合方式为单引号
(3)是否满足二次注入?很明显通过源码分析符合二次注入条件
了解了如上信息就可以针对性进行SQL二次注入渗透,构造二次注入的语句,从而成功的爆破到想要的账号的密码。