zl程序教程

您现在的位置是:首页 >  后端

当前栏目

渗透测试-SQL注入之二次注入

注入测试SQL 渗透 二次
2023-09-11 14:15:49 时间

SQL注入之二次注入

前言

一、什么是二次注入和二次编码

简单的说,二次注入是指已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。
网站对我们输入的一些重要的关键字进行了转义,但是这些我们构造的语句已经写进了数据库,可以在没有被转义的地方使用
可能每一次注入都不构成漏洞,但是如果一起用就可能造成注入。

普通注入 (1)在http后面构造语句,是立即直接生效的
(2)一次注入很容易被扫描工具扫描到
二次注入 (1) 先构造语句(有被转义字符的语句)
(2)我们构造的恶意语句存入数据库
(3)第二次构造语句(结合前面已经存入数据库的语句,成功。因为系统没有对已经存入数据库的数据做检查)
(4)二次注入更加难以被发现

二次编码这里没有实验演示,因为靶场没有相应的练习,我简单介绍一下什么是二次编码和原理吧
之所以有二次编码注入,是因为当我们输入%2527的时候,浏览器会 将%25转义为%,之后不再进行编码,所以最后成为了%27,最后让浏览器进行载一次编码,就注入了’ ,之后就可以进行注入了。(%27==')

方法:
在注入点后键入%2527,然后按照正常的注入流程开始注入
测试方法
黑盒测试
在可能的注入点后键入%2527,之后进行注入测试
白盒测试
1.是否使用urldecode函数
2.urldecode函数是否在转义方法之后

二、二次注入

1.二次注入方法

我们用sqil-labs24关进行练习,是一个登录界面,随便登录一个用户admin,出现报错了。是一个登录界面
在这里插入图片描述
我们进行重新创建账号看看,注册admin’#
在这里插入图片描述
在这里插入图片描述
账号注册成功,重置密码成功
在这里插入图片描述
在这里插入图片描述
这是我们看到admin账号的密码变为了1234,原来的admin’#密码重置是从123改为了1234,这就是注入代码后未经过处理,从而被二次利用注入了,原理就是#号后面的内容被注释了,‘与前面的’ 闭合了,就直接上传admin了。

2.二次注入环境搭建获取数据库信息

上面的实验不是很好的表现二次注入的真实环境,我们进行代码进行更改,搭建环境进行更深层的练习。
(1)首先我们把users表中的username字段值变大点,便于我们进行注入语句,在mysql终端进行修改
alter table user change usrename varchar(255) character set gbk collate gbk_chinese_ci not null;
(2)增加userlist.php在sqli-labs中24关的目录下
文件内容如下:

Document <?php include("../sql-connections/sql-connect.php"); error_reporting(0); $sql="SELECT * FROM users ORDER BY id asc"; $result=mysql_query($sql); $num=mysql_num_rows($result); for($j=0;$j<$num;++$j) { $row=mysql_fetch_array($result); $username=$row[1]; $sql_detail="SELECT * FROM users where username='$username'"; $result_detail=mysql_query($sql_detail); $num_detail=mysql_num_rows($result_detail); for($i=0;$i<$num_detail;++$i) { $row_detail=mysql_fetch_array($result_detail); echo <<

?>

(3)进行实验练习,先对userlist的代码进行审计

在这里插入图片描述
发现注入的地方
u s e r n a m e = username= username=row[1];
s q l d e t a i l = " S E L E C T ∗ F R O M u s e r s w h e r e u s e r n a m e = ′ sql_detail="SELECT * FROM users where username=' sqldetail="SELECTFROMuserswhereusername=username’"; //注入信息

在登录界面我们进行注入试试,在注册页面进行注册一个新用户
1’ union select 1,user(),3#
在这里插入图片描述
打开userlist.php
http://192.168.222.4/sqli-labs/Less-24/userlist.php
在这里插入图片描述
发现出现了当前用户的信息
注入原理很简单,就是一下的方法进行注入,根据代码进行注入
$username=1’ union select 1,user(),3#;

$sql_detail=“SELECT * FROM users where username=‘’”;
$sql_detail=“SELECT * FROM users where username=‘1’ union select 1,user(),3#'”;

SELECT * FROM users where username=‘1’ union select 1,user(),3#’
最后执行的就是
union select 1,user(),3#
1,root@localhost,3

最后我们再进行一次注入获取表中的数据,在进行一次注册
1’ union select 1,(select concat(0x7e,username,0x7e,password) from security.users limit 0,1),3#
在这里插入图片描述
成功获取数据信息,实验结束。

总结

本次实验我们介绍了SQL注入的二次注入的原理和方法,如何在登录界面进行二次注入,在白盒测试下,进行代码审计,发现注入方式,学会对二次注入的攻击与利用。