目录

1、原理

二次注入的过程

2、实验过程

(1)查看初始 users 表

(2)注册用户

(3)修改用户密码

3、原因

具体代码

4、防御措施


1、原理

二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到 SQL 查询语句所导致的注入。防御者可能在用户输入恶意数据时,对其中的特殊字符进行了转义处理;但在恶意数据插入到数据库时,被处理的数据又被还原并存储在数据库中,当 Web 程序调用存储在数据库中的恶意数据并执行 SQL 查询时,就发生了 SQL 二次注入。

二次注入的过程

(1)先构造语句(此语句含有被转义字符的语句,如 mysql_escape_string、mysql_real_escape_string 转义)

(2)将我们构造的恶意语句存入数据库(被转义的语句)

(3)第二次构造语句(结合前面已被存入数据库的语句构造。因为系统没有对已存入的数据做检查,成功注入)

2、实验过程

以 sqli-labs less 24 为例

(1)查看初始 users 表

发现初始 users 表中账号 admin 的密码为 admin

(2)注册用户

在网站注册名为 admin'-- - 密码为 123456 的用户

注册用户的主要代码如下:

if (isset($_POST['submit']))
{$username=  mysql_escape_string($_POST['username']) ;$pass= mysql_escape_string($_POST['password']);$re_pass= mysql_escape_string($_POST['re_password']);//对注册账号时输入的数据进行转义    echo "<font size='3' color='#FFFF00'>";$sql = "select count(*) from users where username='$username'";$res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( ');$row = mysql_fetch_row($res);if (!$row[0]== 0) {?><script>alert("The username Already exists, Please choose a different username ")</script>;<?phpheader('refresh:1, url=new_user.php');} else {if ($pass==$re_pass){$sql = "insert into users ( username, password) values(\"$username\", \"$pass\")";//创建账号的代码mysql_query($sql) or die('Error Creating your user account,  : '.mysql_error());.........

我们可以在该 php 文件末尾中添加一句代码,在网页中打印出创建的用户名。把自动跳转页面的代码注释,方便查看效果。

echo "Hint: The Query String you input is escaped as : ".$username ."<br>";

可以发现此时的用户名 admin'-- - 的单引号已被转义,不能在注册用户时就直接进行 sql 注入,只能进行二次利用,去实现 sql 注入获取数据。

(3)修改用户密码

我们先查看一下此时的 users 表,发现多了一个用户 admin'-- -,而不是刚刚网页打印出来的 admin\'-- -,这是因为创建用户的代码只是在单引号前加了一个 \ ,使得在执行的时候单引号被认为是字符串里的一个字符,而不是被当成 sql 语句中的单引号。

修改用户 admin'-- - 的密码

再一次查看 users 表,发现用户 admin‘-- - 的密码并没有被修改,而是用户 admin 的密码被修改了。于是我们就有了 admin 的账户密码。

3、原因

在网站设计时,虽然过滤了注册的信息,把特殊字符进行了转义,但是在从数据库调用从外部保存下来的数据时,并没有进行过滤,使得“admin'-- -”被代入到 sql 语句执行,执行了这段 payload,达到了修改用户 admin 的密码的目的

具体代码

#原语句
UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' #插入 payload 后的语句
UPDATE users SET PASSWORD='$pass' where username='admin'-- -' and password='$curr_pass'
#此时 'admin' 后的语句被注释#真正的生效的语句
UPDATE users SET PASSWORD='$pass' where username='admin'
#从而达到了修改用户 admin 密码的目的

4、防御措施

(1)对外部提交数据谨慎

(2)从数据库取数据时,不能轻易相信查询出的数据,要做到同样的转义或是甄别

参考链接:SQL注入---二次注入_selecthch的博客-CSDN博客_二次注入

SQL 注入之二次注入相关推荐

  1. SQL注入之二次注入(sql-lab第24关)

    什么是二次注入 二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入.防御者可能在用户 输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插 ...

  2. 【sql注入】二次注入

    原文地址 [sql注入]二次注入 – Yoyo&Kiki's Blog (mylovekiki.top) 注入原理 攻击者构造恶意的数据并存储在数据库后,恶意数据被读取并进入到SQL查询语句所 ...

  3. 编解码注入、二次注入、DNSlog盲注

    1.编解码注入 靶场 sqlilabs-Less21 登录后,使用bp抓包 分析源码: 发现,如果正确登录,就会设置一个cookie,并且使用base64编码 分析cookie: 发现此处可以进行co ...

  4. php sql 二次注入,espcms 二次注入一枚

    Author:Yaseng 1:通过 $alias 二次注入来控制sql 用户昵称 $alias 从数据库查询出来 未过滤 interface/member.php [php] $db_sql = & ...

  5. (17)网络安全:cookie注入、二次注入、DNSlog注入、中转注入、堆叠注入的原理及注入过程

    目录 cookie注入 sqli-lasb-master less-21 方法一:用burpsuite进行抓包后修改 方法二:安装火狐的cookie manager等插件进行修改cookie 第一步: ...

  6. SQL注入之二次注入

    原理:用户向数据库里存入恶意的数据,在数据被插入到数据库之前,肯定会对数据库进行转义处理,但用户输入的数据的内容肯定是一点摸样也不会变的存进数据库里,而一般都默认为数据库里的信息都是安全的,查询的时候 ...

  7. SQL注入-二次注入和多语句注入

    二次注入 一.二次注入的定义 简单的说二次注入就是已经存储到数据库中的用户输入,在进行再一次读取的时候进去SQL查询语句中的注入. 二.二次注入的原理 第一步:插入恶意数据 第一次进行数据库插入数据的 ...

  8. B站小迪安全笔记第十七天-SQL注入之二次加解密,dns等注入

    加解密,二次,DNSlog 注入 注入原理,演示案例,实际应用(中转注入) DNSlog:解决了盲注不能回显数据,效率低的问题 http://127.0.0.1:8080/sqlilabs/less- ...

  9. 【PTE】SQL注入(二)

    七.盲注 盲注会用到上百条语句去一个字母一个字母猜,所以一般都会用自动化工具去跑,而不是手工注入 (一)布尔盲注(bool) 特点:无论参数是什么,只有两种:①正常显示,②啥也不显示 1.几个函数 s ...

最新文章

  1. 开源实时日志分析ELK
  2. 【Linux】eclipse juno 边框过大的调整方法
  3. KindEditor富文本编辑器, 从客户端中检测到有潜在危险的 Request.Form 值
  4. 简单的机器学习笔试题
  5. 手把手教你用原始方式上传项目至GitHub
  6. 谷歌修复安卓蓝牙组件中无需用户交互的 bug
  7. C++中数组、链表list、容器map/vector的区别
  8. Spark(Hive)对字符串数值的排序
  9. Whatsns_V6.03互亿无线短信插件安装说明
  10. 计算机病毒是指源程序还是特殊小程序,2015年9月计算机一级考试Msoffice上机模拟题(五)...
  11. 【Python】正则表达式判断是否存在连续N个字母
  12. 解锁黑科技!辅助驾驶系统为卡车安全行驶保驾护航
  13. C++游戏——小胎大乱斗
  14. linux环境下从路径字符串中截取目录和文件名信息
  15. gzip: stdin: not in gzip format / tar: Child returned status 1
  16. 当工厂走出“工厂”,直营店也不止于“店”
  17. 华为云计算机总裁,华为消费者业务 CEO余承东兼任华为云与计算 BG 总裁
  18. 招商银行为什么选用MySQL
  19. 『每周译Go』那些年我使用Go语言犯的错
  20. 对话任正非:华为是一家全球化公司

热门文章

  1. C++反汇编-函数调用原理
  2. 个人隐私保护法_浅学一下
  3. 留言管理系统的设计与实现
  4. 要闻:2016胡润百富榜昨天发布 宝能姚振华从炸油条到千亿身家“大黑马”
  5. 人工智能还是人工智障?我tm快崩溃了
  6. File类的基本方法实现
  7. Scrapy爬取图片并重命名总结
  8. uml具有多种视图_UML语言中五大视图
  9. 关于数字证书,数字签名,CA证书,Https都在这里了
  10. 浅谈移动端——前端适配详解